【问题标题】:Issue with Special Characters in Retrofit 2 encodingRetrofit 2 编码中的特殊字符问题
【发布时间】:2016-12-28 11:37:32
【问题描述】:

所以我希望向我们的 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);

【问题讨论】:

    标签: java android retrofit2


    【解决方案1】:

    你用错了。路径就是路径,查询就是查询。您需要重写代码以单独使用它。

    @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")
    

    【讨论】:

    • 如果我更改为这种格式,请求的格式正确,但我收到来自 API 的错误响应,即无效凭据不正确,因为凭据正确。我认为它是@Path 而不是@Query 所必需的。我正在从 1.9 升级,它是 @Path 并且工作正常。这种编码特殊字符是retrofit2或okhttp3的限制吗?
    • 我不知道编码,但你使用的 API 不正确。你能检查你的请求吗?究竟有什么不正确的?
    • 我目前正在从 1.9 升级到 2.0,在 1.9 中,我们像这样使用了 api @POST("/{server}login_user&amp;ts={timestamp}") @Multipart void loginUser(@Path(value="server", encode=false) String server, @Part(Constants.USER) String username, @Part(Constants.PASS) String password, @Path("timestamp") Long timestamp, Callback&lt;MDLoginModel&gt;callback); 这工作正常,并且在使用它进行测试时,服务器的结果是凭据是正确的。
    • 使用您建议的格式,然后我从服务器凭据错误中收到一条错误消息。我目前无法检查请求。
    • 检查我更新的答案,也许你需要formurlencoded,而不是form-data?
    【解决方案2】:

    您需要使用 @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);
    

    【讨论】:

    • 您好,包名声明是为了让我从 1.9 升级到 Retrofit2,我目前正在这样做。我已经尝试过@FormUrlEncoded,但它没有用我仍然以? 编码结束。感谢您的帮助,您还有其他建议吗?
    • 有人有这方面的信息吗?至于为什么当我设置encoded = true? 仍然被编码?
    • 如果您不想要您的 ?要编码你为什么要制作encoded=true?留下它或让它false
    • 因为根据文档square.github.io/retrofit/2.x/retrofit/index.html?retrofit2/…。设置 encoded = true 确保它不被编码,默认编码为 false 导致项目被编码
    • 该死!感谢您指出了这一点!!对不起,错误信息
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-03
    • 2018-07-28
    • 2011-02-11
    • 1970-01-01
    • 2019-05-27
    • 1970-01-01
    • 2020-09-13
    相关资源
    最近更新 更多