美文网首页
retrofit post请求同时需要query参数 paylo

retrofit post请求同时需要query参数 paylo

作者: lilyjq | 来源:发表于2020-04-08 19:12 被阅读0次

    payload -->@Body
    最近有个请求是post 还带query参数的用retrofit 一开始想的是

     @FormUrlEncoded
        @POST("/test")
        Observable<String> getResult(@Field("test")String test,@Field("test2") String test, @Body RequestBody body);
    

    后面发现 @FormUrlEncoded 和 @POST没有办法一起用,可以考虑使用拦截器给它加参数

    public class MyInterceptor implements Interceptor {
        @NotNull
        @Override
        public Response intercept(@NotNull Chain chain) throws IOException {
            Request requests = chain.request();
            // 添加Query参数
            HttpUrl httpUrl = requests.url()
                    .newBuilder()
                    .addQueryParameter("paramter", "paramter")
                    .addQueryParameter("paramter1", "paramter")
                    .addQueryParameter("paramter2", "paramter")
                    .build();
    
            // 添加Header参数
            Request request = requests.newBuilder()
                    .url(httpUrl)
                    .build();
    
            return chain.proceed(request);
    
        }
    }
    

    需要注意的是这种方法可能会导致其它后面加的拦截器失效的问题
    经过一下午后才发现有一种更方便的方式 : 直接在post请求里加@Query 以前一直以为@Query 只能和get一起使用
    原地址Retrofit2 post请求在url里面带上参数的问题
    好的最后发现校验一直没有办法过 发现是因为base64编码后最后有一个= 变成了%3D 导致服务器解析失败
    因此一直在想办法去解决retrofit自动urlencode 的问题,经过搜索有以下这样一种方式,但是对我来说并不适用,原因的话是因为声明encoded= true 是一个建议值,经过校验如果觉得你还需要encoded 那照样给你encoded

      @POST("/test")
        Observable<String> getResult(@Field("test")String test,@Query(value = "test2",encoded = true)String test, @Body RequestBody body);
    

    详情见:
    Retrofit2 urlencode 编码的问题
    好的这样还不行 最后解决方式

     @POST()
        Observable<String> getReuslt(@Url String url, @Body RequestBody body);
    

    还有以下方式(未检验):

    /**
    *这是需要encoded方式,常规写法
    */
    
     @POST("api/{url}/getList)
        Observable<String> getReuslt(@Path("url") String url, @Body RequestBody body);
    /**
    *这是不需要encoded方式
    */
    
     @POST("{url}")
        Observable<String> getReuslt(@Path(value = "url", encoded = true), @Body RequestBody body);
    

    Retrofit2 请求的路径被转义,导致异常http 400

    相关文章

      网友评论

          本文标题:retrofit post请求同时需要query参数 paylo

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