在Retrofit 2编码中使用特殊字符的问题

时间:2016-12-28 11:37:33

标签: java android retrofit2

所以我希望向我们的api请求登录用户,但是有一个部分在Retrofit 2方法中编码,即使它设置为encoded = true。基本网址为https://testapi.test.ie我作为serverext传递的参数为mdc.php?action=但是,即使设置encoded = true后,生成的请求正文为:https://testapi.test.ie/mdc.php%3Faction=login_user&ts=1482924232742我需要它成为:https://testapi.test.ie/mdc.php?action=login_user&ts=1482924232742所以我可以看到问题是?符号。以下是我的改造方法,如果有人可以帮助我,我会很感激它,以实现正确的

@retrofit2.http.POST("/{serverext}login_user&ts={timestamp}")
@retrofit2.http.Multipart
Call<LoginResponseModel> loginUser(@retrofit2.http.Path(value = "serverext", encoded = true) String server,
                             @retrofit2.http.Part(Constants.USER) String username,
                             @retrofit2.http.Part(Constants.PASS) String password,
                             @retrofit2.http.Path("timestamp") Long timestamp);

2 个答案:

答案 0 :(得分:2)

你使用它不正确。路径是路径,查询是查询。您需要重写代码才能单独使用它。

@retrofit2.http.POST("{serverext}")
@FormUrlEncoded
Call<LoginResponseModel> loginUser(@retrofit2.http.Path(value = "serverext", encoded = true) String server,
                             @retrofit2.http.Field(Constants.USER) String username,
                             @retrofit2.http.Field(Constants.PASS) String password,
                             @retrofit2.http.Query("timestamp") Long timestamp, 
                             @retrofit2.http.Query("action") String action);

loginUser("mdc.php", username, pass, 42, "login_user")

答案 1 :(得分:0)

您需要使用@FormUrlEncoded。并且您不需要在所有声明中包含包名称!只需导入它们!它更整洁干净!

  @POST("/{serverext}login_user&ts={timestamp}")
    @Multipart
    @FormUrlEncoded
    Call<LoginResponseModel> loginUser(@Path(value = "server", encoded = true) String server,
                                       @Part(SyncStateContract.Constants.USER) String username,
                                       @Part(SyncStateContract.Constants.PASS) String password,
                                       @Path("timestamp") Long timestamp);