Android中使用OkHttp的五种请求方式及注意事项

Stella981
• 阅读 1288

文章目录

  • 一、环境说明
      • 1、在gradle中引入依赖
      • 2、AndroidManifest中开启网络权限
      • 3、搭建测试接口
      • 4、编写OkHttp工具类
  • 二、发送请求
      • 1.发送无参的Get请求
      • 2.发送有参的Get请求
      • 3.发送无参Post请求
      • 4.发送有参Pos请求
      • 5.发送Post 的Json数据

一、环境说明

1、在gradle中引入依赖

    implementation 'com.squareup.okhttp3:okhttp:3.12.1'
    debugImplementation 'com.squareup.okhttp3:logging-interceptor:3.12.1'

2、AndroidManifest中开启网络权限

<uses-permission android:name="android.permission.INTERNET"/>

注意:

在android9.0以后,Android默认禁止使用Http协议,必须使用Https协议,否则会报错误。

Android中使用OkHttp的五种请求方式及注意事项

所以要使用Http协议的请求必须在AndroidManifest中添加属性,android:usesCleartextTraffic=“true”

3、搭建测试接口

package com.icodingzy.androidback.controller;

import com.icodingzy.androidback.pojo.User;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("user")
public class UserController {
   
   
    /**
     * GET NoParameter
     * @return
     */
    @GetMapping("getUser")
    public Object getUser() {
   
   
        User user = new User();
        user.setId((int) (Math.random()*100));
        user.setName("熊顺");
        user.setStudentId("201815110110" + (int) (Math.random()*100));
        user.setSex("男");
        user.setData("Not have Parameter!");
        return user;
    }

    /**
     * GET TakeParameter
     * @param id userId
     * @return
     */
    @GetMapping("getParamUser")
    public Object getParamUser(Integer id){
   
   
        User user = new User();
        user.setId(id);
        user.setName("熊顺");
        user.setStudentId("201815110110" + (int) (Math.random()*100));
        user.setSex("男");
        user.setData("parameter is " + id);
        return user;
    }
    /**
     * Post NoParameter
     * @return
     */
    @PostMapping("postNoParamUser")
    public Object postNoParamUser(){
   
   
        User user = new User();
        user.setId((int) (Math.random()*100));
        user.setName("熊顺");
        user.setStudentId("201815110110" + (int) (Math.random()*100));
        user.setSex("男");
        user.setData("Not have parameter");
        return user;
    }
    /**
     * Post TakeParameter
     * @param id userId
     * @return
     */
    @PostMapping("postParamUser")
    public Object postParamUser(Integer id){
   
   
        User user = new User();
        user.setId(id);
        user.setName("熊顺");
        user.setStudentId("201815110110" + (int) (Math.random()*100));
        user.setSex("男");
        user.setData("parameter is " + id);
        return user;
    }
    /**
     * Post ObjectParameter
     * @return
     */
    @PostMapping("postObjectParamUser")
    public Object postObjectParamUser(@RequestBody User user){
   
   
        return user;
    }
}

接口文档

说明

请求方式

请求参数

请求地址

GET 方式,无参数

GET

/user/getUser

GET方式,Int参数

GET

Int(id)

/user/getParamUser

Post方式,无参数

POST

/user/postNoParamUser

Post方式,有参数

POST

Int(id)

/user/postParamUser

Post方式,Json化参数

POST

Object(id,name,sex,studentId,sex,data)

/user/postObjectParamUser

4、编写OkHttp工具类

package com.zhuoyue.travelwh.OkHttpUtil;


import android.app.ProgressDialog;
import android.content.Context;
import android.util.Log;


import com.zhuoyue.travelwh.bean.MsgBean;

import org.greenrobot.eventbus.EventBus;

import java.io.IOException;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;

public class OkHttpUtil {
   
   
    public static ProgressDialog dialog;

    /**
     * 发送网络请求
     * @param url 请求Url
     * @param context 上下文对象
     * @param body 请求体,如果有请求体则发送Post请求,反之发送Get请求
     */
    public static void getHttpRequset(String url, Context context, RequestBody body) {
   
   
        startDialog(context);
        OkHttpClient client = new OkHttpClient();

        Request request = null;
        
            //Post请求
        if (body != null) {
   
   
            request = new Request.Builder()
                    .url(url)
                    .post(body)
                    .build();
        } else {
   
   
        //Get请求
            request = new Request.Builder()
                    .url(url)
                    .get()
                    .build();
        }

        client.newCall(request).enqueue(new Callback() {
   
   
            /*请求失败时的回调*/
            @Override
            public void onFailure(Call call, IOException e) {
   
   
                stopDialog();
                Log.e("onFailure: ", e.getMessage());
            }
            /*请求成功时的回调*/
            @Override
            public void onResponse(Call call, Response response) throws IOException {
   
   
                stopDialog();
                Log.e("ApiData:", response.body().string());
            }
        });
    }

