okhttp的介绍以及如何发送同步/异步的http请求

okhttp的概念

OkHttp是由Square公司开发的,除了OkHttp 之外,还开发了 Picasso、Retrofit等著名的开源项目,现在已经成了广大Android开发者首选的网络通信库。OkHttp地址是:https://github.com/square/okhttp。

一般在Java平台上,我们会使用Apache HttpClient作为Http客户端,用于发送 HTTP 请求,并对响应进行处理。比如可以使用http客户端与第三方服务(如SSO服务)进行集成,当然还可以爬取网上的数据等。OKHttp与HttpClient类似,也是一个Http客户端,提供了对 HTTP/2 和 SPDY 的支持,并提供了连接池,GZIP 压缩和 HTTP 响应缓存功能;

HTTP是现代网络应用程序的方式。 这是我们如何与媒体交换数据。 做HTTP有效地使你的东西加载更快,节省带宽。
OkHttp默认是一个有效的HTTP客户端:
HTTP / 2支持允许所有请求相同的主机共享一个套接字。
连接池可以减少请求延迟(如果HTTP / 2不可使用)。
透明的GZIP收缩下载大小。
响应缓存避免了网络完全重复请求。
OkHttp坚守网络时麻烦:它会悄然从常见的连接问题中恢复过来。 如果你的服务有多个IP地址OkHttp将尝试备用地址如果第一个连接失败。 这是必要的I Pv4 + IPv6和服务驻留在冗余的数据中心。 与现代TLS OkHttp发起新连接特性(SNI ALPN),并落回TLS 1.0如果握手失败。
使用OkHttp很容易。 它的请求/响应API设计流畅建筑商和不变性。 它同时支持同步阻塞调用和异步调用回调。
OkHttp支持安卓2.3及以上。 对于Java,最低要求是1.7。

请求思路

使用okhttp能够轻松调用其他第三方接口,思路如下

  1. 创建okHttpClient对象
  2. 创建Request对象
  3. 把请求封装成任务,得到Call对象
  4. 以同步或异步的方法去执行请求。
    4.1 异步请求:call.enqueue(new Callback() {。。。}),将call加入调度队列,任务执行完成,在CallBack中得到回调。
    4.2 同步请求:call.execute().body().string();得到返回结果

同步请求

get请求

    @Test
    public void testGet() throws IOException {
        OkHttpClient okHttpClient = new OkHttpClient();
        Request request = new Request.Builder()
                .url("http:www.baidu.com")
                .build();
        Response response = okHttpClient.newCall(request).execute();//同步请求

        String result = response.body().string();
        System.out.println(result);
    }

post请求

方式1:表单提交(FromBody)

    @Test
    public void testPost() throws IOException {
        OkHttpClient okHttpClient = new OkHttpClient();
        RequestBody body = new FormBody.Builder()
                .add("param1","111")
                .add("param2","222")
                .build();
        Request request = new Request.Builder()
                .url("https://www.XXX.com/api/get")
                .post(body)
                .build();
        Response response = okHttpClient.newCall(request).execute();//同步请求
        String result = response.body().string();
        System.out.println(result);
    }

多参数写法:

		FormBody.Builder builder = new FormBody.Builder();
        for (String key : paramsMap.keySet()) {
            builder.add(key, paramsMap.get(key));//追加表单信息
        }
        FormBody body = builder.build();

方式2:json数据提交(RequestBody)

    String post(String url, String json) throws IOException {
        RequestBody body = RequestBody.create(JSON,json);
        Request request = new Request.Builder()
                .url(url)
                .post(body)
                .build();
        Response response = client.newCall(request).execute()
        return response.body().string();
    }

异步请求

异步请求和同步请求在调用API的区别就是:发送请求那一块,同步请求是Response response = client.newCall(request).execute();,而异步请求是:client.newCall(request).enqueue(new Callback());

get请求

		OkHttpClient client = new OkHttpClient();
        Request request = new Request.Builder()
                .url("www.baidu.com")
                .build();
        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {

            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                String responseData = response.body().string();
                setUI(responseData);
            }
        });

post请求

		OkHttpClient client = new OkHttpClient();
		RequestBody requestBody = new FormBody.Builder()
                .add("", "")
                .build();
        Request request = new Request.Builder()
                .url("www.baidu.com")
                .post(requestBody)
                .build();
		client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {

            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                String responseData = response.body().string();
                System.out.println(responseData);
            }
        });

同步请求、异步请求区别

用简单通俗一点的语言说一下:

同步请求:同步请求是发送请求后,只能等服务器处理完这个请求,才能去干别的

异步请求:异步请求是发送请求后,服务器会在一边处理请求,中途可以去干别的

优劣:异步请求的优势很明显,所以开发中能用异步请求就用异步请求

你可能感兴趣的:(Java,okhttp)