`
xuanzhui
  • 浏览: 200590 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

okhttp3同步请求使用总结

阅读更多

官方文档:https://github.com/square/okhttp/wiki/Recipes

https://github.com/square/okhttp

 

以下只考虑小数据量请求,比如请求rest json API

 

 

相关注意点

1. okhttp3比较多的地方使用了builder模式,OkHttpClient、Request、FormBody等都可以通过<Class>.Builder()获取相应的Builder,进而进行相关的配置。

 

2. ResponseBody用完了要及时关闭

Each response body is backed by a limited resource like a socket (live network responses) or an open file (for cached responses). Failing to close the response body will leak these resources and may ultimately cause the application to slow down or crash. Close the response body by calling either close()byteStream().close(), or reader().close(). The bytes() and string() methods both close the response body automatically.

 

 

相关请求代码

首先创建一个自定义的Response(这个个人喜好)

public static class Response {
    public Integer code;
    public String content;
}

 

 

Get请求

/**
 * http get 请求
 * @param url   请求uri
 * @return      Response请求结果实例,通过response.code==200判断是否有效
 */
public static Response httpGet(String url) {

    Response response = new Response();

    OkHttpClient client = new OkHttpClient();

    Request request = new Request.Builder()
            .url(url)
            .build();

    proceedRequest(client, request, response);

    return response;
}

 

 

此处的通用处理请求函数

private static void proceedRequest(OkHttpClient client, Request request, Response response) {
    try {
        okhttp3.Response temp = client.newCall(request).execute();
        response.code = temp.code();
        ResponseBody body = temp.body();
        if (temp.isSuccessful()) {
            //call string auto close body
            response.content = body.string();
        } else {
            response.content = "网络请求失败";
            temp.body().close();
        }
    } catch (IOException e) {
        e.printStackTrace();
        Log.w(TAG, e.getMessage() == null ? " " : e.getMessage());
        response.code = -1;
        response.content = e.getMessage();
    }
}

 

 

Post Json字符串请求

/**
 * http post 请求
 * @param url       请求url
 * @param jsonStr    post参数
 * @return          Response请求结果实例,通过response.code==200判断
 */
public static Response httpPost(String url, String jsonStr) {
    Response response = new Response();

    MediaType JSON = MediaType.parse("application/json; charset=utf-8");
    OkHttpClient client = new OkHttpClient();

    RequestBody body = RequestBody.create(JSON, jsonStr);
    Request request = new Request.Builder()
            .url(url)
            .post(body)
            .build();

    proceedRequest(client, request, response);

    return response;
}

 

 

Post Form请求

/**
 * http post 请求
 * @param url       请求url
 * @param para      post参数,表单键值对
 * @return          HttpResponse请求结果实例
 */
public static Response httpPostForm(String url, Map<String, String> para) {
    if (para == null || para.size() == 0)
        return null;

    Response response = new Response();

    OkHttpClient client = new OkHttpClient();

    FormBody.Builder builder = new FormBody.Builder();

    for (Map.Entry<String, String> entry : para.entrySet()) {
        builder.add(entry.getKey(), entry.getValue());
    }

    RequestBody formBody = builder.build();

    Request request = new Request.Builder()
            .url(url)
            .post(formBody)
            .build();

    proceedRequest(client, request, response);

    return response;
}

 

 

Put Json字符串请求

和post非常类似

/**
 * http put 请求
 * @param url       请求url
 * @param jsonStr    post参数
 * @return          Response请求结果实例,通过response.code==200判断
 */
public static Response httpPut(String url, String jsonStr) {
    Response response = new Response();

    MediaType JSON = MediaType.parse("application/json; charset=utf-8");
    OkHttpClient client = new OkHttpClient();

    RequestBody body = RequestBody.create(JSON, jsonStr);
    Request request = new Request.Builder()
            .url(url)
            .put(body)
            .build();

    proceedRequest(client, request, response);

    return response;
}

 

 

如果Request中需要携带自定义的header信息

Request request = new Request.Builder()
        .url(getPayPalAccessTokenUrl())
        .header("Accept", "application/json")
        .header("Content-Type", "application/x-www-form-urlencoded")
        .header("Authorization", "some secret token")
        .post(body)
        .build();

 

 

如果需要添加自定义的SSL规则

1) 自定义SSL类,比如强制使用TLSv1.2协议

/**
 * XZTLSSocketFactory.java
 * 
 * Created by xuanzhui on 2016/3/18.
 * Copyright (c) 2016 xuanzhui. All rights reserved.
 */
package cn.beecloud;

import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;

import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;

public class XZTLSSocketFactory extends SSLSocketFactory {

    private SSLSocketFactory delegate;

    public XZTLSSocketFactory() throws KeyManagementException, NoSuchAlgorithmException {
        SSLContext context = SSLContext.getInstance("TLSv1.2");
        context.init(null, null, null);
        delegate = context.getSocketFactory();
    }

    @Override
    public String[] getDefaultCipherSuites() {
        return delegate.getDefaultCipherSuites();
    }

    @Override
    public String[] getSupportedCipherSuites() {
        return delegate.getSupportedCipherSuites();
    }

    @Override
    public Socket createSocket(Socket s, String host, int port, boolean autoClose) throws IOException {
        return enableTLSOnSocket(delegate.createSocket(s, host, port, autoClose));
    }

    @Override
    public Socket createSocket(String host, int port) throws IOException {
        return enableTLSOnSocket(delegate.createSocket(host, port));
    }

    @Override
    public Socket createSocket(String host, int port, InetAddress localHost, int localPort) throws IOException, UnknownHostException {
        return enableTLSOnSocket(delegate.createSocket(host, port, localHost, localPort));
    }

    @Override
    public Socket createSocket(InetAddress host, int port) throws IOException {
        return enableTLSOnSocket(delegate.createSocket(host, port));
    }

    @Override
    public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort) throws IOException {
        return enableTLSOnSocket(delegate.createSocket(address, port, localAddress, localPort));
    }

    private Socket enableTLSOnSocket(Socket socket) {
        if(socket != null && (socket instanceof SSLSocket)) {
            ((SSLSocket)socket).setEnabledProtocols(new String[] {"TLSv1.2"});
        }
        return socket;
    }
}

 

2) 设置OkHttpClient

OkHttpClient client = new OkHttpClient.Builder()
						//定义连接超时
                    	.connectTimeout(connectTimeout, TimeUnit.MILLISECONDS)
                    	//自定义SSL协议
                    	.sslSocketFactory(new XZTLSSocketFactory()).build();

 

关于android SSL协议的支持列表

Client socket:

Protocol Supported (API Levels) Enabled by default (API Levels)
SSLv3 1+ 1+
TLSv1 1+ 1+
TLSv1.1 16+ 20+
TLSv1.2 16+ 20+


Server socket:

Protocol Supported (API Levels) Enabled by default (API Levels)
SSLv3 1+ 1+
TLSv1 1+ 1+
TLSv1.1 16+ 16+
TLSv1.2 16+ 16+

意味着API level 16+ (Android 4.1, Jelly Bean)是支持TLSv1.2的最低版本要求

ref Android 4.1+ enable TLS 1.1 and TLS 1.2

 

如果遇到错误

java.lang.IllegalStateException: Unable to extract the trust manager on okhttp3.internal.Platform

将成员变量SSLSocketFactory重名为delegate

ref https://github.com/square/okhttp/issues/2323

 

 

 

 

 

 

分享到:
评论

相关推荐

    Android 基于 Retrofit2+Okhttp3 通过SOAP协议请求WebService.zip

    总结,Android应用基于Retrofit2+Okhttp3通过SOAP协议请求WebService是一种有效的解决方案,它简化了网络调用的复杂性,同时利用了OkHttp3的高性能特性。通过定义接口、配置Retrofit实例、创建SOAP请求和处理响应,...

    08-01 OKHttp3的post和get请求

    OKHttp3不仅支持GET和POST请求,还提供了丰富的API来处理复杂的网络操作。 ### GET请求 GET请求是最常见的HTTP方法,用于从服务器获取资源。在OKHttp3中,发起GET请求非常简单: ```java OkHttpClient client = ...

    android使用okhttp进行网络请求

    总结起来,Android中使用OkHttp进行网络请求能带来高效的网络性能和简单易用的API。通过理解并掌握OkHttp的使用,开发者可以更好地优化应用的网络操作,提升用户体验。在实际项目中,可以根据需求选择合适的网络库,...

    OKHttp3 所有Jarb包

    1. **同步与异步请求**:`execute()`方法用于同步请求,返回一个`Response`对象;`enqueue()`方法用于异步请求,提供了一个回调接口来处理响应。 2. **自定义拦截器**:OKHttp允许添加自定义拦截器,可以用来修改...

    Android网络请求OkHttp的使用demo代码

    使用OkHttpClient的newCall()方法创建一个Call对象,然后调用execute()执行同步请求或enqueue()执行异步请求。以下是一个同步请求的例子: ```java try (Response response = client.newCall(request).execute()) { ...

    okhttp3所有Jar包_12.zip

    这部分可能包含OkHttp3框架的所有核心组件和依赖,包括OkHttpClient(主要的HTTP客户端接口)、OkHttpURLConnection(用于替代标准的HttpURLConnection)、Interceptor(拦截器,允许自定义请求和响应处理)、Call...

    简单封装使用OkHttp3

    在Android开发中,网络请求是应用必不可少的一部分。...总结起来,OkHttp3作为一个强大的网络库,它的特点是速度快、稳定性好、易用性强。通过简单封装,我们可以快速地在项目中进行网络请求,提高开发效率。

    java 中OkHttp的使用方法及实例

    同步请求会阻塞当前线程,直到请求完成。这种方式适用于不关心请求是否在主线程中执行,或者在后台线程执行的情况。以下是一个简单的示例: ```java OkHttpClient client = new OkHttpClient(); String url = ...

    HttpURLConnection OKHttp实现请求

    4. 对于同步请求,调用`execute()`方法获取`Response`;对于异步请求,使用`enqueue()`方法并提供回调。 现在,我们来看看如何在Android项目中引入`OKHttp`。首先,在`build.gradle`文件中添加依赖: ```groovy ...

    okhttp3源码运行

    2. **发起调用**:通过`OkHttpClient`的`newCall(Request request)`方法创建一个`Call`对象,然后调用`enqueue`或`execute`发起异步或同步请求。 3. **调度请求**:OkHttp内部的调度器会负责选择合适的连接进行请求...

    android okhttp网络请求框架

    3. 使用 OkHttpClient 发送同步或异步请求。 4. 处理响应,包括响应码、响应头、响应体等。 ### 示例代码: ```java OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder() .url...

    okhttp3工具类

    4. **同步请求**:同步请求则通过Call的execute方法实现,适合在工作线程中执行,获取返回的Response对象。 5. **拦截器**:OkHttp允许自定义拦截器,可以在请求发送前和响应接收后进行处理,例如添加请求头、日志...

    okhttp请求 干货小例子

    同步请求阻塞当前线程,直到响应返回。在主线程中使用需谨慎,以免造成应用无响应。以下是一个简单的GET请求示例: ```java Request request = new Request.Builder() .url("https://example.com") .build(); ...

    OKHttp网络请求超简单封装DEMO

    对于同步请求,可以调用Call的execute()方法,但需要注意不能在主线程中执行,因为网络操作会阻塞UI: ```java public Response syncRequest(String url) throws IOException { Call call = getCall(url); return...

    okhttp3 和 okhttp2 jar

    4. **更友好的 API 设计**:OkHttp3 的 API 更加简洁和直观,例如使用 Call 对象来代表一个请求,以及使用 enqueue() 和 execute() 方法来发起异步或同步请求。 5. **更好的错误处理**:OkHttp3 提供了更清晰的异常...

    okhttp3jar包及源码

    5. **异步请求**:除了同步接口,OkHttp还提供了异步API,允许开发者在后台线程中执行网络请求,不阻塞UI。 接下来,我们关注Okio 1.11.0。这个库的主要目标是提高I/O操作的效率: 1. **缓冲区**:Okio使用了缓冲...

    OkHttp使用案例

    本示例主要展示了如何在Android应用中使用OkHttp进行网络请求,通过一系列详细简单的测试代码,帮助开发者快速理解和应用。** 1. **OkHttp的安装与配置** - 首先,在`build.gradle`文件中添加OkHttp的依赖库。通常...

    Android-Android-YzHttp基于OkHttp3的HTTP请求框架

    3. **同步请求**:同时提供了同步请求接口,方便在非UI线程中执行网络操作。 4. **参数设置**:可以方便地设置URL参数、请求头、超时时间、重试策略等。 5. **缓存机制**:继承了`OkHttp3`的缓存机制,自动处理...

    OkHttp库以及使用demo

    3. **OkHttp的异步请求与同步请求** - **异步请求**:通过enqueue方法发送请求,回调函数会在后台线程执行,不会阻塞UI线程。 - **同步请求**:使用execute方法发送请求,该方法会阻塞调用线程直到请求完成,...

    okhttp3使用demo

    - 同步请求(阻塞): ```java Response response = client.newCall(request).execute(); ``` - 异步请求(回调): ```java client.newCall(request).enqueue(new Callback() { @Override public void ...

Global site tag (gtag.js) - Google Analytics