zoukankan      html  css  js  c++  java
  • Android Retrofit使用教程(二)

    上一篇文章讲述了Retrofit的简单使用,这次我们学习一下Retrofit的各种HTTP请求.

    Retrofit基础

    在Retrofit中使用注解的方式来区分请求类型.比如@GET("")表示一个GET请求,括号中的内容为请求的地址.

    格式含义
    @GET 表示这是一个GET请求
    @POST 表示这个一个POST请求
    @PUT 表示这是一个PUT请求
    @DELETE 表示这是一个DELETE请求
    @HEAD 表示这是一个HEAD请求
    @OPTIONS 表示这是一个OPTION请求
    @PATCH 表示这是一个PAT请求

    基本的HTTP请求

    Retrofit可实现基本HTTP请求,包括GET,POST,PUT,DELETE等.

    1.GET请求

    [代码]java代码:

    1
    2
    @GET("/record")
    Call<phoneresult> getResult();</phoneresult>

    2.POST请求

    [代码]java代码:

    1
    2
    @POST("/record")
    Call<phoneresult> getResult();</phoneresult>

    3.PUT请求.

    [代码]java代码:

    1
    2
    @PUT("/record")
    Call<phoneresult> getResult();</phoneresult>

    4.DELETE请求

    [代码]java代码:

    1
    2
    @DELETE("/record")
    Call<phoneresult> getResult();</phoneresult>

    服务器接口类型

    服务器接口有很多中,本人经验有限,目前接触较多为以下几种:

    直接请求型

    即直接对某一地址或组合某一地址发起请求

    如:对/result/result/{id}发起GET请求,其中{id}中的id在实际使用时填写实际值即可.

    带参查询型

    对某一地址进行带参查询请求

    如:https://www.baidu.com/s?wd=123为对接口https://www.baidu.com/s进行参数为wd=123GET查询请求.

    带Header型

     即请求时要求带上Header

    Retrofit中如何写?

    直接请求型

    1.如果是直接请求某一地址,写法如下:

    [代码]java代码:

    1
    2
    @GET("/record")
    Call<phoneresult> getResult();</phoneresult>

    2.如果是组合后直接请求,如/result/{id}写法如下:

    [代码]java代码:

    1
    2
    @GET("/result/{id}")
    Call<phoneresult> getResult(@Path("id") String id);</phoneresult>

    带参查询型

    如12306的查询接口https://kyfw.12306.cn/otn/lcxxcx/query?purpose_codes=ADULT&queryDate=2016-03-18&from_station=BJP&to_station=CDW,写法如下:

    [代码]java代码:

    1
    2
    3
    @GET("/otn/lcxxcx/query")
    Call<result> query(@Query("purpose_codes") String codes, @Query("queryDate") String date,
        @Query("from_station") String from, @Query("to_station") String to)</result>

    带Header型

    比如要更新某个账户信息,其接口地址为/info,需要带的Header有设备信息device,系统版本version,还要带请求参数要更新账户的id,代码如下:

    [代码]java代码:

    1
    2
    3
    @POST("/info")
    Call<object> updateInfo(@Header("device") String device, @Header("version") int version,
                            @Field("id") String id); <br></object>

    注:本想给每一种请求添加一个请求实例,但是确实不太好找.

    实例

    找了很久发现多说提供了一些POST请求接口,下面就以多说的接口为例,看一下如何使用Retrofit写请求.

    基础URL

    多说的接口基础地址为:http://api.duoshuo.com,则构建Retrofit实例代码如下:

    [代码]java代码:

    1
    2
    3
    4
    Retrofit retrofit = new Retrofit.Builder()
            .addConverterFactory(GsonConverterFactory.create())
            .baseUrl("http://api.duoshuo.com")
            .build();

    获取文章评论、转发数

    接口地址为:/threads/counts

    HTTP请求方式:GET

    请求示例为:http://api.duoshuo.com/threads/counts.json?short_name=official&threads=4ff1cbc43ae636b72a00001d

    后面的.json为返回数据的格式,此处我们使用json格式.

    请求代码如下:

    [代码]java代码:

    1
    2
    3
    @GET("/threads/counts.json")
    Call<object> getCommit(@Query("short_name") String shortName,
                           @Query("threads") String threads); <br></object>

    匿名发表新评论

    接口地址为:/posts/create

    HTTP请求方式:POST

    请求示例为:

    Request URL:http://api.duoshuo.com/posts/create.json
    Request Method:POST
    Post Data:short_name=official&author_email=jp.chenyang%40gmail.com&author_name=Perchouli&thread_id=1152923703638301959&author_url=http%3A%2F%2Fduoshuo.com&message=匿名发表新评论

    1.Field方式实现

    [代码]java代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    @FormUrlEncoded
    @POST("/posts/create.json")
    Call<commitresult> createCommit(@Field("secret") String secret,
                                    @Field("short_name") String shortName,
                                    @Field("author_email") String authorEmail,
                                    @Field("author_name") String authorName,
                                    @Field("thread_key") String threadKey,
                                    @Field("author_url") String author_url,
                                    @Field("message") String message);</commitresult>

    2.Field Map实现方式

    [代码]java代码:

    1
    2
    3
    @FormUrlEncoded
    @POST("/posts/create.json")
    Call<commitresult> createCommit(@FieldMap Map<string, string=""> map);</string,></commitresult>

    获取Map方式如下:

    [代码]java代码:

    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    public class CommitParam {
      
        private String short_name;
        private String author_email;
        private String author_name;
        private String thread_id;
        private String author_url;
        private String message;
      
        public String getShort_name() {
            return short_name;
        }
      
        public void setShort_name(String short_name) {
            this.short_name = short_name;
        }
      
        public String getAuthor_email() {
            return author_email;
        }
      
        public void setAuthor_email(String author_email) {
            this.author_email = author_email;
        }
      
        public String getAuthor_name() {
            return author_name;
        }
      
        public void setAuthor_name(String author_name) {
            this.author_name = author_name;
        }
      
        public String getThread_id() {
            return thread_id;
        }
      
        public void setThread_id(String thread_id) {
            this.thread_id = thread_id;
        }
      
        public String getAuthor_url() {
            return author_url;
        }
      
        public void setAuthor_url(String author_url) {
            this.author_url = author_url;
        }
      
        public String getMessage() {
            return message;
        }
      
        public void setMessage(String message) {
            this.message = message;
        }
      
        public Map<string, string=""> createCommitParams(){
            Map<string, string=""> params = new HashMap<>();
            params.put("short_name", short_name);
            params.put("author_email", author_email);
            params.put("author_name", author_name);
            params.put("thread_id", thread_id);
            params.put("author_url", author_url);
            params.put("message", message);
            return params;
        }
    }</string,></string,>

    项目地址在此:Dev-Wiki/RetrofitDemo

  • 相关阅读:
    老王讲架构:负载均衡
    支付宝系统架构内部剖析
    Effective Java 第三版——61. 基本类型优于装箱的基本类型
    Effective Java 第三版——60. 需要精确的结果时避免使用float和double类型
    Effective Java 第三版——59. 熟悉并使用Java类库
    Effective Java 第三版——58. for-each循环优于传统for循环
    Effective Java 第三版——57. 最小化局部变量的作用域
    Effective Java 第三版——56. 为所有已公开的API元素编写文档注释
    Effective Java 第三版——55. 明智而审慎地返回Optional
    Effective Java 第三版——54. 返回空的数组或集合不要返回null
  • 原文地址:https://www.cnblogs.com/android-blogs/p/5752449.html
Copyright © 2011-2022 走看看