【问题标题】:Retrofit POST with multiple query params使用多个查询参数改造 POST
【发布时间】:2017-09-11 22:23:48
【问题描述】:

我想做一个 POST 命令。

这是我的端点:http://180.150.134.136:18095/WSCoreAPI/send/receive/tester?method=LOGN&data=(urlencodeddata)

我的问题是我将如何在我的改造中构建端点

我做了这样的事情:

@POST("WSCoreAPI/send/receive/tester")
Call<LoginResponse> tester(
        @QueryMap Map<String, String> data);

但它不起作用

还有这个:

@POST("WSCoreAPI/send/receive/tester")
Call<LoginResponse> tester(
        @Query("method") String method,
        @Query("data") String data);

【问题讨论】:

  • 你有什么错误吗?
  • 错误来自我的 api。我不知道如何记录发送到 api 的实际 url 请求。所以我猜在构建我的改造端点时似乎存在问题
  • 能不能把android logcat放到更清楚的理解
  • 您可以使用okhttp logging interceptor记录请求和响应
  • @fvthree 你应该在改造中使用 onSuccess 和 onFailure 方法实现回调接口。在 onFailure 情况下,它会抛出一个异常,说明关于 rest 调用的错误。请尝试在 android 日志中记录该错误。登录android监视器并添加图像的监视器。这将帮助您调试问题。这将帮助我们理解通话中的问题。

标签: android api retrofit


【解决方案1】:

对 url 编码字段使用 @Field 和 @FormUrlEncoded

@FormUrlEncoded
@POST("WSCoreAPI/send/receive/tester")
Call<LoginResponse> tester(@Field("method") String method,
                           @Field("data") String data);

【讨论】:

  • 还是没有运气。我的 api 仍然出现同样的错误
  • @fvthree 您是否对 Postman 或任何其他客户进行了同样的尝试?您的示例显示 &amp;data=(urlencodeddata) 并且您正在使用 POST 方法,但是您传递的数据是查询的一部分。当您使用 @Field@FieldMap 时,改造会将其添加到帖子正文中,而不是查询中。并且您的服务器应该接受帖子正文。
  • 我尝试使用 Postman。服务器不应接受帖子正文。发出请求时,URL 中应包含“方法”和“数据”。我需要查询
【解决方案2】:

试试这个

@FormUrlEncoded
@POST("WSCoreAPI/send/receive/tester")
Call<LoginResponse> tester(@FieldMap Map<String, String> parameters);

【讨论】:

    【解决方案3】:

    好的,我让它工作了。

    我使用了上述两种解决方案。

    我所做的是我删除了“数据”查询参数的 url 编码并使用了这个:

    @FormUrlEncoded
    @POST("WSCoreAPI/send/receive/tester")
    Call<LoginResponse> tester(@Field("method") String method,
                               @Field("data") String data);
    

    删除 url 编码解决了这个问题,因为改造会自动对带有 @Field 注释的字段进行编码

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-11
      • 2019-05-15
      • 2015-05-14
      • 2013-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多