美文网首页Android开发Android技术知识Android开发
retrofit和okhttp请求url的参数拼接

retrofit和okhttp请求url的参数拼接

作者: Ad大成 | 来源:发表于2019-08-13 00:26 被阅读14次

题:在此默认各位看官对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

<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; font-family: &quot;Courier New&quot; !important; font-size: 12px !important;">@GET("MovieList")
Observable<ResultEntity<MovieEntity>> getMovieList();</pre>

2.) url中含有参数

         https://192.168.1.101/api/MovieList/2018    

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

<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; font-family: &quot;Courier New&quot; !important; font-size: 12px !important;">@GET("MovieList{movieId}")
Observable<ResultEntity<MovieEntity>> getMovieList(@Path("movieId") String movieId );</pre>

    或者

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

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

<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; font-family: &quot;Courier New&quot; !important; font-size: 12px !important;">@GET("MovieList{movieId}/{type}")
Observable<ResultEntity<MovieEntity>> getMovieList(@Path("movieId") String movieId ,@Path("type") String type);</pre>

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

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

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

<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; font-family: &quot;Courier New&quot; !important; font-size: 12px !important;">@GET("MovieList")
Observable<ResultEntity<MovieEntity>> getMovieList(@Query("movieId") String movieId);</pre>

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

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

<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; font-family: &quot;Courier New&quot; !important; font-size: 12px !important;">@GET("MovieList")
Observable<ResultEntity<MovieEntity>> getMovieList(@Query("movieId") String movieId,@Query("type") int type);</pre>

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

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

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

<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; font-family: &quot;Courier New&quot; !important; font-size: 12px !important;">@GET("MovieList")
Observable<ResultEntity<MovieEntity>> getMovieList(@QueryMap Map<String ,Object> map);</pre>

2.POST请求

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

        https://192.168.1.101/api/MovieList/2018

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

<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; font-family: &quot;Courier New&quot; !important; font-size: 12px !important;">@FormUrlEncoded
@POST("MovieList/{movieId}")
Observable<ResultEntity<MovieEntity>> getMovieList(@Path("movieId") String movieId, @Field("type") String type);</pre>

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

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

<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; font-family: &quot;Courier New&quot; !important; font-size: 12px !important;">@FormUrlEncoded
@POST("MovieList/{movieId}")
Observable<ResultEntity<MovieEntity>> getMovieList(@Path("movieId") String movieId,
@Query("token") String token,
@Field("type") String type);</pre>

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

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

<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; font-family: &quot;Courier New&quot; !important; font-size: 12px !important;">@POST("MovieList/{movieId}")
Observable<ResultEntity<MovieEntity>> getMovieList(@Path("movieId") String movieId,
@Query("token") String token,
@Body MovieEntity entity);</pre>

以上内容 转自: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/

<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; font-family: &quot;Courier New&quot; !important; font-size: 12px !important;">@POST("session/{movieId}")
    Call<ResponseBody> getSessionKey(@Path(value = "movieId", encoded = true) String movieId, @Body RequestBody req);</pre>
2.如果你需要用到delete请求,比如

<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; font-family: &quot;Courier New&quot; !important; font-size: 12px !important;">@DELETE("event/{uuid}")
Observable<ResponseBody> delEvent(@Path(value = "uuid", encoded = true) String uuid, @Body RequestBody rb);</pre>

直接这样用就会报错[java.lang.IllegalArgumentException:Non-body](https://link.jianshu.com/?t=java.lang.IllegalArgumentException:Non-body) HTTP method cannot contain @Body

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

必须更换一下写法:

<pre style="margin: 0px; padding: 0px; white-space: pre-wrap; overflow-wrap: break-word; font-family: &quot;Courier New&quot; !important; font-size: 12px !important;">@HTTP(method = "DELETE",path = "event/{uuid}",hasBody = true)
Observable<ResponseBody> delEvent(@Path(value = "uuid", encoded = true) String uuid, @Body RequestBody rb);</pre>

相关文章

  • retrofit和okhttp请求url的参数拼接

    题:在此默认各位看官对Retrofit、以及Okhttp已经有过一定的了解及应用,所以今天我们不谈基础入门的东西,...

  • 一、

    1、Retrofit的实现与原理 Retrofit是基于OkHttp,可以通过注解来配置请求方法的类型、请求参数、...

  • AFN坑及常用设置

    1.AFN默认参数拼接在url后的请求有 2.如果不想让AFN默认的请求参数拼接在url后面可以设置 ...

  • Retrofit源码解析

    应用程序通过Retrofit请求网络,实际上是使用Retrofit接口封装请求参数,之后由OkHttp完成后续的操...

  • 后台接口,参数有可能放在请求头,也有可能放在请求体!

    如果放在请求头,需要url和参数进行拼接如果放在请求体,只需要设置参数即可(YTKNetwork)

  • Get,post,cookie,Session

    Get请求 1.get方式在url后面拼接参数,只能以文本的形式传递参数。 2.没有请求体 3.请求参数附在URL...

  • Retrofit2源码解析

    Retrofit网络请求的功能实现是okhttp3,由okhttp3做真正的网络请求。Retrofit2框架和其他...

  • 初步了解Post和Get请求

    #######Get和Post 的区别 Get:特点:所有的请求的参数都拼接在Url后面,以?分割URL和传输数据...

  • Retrofit+OkHttp+RxJava数据解析问题

    Retrofit+OkHttp+RxJava Retrofit 负责 请求的数据和请求的结果,使用接口的方式呈现,...

  • Retrofit之请求头

    在《Retrofit之请求参数》,我们讨论了请求的url参数、表单编码以及使用请求主体发送数据,但是处理API的请...

网友评论

    本文标题:retrofit和okhttp请求url的参数拼接

    本文链接:https://www.haomeiwen.com/subject/rjjmjctx.html