从api接口获取数据-okhttp

首先先介绍下api接口:

API:应用程序接口(API:Application Program Interface)

通常用于数据连接,调用函数提供功能等等。。。

 

从api接口获取数据有四种方式:HttpClient、HttpURLConnection、OKHttp 和 Volley。

之前项目中用到了OKHttp3,项目做好了,但这方面知识还没完全掌握,写篇随笔争取理解多一些 = =

 

OkHttp 是一个现代、快速、高效的 Http client,支持 Http/2 以及 SPDY,扮演着传输层的角色,

OkHttp 使用 Okio 来打打简化数据的访问与存储,Okio是一个增强 java.io 和 java.nio 的库。。。。and so on

 

OkHttp 的基本用法(现在OkHttp3是比较新的版本,通常用这个多一些):

 

首先导入jar包,没有jar包的同学可以进入下面链接搜索下载

https://mvnrepository.com/

 

然后在pom.xml进行配置(version 要对上,和你引入的okhttp jar包版本一致)

下面是从网上偷的代码:https://www.jianshu.com/p/1873287eed87

 如果是Get请求:

 1 String url = "https://www.baidu.com";
 2 OkHttpClient okHttpClient = new OkHttpClient();
 3 Request request = new Request.Builder()
 4            .url(url);
 5            .build();
 6 Call call = okHttpClient.newCall(request);
 7 try{
 8      Response reponse = call.excecute();
 9      System.out.println(response。body().string());      
10 }catch(IOExcption e){
11      e.printStackTrace();
12 }

 如果需要在request的header添加参数,如cookie、User-Agent什么的 , 就写成这样:

1 Request request = new Request.Builder()
2        .url(url)
3        .header("key","value")
4        .header("key","value")
5        ...
6        .build();

注意:

url 为 api 数据源,需要根据自身情况调用相应的api。

response的body有很多种输出方法,string() 只是其中之一,注意是string() 不是toString()。

如果是下载文件就是response.body().bytes(),

另外可以根据response.code() 获取返回的状态码。

-----------------------------------------------------------------------------------------------------------------------------------------

 如果是Post请求:

 1 String url = "https://baidu.com";
 2 OkHttpClient okHttpClient = new OkHttpClient();
 3 
 4 RequestBody body = new FormBody.Builder()
 5        .add("key","value");
 6        .add("key","value");
 7        ...
 8        .build();
 9 
10 Request request = new Request.Builder()
11        .url(url)
12        .post(body)
13        .build();
14 
15 Call call = okHttpClient.newCall(request);
16 try{
17      Response reponse = call.execute();
18      System.out.println(response.body().string());
19 }catch{
20      e.printStackTrace();
21 }

post 请求创建 request 和 get 是一样的,只是post请求需要提交一个表单——ResponseBody

表单格式有很多种,普通表单:

1 RequestBody body = new FormBody.Builder()
2     .add("键", "值")
3     .add("键", "值")
4     ...
5     .build();

RequestBody 的数据格式都要指定 Content-Type ,常见有三种:

application/x-www-form-urlencoded 数据是个普通表单

multipart/form-data 数据里有文件

application/json 数据是个json

但是上面代码中的表单并没有指定Content-Type这是因为FormBody继承了RequestBody,它已经指定了数据类型为application/x-www-form-urlencoded。

1 private static final MediaType CONTENT_TYPE = MediaType.parse("application/x-www-form-urlencoded");

如果表单是 json:

1 MediaType JSON = MediaType.parse("application/json;charset = utf-8");
2 RequestBody body = RequestBody.create(JSON,"你的JSON");

如果表单包含文件:

1 RequestBody requestBody = new MultipartBody.Build()
2        .setType(MultipartBody.FORM)
3        .addFormDataPart("file",file.getName(),RequestBody.create(MediaType.parse("image/png"),file))
4        .build();

上面的 MultipartBody也是继承了RequestBody,看下源码可知它适用于这五种Content-Type:

public static final MediaType MIXED = MediaType.parse("multipart/mixed");
public static final MediaType ALTERNATIVE = MediaType.parse("multipart/alternative");
public static final MediaType DIGEST = MediaType.parse("multipart/digest");
public static final MediaType PARALLEL = MediaType.parse("multipart/parallel");
public static final MediaType FORM = MediaType.parse("multipart/form-data");

 

 

另外还可以参考这个链接中的内容,还写了其他三种api接收数据的方式,很具体很细节~

https://www.2cto.com/kf/201607/521798.html

 

 

创造接口:

https://blog.csdn.net/qq_35731570/article/details/69937457

restful

 

urlrewrite

https://blog.csdn.net/kkkkkjava/article/details/78296845

 

posted @ 2018-10-07 21:31  儒雅随和的小郭  阅读(11140)  评论(0编辑  收藏  举报