Retrofit使用教程(二)

yangxi_001發表於2016-11-28

上一篇文章講述了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請求

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

2.POST請求

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

3.PUT請求

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

4.DELETE請求

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

伺服器介面型別

伺服器介面有很多中,本人經驗有限,目前接觸較多為以下幾種:

直接請求型

即直接對某一地址或組合某一地址發起請求

如:對/result/result/{id}發起GET請求,其中{id}中的id在實際使用時填寫實際值即可.

帶參查詢型

對某一地址進行帶參查詢請求

如:https://www.baidu.com/s?wd=123為對介面https://www.baidu.com/s進行引數為wd=123GET查詢請求.

帶Header型

 即請求時要求帶上Header

Retrofit中如何寫?

直接請求型

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

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

2.如果是組合後直接請求,如/result/{id}寫法如下:

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

帶參查詢型

如12306的查詢介面https://kyfw.12306.cn/otn/lcxxcx/query?purpose_codes=ADULT&queryDate=2016-03-18&from_station=BJP&to_station=CDW,寫法如下:

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)

帶Header型

比如要更新某個賬戶資訊,其介面地址為/info,需要帶的Header有裝置資訊device,系統版本version,還要帶請求引數要更新賬戶的id,程式碼如下:

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

注:本想給每一種請求新增一個請求例項,但是確實不太好找.

例項

找了很久發現多說提供了一些POST請求介面,下面就以多說的介面為例,看一下如何使用Retrofit寫請求.

基礎URL

多說的介面基礎地址為:http://api.duoshuo.com,則構建Retrofit例項程式碼如下:

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格式.

請求程式碼如下:

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

匿名發表新評論

介面地址為:/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方式實現

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);

2.Field Map實現方式

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

獲取Map方式如下:

1
2
3
4
5
6
7
8
9
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;
    }
}

專案地址在此:Dev-Wiki/RetrofitDemo

更多文章請移步我的部落格:DevWiki Blog

相關文章