官方文档: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();
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是一种有效的解决方案,它简化了网络调用的复杂性,同时利用了OkHttp3的高性能特性。通过定义接口、配置Retrofit实例、创建SOAP请求和处理响应,...
OKHttp3不仅支持GET和POST请求,还提供了丰富的API来处理复杂的网络操作。 ### GET请求 GET请求是最常见的HTTP方法,用于从服务器获取资源。在OKHttp3中,发起GET请求非常简单: ```java OkHttpClient client = ...
总结起来,Android中使用OkHttp进行网络请求能带来高效的网络性能和简单易用的API。通过理解并掌握OkHttp的使用,开发者可以更好地优化应用的网络操作,提升用户体验。在实际项目中,可以根据需求选择合适的网络库,...
1. **同步与异步请求**:`execute()`方法用于同步请求,返回一个`Response`对象;`enqueue()`方法用于异步请求,提供了一个回调接口来处理响应。 2. **自定义拦截器**:OKHttp允许添加自定义拦截器,可以用来修改...
使用OkHttpClient的newCall()方法创建一个Call对象,然后调用execute()执行同步请求或enqueue()执行异步请求。以下是一个同步请求的例子: ```java try (Response response = client.newCall(request).execute()) { ...
这部分可能包含OkHttp3框架的所有核心组件和依赖,包括OkHttpClient(主要的HTTP客户端接口)、OkHttpURLConnection(用于替代标准的HttpURLConnection)、Interceptor(拦截器,允许自定义请求和响应处理)、Call...
在Android开发中,网络请求是应用必不可少的一部分。...总结起来,OkHttp3作为一个强大的网络库,它的特点是速度快、稳定性好、易用性强。通过简单封装,我们可以快速地在项目中进行网络请求,提高开发效率。
同步请求会阻塞当前线程,直到请求完成。这种方式适用于不关心请求是否在主线程中执行,或者在后台线程执行的情况。以下是一个简单的示例: ```java OkHttpClient client = new OkHttpClient(); String url = ...
4. 对于同步请求,调用`execute()`方法获取`Response`;对于异步请求,使用`enqueue()`方法并提供回调。 现在,我们来看看如何在Android项目中引入`OKHttp`。首先,在`build.gradle`文件中添加依赖: ```groovy ...
2. **发起调用**:通过`OkHttpClient`的`newCall(Request request)`方法创建一个`Call`对象,然后调用`enqueue`或`execute`发起异步或同步请求。 3. **调度请求**:OkHttp内部的调度器会负责选择合适的连接进行请求...
3. 使用 OkHttpClient 发送同步或异步请求。 4. 处理响应,包括响应码、响应头、响应体等。 ### 示例代码: ```java OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder() .url...
4. **同步请求**:同步请求则通过Call的execute方法实现,适合在工作线程中执行,获取返回的Response对象。 5. **拦截器**:OkHttp允许自定义拦截器,可以在请求发送前和响应接收后进行处理,例如添加请求头、日志...
同步请求阻塞当前线程,直到响应返回。在主线程中使用需谨慎,以免造成应用无响应。以下是一个简单的GET请求示例: ```java Request request = new Request.Builder() .url("https://example.com") .build(); ...
对于同步请求,可以调用Call的execute()方法,但需要注意不能在主线程中执行,因为网络操作会阻塞UI: ```java public Response syncRequest(String url) throws IOException { Call call = getCall(url); return...
4. **更友好的 API 设计**:OkHttp3 的 API 更加简洁和直观,例如使用 Call 对象来代表一个请求,以及使用 enqueue() 和 execute() 方法来发起异步或同步请求。 5. **更好的错误处理**:OkHttp3 提供了更清晰的异常...
5. **异步请求**:除了同步接口,OkHttp还提供了异步API,允许开发者在后台线程中执行网络请求,不阻塞UI。 接下来,我们关注Okio 1.11.0。这个库的主要目标是提高I/O操作的效率: 1. **缓冲区**:Okio使用了缓冲...
本示例主要展示了如何在Android应用中使用OkHttp进行网络请求,通过一系列详细简单的测试代码,帮助开发者快速理解和应用。** 1. **OkHttp的安装与配置** - 首先,在`build.gradle`文件中添加OkHttp的依赖库。通常...
3. **同步请求**:同时提供了同步请求接口,方便在非UI线程中执行网络操作。 4. **参数设置**:可以方便地设置URL参数、请求头、超时时间、重试策略等。 5. **缓存机制**:继承了`OkHttp3`的缓存机制,自动处理...
3. **OkHttp的异步请求与同步请求** - **异步请求**:通过enqueue方法发送请求,回调函数会在后台线程执行,不会阻塞UI线程。 - **同步请求**:使用execute方法发送请求,该方法会阻塞调用线程直到请求完成,...
- 同步请求(阻塞): ```java Response response = client.newCall(request).execute(); ``` - 异步请求(回调): ```java client.newCall(request).enqueue(new Callback() { @Override public void ...