OkhttpClient GET POST请求 封装

POST 带参数 封装 外部返回数据

1. 封装

public class OkhttpMethod {
    /**
     * Post请求 异步
     * 使用 Callback 回调可返回子线程中获得的网络数据
     * @param url
     * @param params 参数
     */
    public static void httpPost(final String url, final Map<String,String> params, final Callback callback) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                OkHttpClient okHttpClient = new OkHttpClient();
                FormBody.Builder formBodyBuilder = new FormBody.Builder();
                Set<String> keySet = params.keySet();
                for(String key:keySet) {
                    String value = params.get(key);
                    formBodyBuilder.add(key,value);
                }
                FormBody formBody = formBodyBuilder.build();
                Request request = new Request
                        .Builder()
                        .post(formBody)
                        .url(url)
                        .build();
                //Response response = null;
                okHttpClient.newCall(request).enqueue(callback);
            }
        }).start();
    }
}

2. 使用

OkhttpMethod.httpPost(URL, map, new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                //异常
            }
            @Override
            public void onResponse(Call call, Response response) throws IOException {
                //此处为正常返回进行的操作
                responseData = response.body().string(); //提前定义全局变量 String类型
                //接下来可对获得的数据进行解析或其他处理
                
            }
        });

POST 不返回数据:

public static void httpPost2(final String url, final Map<String,String> params) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                OkHttpClient okHttpClient = new OkHttpClient();
                FormBody.Builder formBodyBuilder = new FormBody.Builder();
                Set<String> keySet = params.keySet();
                for(String key:keySet) {
                    String value = params.get(key);
                    formBodyBuilder.add(key,value);
                }
                FormBody formBody = formBodyBuilder.build();
                Request request = new Request
                        .Builder()
                        .post(formBody)
                        .url(url)
                        .build();
                Response response = null;
                try {
                    response = okHttpClient.newCall(request).execute();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }

POST  application/json 格式传递

参考:https://www.jianshu.com/p/1f432a7e8b5c

1. 封装

/**
     *POST 参数数据类型是application/json
     */
    public static final MediaType JSON = MediaType.parse("application/json; charset=utf-8");
    public final static int CONNECT_TIMEOUT = 60;
    public final static int READ_TIMEOUT = 100;
    public final static int WRITE_TIMEOUT = 60;
    public static final OkHttpClient client = new OkHttpClient.Builder()
            .readTimeout(READ_TIMEOUT, TimeUnit.SECONDS)//设置读取超时时间
            .writeTimeout(WRITE_TIMEOUT, TimeUnit.SECONDS)//设置写的超时时间
            .connectTimeout(CONNECT_TIMEOUT, TimeUnit.SECONDS)//设置连接超时时间
            .build();

    public static String post(String url, String json) throws IOException {
        RequestBody body = RequestBody.create(JSON, json);
        Request request = new Request.Builder()
                .url(url)
                .addHeader("token", Constants.token)
                .post(body)
                .build();
        Response response = client.newCall(request).execute();
        if (response.isSuccessful()) {
            return response.body().string();
        } else {
            throw new IOException("Unexpected code " + response);
        }
    }

2. 使用

new Thread() {
               @Override
               public void run() {
                   try {
                       String callStr = OkhttpMethod.post("json形式的string");
                       //解析
                       AddCartResultVo cartResultVo = JSON.parseObject(callStr, AddCartResultVo.class);
                       if (cartResultVo.getCode()==0){
//                           在子线程中调用ui线程
                           runOnUiThread(new Runnable() {
                               @Override
                               public void run() {
                                   Toast.makeText(ScenicOrderActivity.this, "成功!", Toast.LENGTH_SHORT).show();
                                   finish();
                               }
                           });
                       }
                   } catch (IOException e) {
                       e.printStackTrace();
                   }
               }
           }.start();

如果POST请求同时需要传递query和body,如下图

      

可将Query请求放在url中,(?key=value&key=value)

 

GET 不带参数:

1. 封装


public static void httpGet(final String url, final Callback callback) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                OkHttpClient okHttpClient = new OkHttpClient();
                Request request = new Request.Builder().url(url).addHeader("token",Constants.token).build(); //添加头部信息
                okHttpClient.newCall(request).enqueue(callback);
            }
        }).start();
    }

2. 使用 

            这样即可把从子线程中获得的数据在主线程进行操作

OkhttpMethod.httpGet(URL, new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {

            }
            @Override
            public void onResponse(Call call, Response response) throws IOException {
                responseData = response.body().string();  //得到返回的数据
                jsonJXdata(responseData);  //解析
            }
        });

GET 带参数直接加在URL后面即可

如:url="http://xxxxxx"   带上参数变为 url="http://xxxxxxxxx?key=value"

                                      带多个参数即  url="http://xxxxxxxxx?key1=value1&key2=value2"

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值