当前位置: 首页 > 编程笔记 >

Android OkHttp基本使用详解

茅才
2023-03-14
本文向大家介绍Android OkHttp基本使用详解,包括了Android OkHttp基本使用详解的使用技巧和注意事项,需要的朋友参考一下

Android系统提供了两种HTTP通信类,HttpURLConnection和HttpClient。

尽管Google在大部分安卓版本中推荐使用HttpURLConnection,但是这个类相比HttpClient实在是太难用,太弱爆了。

OkHttp是一个相对成熟的解决方案,据说Android4.4的源码中可以看到HttpURLConnection已经替换成OkHttp实现了。所以我们更有理由相信OkHttp的强大。

使用范围

OkHttp支持Android 2.3及其以上版本。
对于Java, JDK1.7以上。

基本使用

HTTP GET

OkHttpClient client = new OkHttpClient();

String run(String url) throws IOException {
  Request request = new Request.Builder().url(url).build();
  Response response = client.newCall(request).execute();
  if (response.isSuccessful()) {
    return response.body().string();
  } else {
    throw new IOException("Unexpected code " + response);
  }
}

Request是OkHttp中访问的请求,Builder是辅助类。Response即OkHttp中的响应。

Response类:

public boolean isSuccessful()
Returns true if the code is in [200..300), which means the request was successfully received, understood, and accepted.

response.body()返回ResponseBody类

可以方便的获取string

public final String string() throws IOException
Returns the response as a string decoded with the charset of the Content-Type header. If that header is either absent or lacks a charset, this will attempt to decode the response body as UTF-8.
Throws:
IOException

当然也能获取到流的形式:

public final InputStream byteStream()

HTTP POST

POST提交Json数据

public static final MediaType JSON = MediaType.parse("application/json; charset=utf-8");
OkHttpClient client = new OkHttpClient();
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();
  f (response.isSuccessful()) {
    return response.body().string();
  } else {
    throw new IOException("Unexpected code " + response);
  }
}

使用Request的post方法来提交请求体RequestBody

POST提交键值对

很多时候我们会需要通过POST方式把键值对数据传送到服务器。 OkHttp提供了很方便的方式来做这件事情。

OkHttpClient client = new OkHttpClient();
String post(String url, String json) throws IOException {

  RequestBody formBody = new FormEncodingBuilder()
  .add("platform", "android")
  .add("name", "bug")
  .add("subject", "XXXXXXXXXXXXXXX")
  .build();

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

  Response response = client.newCall(request).execute();
  if (response.isSuccessful()) {
    return response.body().string();
  } else {
    throw new IOException("Unexpected code " + response);
  }
}


注意:

  • OkHttp官方文档并不建议我们创建多个OkHttpClient,因此全局使用一个。 如果有需要,可以使用clone方法,再进行自定义。这点在后面的高级教程里会提到。
  • enqueue为OkHttp提供的异步方法,入门教程中并没有提到,后面的高级教程里会有解释。
import java.io.IOException;
import java.util.List;
import java.util.concurrent.TimeUnit;
import org.apache.http.client.utils.URLEncodedUtils;
import org.apache.http.message.BasicNameValuePair;
import cn.wiz.sdk.constant.WizConstant;
import com.squareup.okhttp.Callback;
import com.squareup.okhttp.OkHttpClient;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.Response; 
 