    /**
     * 显示等待框
     * @param context
     */
    public static void startDialog(Context context) {
   
   
        dialog = new ProgressDialog(context);
        dialog.setMessage("数据加载。。。");
        dialog.setTitle("请稍后");
        dialog.setCanceledOnTouchOutside(false);
        dialog.show();
    }

    /**
     * 关闭等待框
     */
    public static void stopDialog() {
   
   
        if (dialog != null) {
   
   

            dialog.dismiss();
        }
    }
}

二、发送请求

1.发送无参的Get请求

在自己的业务中使用工具类发送网络请求

    //无参接口
   private final String url = "http://xxxxxx/user/getParamUser";
      @Override
    protected void onCreate(Bundle savedInstanceState) {
   
   
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        OkHttpUtil.getHttpRequset(url,this,null);
    }

打印结果如下
E/ApiData:: {“id”:82,“name”:“熊顺”,“studentId”:“20181511011066”,“sex”:“男”,“data”:“Not have Parameter!”}

Android中使用OkHttp的五种请求方式及注意事项

2.发送有参的Get请求

OkHttp发送Get请求时,请求参数全部放在url中

//有参Get接口
   private final String url = "http://xxxxxx/user/getParamUser";
      @Override
    protected void onCreate(Bundle savedInstanceState) {
   
   
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        OkHttpUtil.getHttpRequset(url + "?id=9999",this,null);
    }

Android中使用OkHttp的五种请求方式及注意事项

3.发送无参Post请求

发送Post请求时必需要带上请求体

//无参Post接口
   private final String url = "http://xxxxxx/user/postNoParamUser";
      @Override
    protected void onCreate(Bundle savedInstanceState) {
   
   
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        RequestBody body = new FormBody.Builder()
                        .build();
                OkHttpUtil.getHttpRequset(url, this, body);
    }

Android中使用OkHttp的五种请求方式及注意事项

4.发送有参Pos请求

add中固定为String类型

//有参Post接口
   private final String url = "http://xxxxxx/user/postParamUser";
      @Override
    protected void onCreate(Bundle savedInstanceState) {
   
   
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        RequestBody body = new FormBody.Builder()
                        .add("id","8888")
                        .build();
                OkHttpUtil.getHttpRequset(url, this, body);
    }

Android中使用OkHttp的五种请求方式及注意事项

5.发送Post 的Json数据

发送Json数据需要借助JSONObject,把数据转换成Json格式

//Json化参数Post接口
   private final String url = "http://xxxxxx/user/postObjectParamUser";
      @Override
    protected void onCreate(Bundle savedInstanceState) {
   
   
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        JSONObject jsonObject = new JSONObject();
                try {
   
   
                    jsonObject.put("id",1111111);
                    jsonObject.put("name","顺");
                    jsonObject.put("studentId","123123");
                    jsonObject.put("sex","小萌新");
                    jsonObject.put("data","I have pan");
                } catch (JSONException e) {
   
   
                    e.printStackTrace();
                }
                RequestBody body = FormBody.create(MediaType.parse("application/json;charset=utf-8"), jsonObject.toString());

                OkHttpUtil.getHttpRequset(url, this, body);
    }

Android中使用OkHttp的五种请求方式及注意事项

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
2年前
java将前端的json数组字符串转换为列表
记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
希望的天 希望的天
2年前
Retrofit封装Okhttp逻辑原理
总结自retrofit封装了Okhttp本身并不能进行网络请求。只能在Android使用的网络请求框架。1.png2.pngrequest:统一完成(post/get/...)回调陷阱:完成上一步网络请求才能进行下一步网络请求。3.pngRetrofit简化了网络请求。优化了网络请求的使用。4.png5.png7.pngbuild设计模式:参数》5个;
Souleigh ✨ Souleigh ✨
2年前
前端性能优化 - 雅虎军规
无论是在工作中,还是在面试中,web前端性能的优化都是很重要的,那么我们进行优化需要从哪些方面入手呢?可以遵循雅虎的前端优化35条军规,这样对于优化有一个比较清晰的方向.35条军规1.尽量减少HTTP请求个数——须权衡2.使用CDN(内容分发网络)3.为文件头指定Expires或CacheControl,使内容具有缓存性。4.避免空的
Stella981 Stella981
2年前
Android+Spring Boot 选择+上传+下载文件
2021.02.03更新1概述前端Android,上传与下载文件,使用OkHttp处理请求,后端使用SpringBoot,处理Android发送来的上传与下载请求。这个其实不难,就是特别多奇奇怪怪的坑,因此,就一句话,希望各位读者能少走弯路。2环境Win10
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Json格式Java封装天猫商品详情数据接口,实现海量商品采集业务
根据天猫的API文档,获取天猫商品详情的API是通过发送Http/Post/GET请求,其中itemID是具体的商品ID。以下是Python和Java封装获取天猫商品详情API(复制Taobaoapi2014)的示例代码:1.请求方式:HTTPPOSTGE
Python进阶者 Python进阶者
2个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这