从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包的同学可以进入下面链接搜索下载
然后在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