【Android】Retrofit网络请求参数注解,@Path、@Query、@QueryMap...

对Retrofit已经使用了一点时间了,是时候归纳一下各种网络请求的service了。

下面分为GET、POST、DELETE还有PUT的请求,说明@Path、@Query、@QueryMap、@Body、@Field的用法。

初始化Retrofit
String BASE_URL = "http://102.10.10.132/api/";
Retrofit retrofit = new Retrofit.Builder() 
        .baseUrl(BASE_URL)
        .build();

GET

样式1(一个简单的get请求)

http://102.10.10.132/api/News

    @GET("News")
    Call<NewsBean> getItem();

样式2(URL中有参数)

http://102.10.10.132/api/News/1 http://102.10.10.132/api/News/{资讯id}

    @GET("News/{newsId}")
    Call<NewsBean> getItem(@Path("newsId") String newsId);

http://102.10.10.132/api/News/1/类型1 http://102.10.10.132/api/News/{资讯id}/{类型}

    @GET("News/{newsId}/{type}")
    Call<NewsBean> getItem(@Path("newsId") String newsId, @Path("type") String type);

样式3(参数在URL问号之后)

http://102.10.10.132/api/News?newsId=1 http://102.10.10.132/api/News?newsId={资讯id}

    @GET("News")
    Call<NewsBean> getItem(@Query("newsId") String newsId);

http://102.10.10.132/api/News?newsId=1&type=类型1 http://102.10.10.132/api/News?newsId={资讯id}&type={类型}

    @GET("News")
    Call<NewsBean> getItem(@Query("newsId") String newsId, @Query("type") String type);

样式4(多个参数在URL问号之后,且个数不确定)

http://102.10.10.132/api/News?newsId=1&type=类型1... http://102.10.10.132/api/News?newsId={资讯id}&type={类型}...

    @GET("News")
    Call<NewsBean> getItem(@QueryMap Map<String, String> map);

也可以

    @GET("News")
    Call<NewsBean> getItem(
              @Query("newsId") String newsId,
              @QueryMap Map<String, String> map);

POST

样式1(需要补全URL,post的数据只有一条reason)

http://102.10.10.132/api/Comments/1 http://102.10.10.132/api/Comments/{newsId}

    @FormUrlEncoded
    @POST("Comments/{newsId}")
    Call<Comment> reportComment(
        @Path("newsId") String commentId,
        @Field("reason") String reason);

样式2(需要补全URL,问号后加入access_token,post的数据只有一条reason)

http://102.10.10.132/api/Comments/1?access_token=1234123 http://102.10.10.132/api/Comments/{newsId}?access_token={access_token}

    @FormUrlEncoded
    @POST("Comments/{newsId}")
    Call<Comment> reportComment(
        @Path("newsId") String commentId,
        @Query("access_token") String access_token,
        @Field("reason") String reason);

样式3(需要补全URL,问号后加入access_token,post一个body(对象))

http://102.10.10.132/api/Comments/1?access_token=1234123 http://102.10.10.132/api/Comments/{newsId}?access_token={access_token}

    @POST("Comments/{newsId}")
    Call<Comment> reportComment(
        @Path("newsId") String commentId,
        @Query("access_token") String access_token,
        @Body CommentBean bean);

DELETE

样式1(需要补全URL)

http://102.10.10.132/api/Comments/1 http://102.10.10.132/api/Comments/{commentId}

    @DELETE("Comments/{commentId}")
    Call<ResponseBody> deleteNewsCommentFromAccount(
        @Path("commentId") String commentId);

样式2(需要补全URL,问号后加入access_token)

http://102.10.10.132/api/Comments/1?access_token=1234123 http://102.10.10.132/api/Comments/{commentId}?access_token={access_token}

    @DELETE("Comments/{commentId}")
    Call<ResponseBody> deleteNewsCommentFromAccount(
        @Path("commentId") String commentId,
        @Query("access_token") String access_token);

样式3(带有body)

http://102.10.10.132/api/Comments

@HTTP(method = "DELETE",path = "Comments",hasBody = true)
Call<ResponseBody> deleteCommont(
            @Body CommentBody body
    );

CommentBody:需要提交的内容,与Post中的Body相同

PUT(这个请求很少用到,例子就写一个)

http://102.10.10.132/api/Accounts/1 http://102.10.10.132/api/Accounts/{accountId}

    @PUT("Accounts/{accountId}")
    Call<ExtrasBean> updateExtras(
        @Path("accountId") String accountId,
        @Query("access_token") String access_token,
        @Body ExtrasBean bean);

总结

@Path:所有在网址中的参数(URL的问号前面),如: http://102.10.10.132/api/Accounts/{accountId} @Query:URL问号后面的参数,如: http://102.10.10.132/api/Comments?access_token={access_token} @QueryMap:相当于多个@Query @Field:用于POST请求,提交单个数据 @Body:相当于多个@Field,以对象的形式提交 Tips

  • Tips1 使用@Field时记得添加@FormUrlEncoded
  • Tips2 若需要重新定义接口地址,可以使用@Url,将地址以参数的形式传入即可。如
    @GET
    Call<List<Activity>> getActivityList(
            @Url String url,
            @QueryMap Map<String, String> map);
    Call<List<Activity>> call = service.getActivityList(
                "http://115.159.198.162:3001/api/ActivitySubjects", map);

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏瞎说开发那些事

RPA解决网页元素随机变化的问题

2136
来自专栏强仔仔

利用js实现输入框动态提示信息

为了提高和用户的交互性,现在的输入框往往都采用输入信息自动提示的功能,类似于百度输入框中的提示功能。 设计思路是:在输入框input的组件下面放置一个div,这...

6896
来自专栏java学习

二维码生成源码

二维码生成源码 开发前准备: 第三方包:QRCode.jar 下载链接: QRCode.zip 开发工具:eclipse, myeclipse,idea 效...

4825
来自专栏Ryan Miao

照着官方文档学习react

准备 先要准备环境。搭建一个基于webpack的react环境:Hello ReactJS. 一些要点 我在想是否应该完整的记录照抄的过程呢。毕竟已经开始一段,...

3687
来自专栏IMWeb前端团队

react组件性能优化探索实践

React本身就非常关注性能,其提供的虚拟DOM搭配上Diff算法,实现对DOM操作最小粒度的改变也是非常的高效。然而其组件渲染机制,也决定了在对组件进行更新时...

2557
来自专栏前端儿

前端神器之Sublime Text2/3简单明了使用总结

第一:也是最重要的,它占内存很小(就如同notepad++那般迅速打开,所以那款其实也不错~)。一般IDE比如WebStorm(它也是一款神器来着),Aptan...

1222
来自专栏全栈

基于iView的列表组件封装

8612
来自专栏菩提树下的杨过

Flash/Flex学习笔记(4):如何打开网页及Get/Post数据

flash终究只是客户端技术,所以很多时候还是需要与服务端技术(比如asp,asp.net,jsp,php之类)进行数据交互的,下面的代码演示了如何在flash...

2337
来自专栏Golang语言社区

【Go 语言社区】Go语言条件变量的两个例子

在Go语言中 sync.Cond 代表条件变量,但它需要配置锁才能有用. var m Mutex c := NewCond(&m) 或 c := sync.N...

4067
来自专栏分享达人秀

初识ListView

之前我们学习的一些UI组件都比较简单,但是在实际开发中,会经常遇见列表界面设计,如通讯录、电话列表、信息列表等。那么从本节开始来详细学习列表界面设计。 ...

2215

扫码关注云+社区

领取腾讯云代金券