public class OkHttpUtil {
  private static final OkHttpClient mOkHttpClient = new OkHttpClient();
  static{
    mOkHttpClient.setConnectTimeout(30, TimeUnit.SECONDS);
  }
  /**
   * 该不会开启异步线程。
   * @param request
   * @return
   * @throws IOException
   */
  public static Response execute(Request request) throws IOException{
    return mOkHttpClient.newCall(request).execute();
  }
  /**
   * 开启异步线程访问网络
   * @param request
   * @param responseCallback
   */
  public static void enqueue(Request request, Callback responseCallback){
    mOkHttpClient.newCall(request).enqueue(responseCallback);
  }
  /**
   * 开启异步线程访问网络, 且不在意返回结果(实现空callback)
   * @param request
   */
  public static void enqueue(Request request){
    mOkHttpClient.newCall(request).enqueue(new Callback() {
      
      @Override
      public void onResponse(Response arg0) throws IOException {
        
      }
      
      @Override
      public void onFailure(Request arg0, IOException arg1) {
        
      }
    });
  }
  public static String getStringFromServer(String url) throws IOException{
    Request request = new Request.Builder().url(url).build();
    Response response = execute(request);
    if (response.isSuccessful()) {
      String responseUrl = response.body().string();
      return responseUrl;
    } else {
      throw new IOException("Unexpected code " + response);
    }
  }
  private static final String CHARSET_NAME = "UTF-8";
  /**
   * 这里使用了HttpClinet的API。只是为了方便
   * @param params
   * @return
   */
  public static String formatParams(List<BasicNameValuePair> params){
    return URLEncodedUtils.format(params, CHARSET_NAME);
  }
  /**
   * 为HttpGet 的 url 方便的添加多个name value 参数。
   * @param url
   * @param params
   * @return
   */
  public static String attachHttpGetParams(String url, List<BasicNameValuePair> params){
    return url + "?" + formatParams(params);
  }
  /**
   * 为HttpGet 的 url 方便的添加1个name value 参数。
   * @param url
   * @param name
   * @param value
   * @return
   */
  public static String attachHttpGetParam(String url, String name, String value){
    return url + "?" + name + "=" + value;
  }
}

总结

通过上面的例子我们可以发现,OkHttp在很多时候使用都是很方便的,而且很多代码也有重复,因此特地整理了下面的工具类。

 类似资料:
  • 本文向大家介绍详解vue-router基本使用,包括了详解vue-router基本使用的使用技巧和注意事项,需要的朋友参考一下 路由,其实就是指向的意思,当我点击页面上的home  按钮时,页面中就要显示home的内容,如果点击页面上的about 按钮,页面中就要显示about 的内容。Home按钮  => home 内容, about按钮 => about 内容,也可以说是一种映射。 所以在页面

  • 本文向大家介绍Vagrant基本命令使用详解,包括了Vagrant基本命令使用详解的使用技巧和注意事项,需要的朋友参考一下 Vagrant基本命令详解,具体如下: 1、检查当前的版本 2、列出所有的box 3、添加一个box 1)box名简写 Vagrant可以从这里https://atlas.hashicorp.com/boxes/search 下载各种Vagrant映像文件。 2)通过指定的U

  • 本文向大家介绍PyTorch安装与基本使用详解,包括了PyTorch安装与基本使用详解的使用技巧和注意事项,需要的朋友参考一下 什么要学习PyTorch? 有的人总是选择,选择的人最多的框架,来作为自己的初学框架,比如Tensorflow,但是大多论文的实现都是基于PyTorch的,如果我们要深入论文的细节,就必须选择学习入门PyTorch 安装PyTorch 一行命令即可 官网 时间较久,耐心等

  • 本文向大家介绍Java JDBC基本使用方法详解,包括了Java JDBC基本使用方法详解的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Java JDBC基本使用方法。分享给大家供大家参考,具体如下: 什么是JDBC JDBC的使用 事务 连接池 DbUtils 首发日期:2018-05-27 修改: 2018-07-19:增加了事务、连接池、DBUtils 2018-07-27:对特别

  • 本文向大家介绍详解git的基本使用方法,包括了详解git的基本使用方法的使用技巧和注意事项,需要的朋友参考一下 什么是git? git是目前世界上最先进的分布式版本控制系统。 git与SVN的最主要区别? SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而工作的时候用的都是自己的电脑,所以开始工作之前需要从中央服务器那里获取最新的版本,然后开始工作,工作完后,需要把自己所做的工作推送到中

  • 本文向大家介绍Android中layer-list基本使用详解,包括了Android中layer-list基本使用详解的使用技巧和注意事项,需要的朋友参考一下 使用layer-list可以将多个drawable按照顺序层叠在一起显示,默认情况下,所有的item中的drawable都会自动根据它附上view的大小而进行缩放, layer-list中的item是按照顺序从下往上叠加的,即先定义的ite