开题:在此默认各位看官对Retrofit、以及Okhttp已经有过一定的了解及应用,所以今天我们不谈基础入门的东西,今天我们谈在Retrofit请求接口管理类中URL参数含有动态参数的处理方式。一般我们使用Retrofit大部分场景中URL都是以注解的方式静态声明的,即URL及path路径都是固定不变,可变部分作为方法的参数传入,那有一些特殊情况会要求我们再使用@GET()、或者@POST()的时候URL路径里含有可变参数,需要动态处理,下面通过例子我逐个为大家分析讲解。

说明:以下所有Retrofit请求的BaseURL为https://192.168.1.101/api/,接口地址为本地测试,不代码以下接口真实可用

1.GET请求

1.)普通get请求

https://192.168.1.101/api/MovieList

@GET("MovieList")
Observable<ResultEntity<MovieEntity>> getMovieList();

2.) url中含有参数

https://192.168.1.101/api/MovieList/2018

分析:2018为动态可变部分,代表指定idMovie,api/MovieList/{movieId}

@GET("MovieList{movieId}")
Observable<ResultEntity<MovieEntity>> getMovieList(@Path("movieId") String movieId );

或者

https://192.168.1.101/api/MovieList/2018/comedy

分析:请求指定年下类型为comedy的电影,可变部分为年份/类型   请求地址可变部分归类为 api/{movieId}/{type}

@GET("MovieList{movieId}/{type}")
Observable<ResultEntity<MovieEntity>> getMovieList(@Path("movieId") String movieId ,@Path("type") String type);

3.)可变参数在URL的问号之后

https://192.168.1.101/api/MovieList?movieId=10011

分析:问号之后的参数可以直接用@Query注解在作为方法参数传入

@GET("MovieList")
Observable<ResultEntity<MovieEntity>> getMovieList(@Query("movieId") String movieId);

4.) 问号后面有多个参数 :

https://192.168.1.101/api/MovieList?movieId=10011&type=3

@GET("MovieList")
Observable<ResultEntity<MovieEntity>> getMovieList(@Query("movieId") String movieId,@Query("type") int type);

5.)问号后面有多个参数,且参数个数不定

https://192.168.1.101/api/MovieList?movieId=10011&type=4&year=2013&......

分析:作为Get请求,后面参数根据具体业务确定参数多少,也就是参数个数可变,但不确定多少个,可以借助@Querymap

@GET("MovieList")
Observable<ResultEntity<MovieEntity>> getMovieList(@QueryMap Map<String ,Object> map);

2.POST请求

1.) url中含有可变参数,post的数据只有一个type

https://192.168.1.101/api/MovieList/2018

分析:url中2018为可变内容,post需要提交的参数只有一个type,2018可动态改变

@FormUrlEncoded
@POST("MovieList/{movieId}")
Observable<ResultEntity<MovieEntity>> getMovieList(@Path("movieId") String movieId, @Field("type") String type);

2.) url中含有可变参数、问号之后需要加入token,post的数据只有一个type

https://192.168.1.101/api/MovieList/2018?token=4654551321563132fasd5645ds3

@FormUrlEncoded
@POST("MovieList/{movieId}")
Observable<ResultEntity<MovieEntity>> getMovieList(@Path("movieId") String movieId,
@Query("token") String token,
@Field("type") String type);

3.) url中含有可变参数、问号之后需要加入token,post的数据为一个对象(json串)

https://192.168.1.101/api/MovieList/2018?token=4654551321563132fasd5645ds3

@POST("MovieList/{movieId}")
Observable<ResultEntity<MovieEntity>> getMovieList(@Path("movieId") String movieId,
@Query("token") String token,
@Body MovieEntity entity);

以上内容 转自:https://blog.csdn.net/xieluoxixi/article/details/80092582

另外还有几点

1.如果你的可变参数中是带斜杠“/”的,比如https://192.168.1.101/api/MovieList/session/token,

session和token都是可变参数,但session是已知的,只是可能不同的请求下要求变为不同的字段,如

https://192.168.1.101/api/MovieList/apiKey/token,而baseURL始终为https://192.168.1.101/api/MovieList/

@POST("session/{movieId}")
Call<ResponseBody> getSessionKey(@Path(value = "movieId", encoded = true) String movieId, @Body RequestBody req);

2.如果你需要用到delete请求,比如

@DELETE("event/{uuid}")
Observable<ResponseBody> delEvent(@Path(value = "uuid", encoded = true) String uuid, @Body RequestBody rb);

直接这样用就会报错java.lang.IllegalArgumentException:Non-body HTTP method cannot contain @Body

据说官网表示DELETE并不支持向服务器传body

必须更换一下写法:

@HTTP(method = "DELETE",path = "event/{uuid}",hasBody = true)
Observable<ResponseBody> delEvent(@Path(value = "uuid", encoded = true) String uuid, @Body RequestBody rb);
												

