• 从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

  • 相关阅读:
    Android开发:android.support.v7.widget.AppCompatButton cannot be cast to android.widget.EditText;使用Fragment时不同引入包的问题解决
    Android开发:java.net.SocketException: Permission denied问题解决
    毕业设计进度:3月26日
    Android开发:在非Activity类中,如何实现跳转到另一个Activity
    Android开发:Textview控件显示的字符串中部分文字格式修改
    Android开发:URLDecoder: Illegal hex characters in escape (%) pattern : %编码问题
    Android开发:输入框点击后弹出的小键盘把页面向上挤压问题解决
    Android开发:Can't create handler inside thread that has not线程问题解决
    CCF认证历年试题
    北大ACM
  • 原文地址:https://www.cnblogs.com/guojia314/p/9751599.html
Copyright © 2020-2023  润新知