关于Retrofit网络请求URL中含有可变参数的处理的更多相关文章

  1. get请求url中带有中文参数出现乱码情况

    在项目中经常会遇到中文传参数,在后台接收到乱码问题.那么在遇到这种情况下我们应该怎么进行处理让我们传到后台接收到的参数不是乱码是我们想要接收的到的,下面就是我的一些认识和理解. get请求url中带有 ...

  2. 0057 Spring MVC如何获取HTTP请求头信息--URL中的动态参数--@RequestHeader--@CookieValue--@PathVariable

    获取HTTP请求头信息 一个HTTP请求除了有参数和实体内容外还有HTTP请求头信息,Spring MVC也可以获取这部分信息 @RequestHeader解可以将请求头信息映射到处理方法的形参上 @ ...

  3. curl请求的url中含有空格

    curl请求的url中含有空格时(例如rul的参数是sql查询语句,url=www.tets.com/query.php?sql=select * from t1),curl_easy_perform ...

  4. 「Python 编程」编码实现网络请求库中的 URL 解析器

    摘要:怎么写出更短的代码并不是这次要讨论的话题.今天我们来研究一下:运行代码的计算机是如何找到目标服务器的? 相信各位 Python 开发者都用过 Requests 库,有些朋友还用过 WebSock ...

  5. Retrofit网络请求库应用02——json解析

    PS:上一篇写了Retrofit网络请求库的简单使用,仅仅是获取百度的源码,来证明连接成功,这篇讲解如何解析JSON数据,该框架不再是我们之前自己写的那样用JsonArray等来解析,这些东西,我们都 ...

  6. 对 url 中含有的中文进行转码操作

    对 url 中含有的中文进行转码操作 一般情况下,将带有中文的 url 拷贝到开发工具,开发工具都会有相应的转码(自动转码), 现在大部分的浏览器也可以对含有中文的 url 进行转码(自动转码) 情景 ...

  7. 微信小程序传递URL中含有特殊字符

    小程序传递URL中含有特殊字符"="时,解决办法:先encodeURIComponent,取到值以后再decodeURIComponent 首先在A页面 var urls = en ...

  8. url编码--url中含有空格问题

    开发web服务中,发现当url中含有空格时,会报 400 error: bad request sytanx,经分析,url中含有特殊字符时,服务端可能无法识别.如+,空格,/,?,%,#,& ...

  9. java基础知识 学习 关于URL中传递的参数含有特殊字符

    有些符号在URL中是不能直接传递的,如果要在URL中传递这些特殊符号,那么就要使用他们的编码了.下表中列出了一些URL特殊符号及编码                                   ...

随机推荐

  1. linux环境下mongodb启动操作

    pkill mongod 进入mongo shell :运行 db.shutdownServer() 1.进入mongo的shell  : mongo --port 1008 2.进入bin目录下 m ...

  2. Mybatis JDBC->Mybatis

    1 什么是JDBC Java程序都是通过JDBC(Java Data Base Connectivity)连接数据库的,通过SQL对数据库编程.JDBC是由SUN公司(SUN公司已被Oracle公司收 ...

  3. javaweb数据库编程代码详细讲解

    import java.sql.*; /*默写数据库练习数据库编程及注释讲解代码*/ public class Main{ public static void main(String[]args)t ...

  4. unity仿微信飞机大战项目

    开发路线: 1,游戏背景(连续播放) 2,添加主角 3,设置游戏主角的动画 4,添加两种子弹并设置子弹的运动 5,添加三种子弹 设置子弹的自动生成和运动 6,添加两种奖励物品 设置奖励物品的自动生成和 ...

  5. PAT基础6-11

    6-11 求自定类型元素序列的中位数 (25 分) 本题要求实现一个函数,求N个集合元素A[]的中位数,即序列中第⌊N/2+1⌋大的元素.其中集合元素的类型为自定义的ElementType. 函数接口 ...

  6. Visual Studio VS使用freopen调试控制台闪退

    解决方法 freopen("CON", "r", stdin);    system("pause>nul"); 暂停函数之前,使用f ...

  7. Codeforces Round #419 (Div. 2) ABC

    python 2.7,用来熟悉Python 由于都是智障题,所以我也不讲述题意和题解,直接贴代码了-- A import sys h,m = map(int,raw_input().split(&qu ...

  8. JSAP104

    JSAP104 1.目标: 2.绑定事件的区别 1).addEventListener中的this是当前绑定的对象 .attachEventListener是window 2) 3)解绑事件 方法一: ...

  9. gdb调试动态链接so

    http://blog.csdn.net/weed_hz/article/details/12710429 gdb) file <你的exe>(gdb) load <你的so> ...

  10. C#保存文件为无BOM的utf8格式

    如图所示,发现用C#的 File.WriteAllLines 方法,无论怎么设置,最终生成的文件都是 PC utf8,也就是CRLF,用SVN进行提交的时候,显示左侧为utf8,右侧为utf8 BOM ...