【问题标题】:POST request with Retrofit giving 500带有改造的 POST 请求给出 500
【发布时间】:2016-03-21 02:32:42
【问题描述】:

我有以下通过邮递员发送的正文返回就好了(作为原始 JSON)

{"payload":{"email":"","username":"","password":""}}

但是,当我尝试按如下方式通过 Retrofit 发送它时,它不起作用(给出 500):

public Observable<JsonObject> signup(String email, String userName, String password) {
    JsonObject data = new JsonObject();
    JsonObject payload = new JsonObject();

    data.addProperty("email", email);
    data.addProperty("username", userName);
    data.addProperty("password", password);
    payload.add("payload", data);

    return mShoutApiService.signup(payload);
}

服务调用和适配器如下

服务:

@POST("/signup")
Observable<JsonObject> signup(@Body JsonObject payload);

适配器:

private RestAdapter createRestAdapter(String hostUrl, GsonConverter gsonConverter, OkClient okClient) {
    return new RestAdapter.Builder()
            .setClient(okClient)
            .setConverter(gsonConverter)
            .setEndpoint(hostUrl)
            .setLogLevel(LogLevel.FULL)
            .setLog(new AndroidLog("SHOUT_LOG"))
            .build();
}

private GsonConverter getGsonConverter(Gson gson) {
    return new GsonConverter(gson);
}

private OkClient getOkClient() {
    OkHttpClient okHttpClient = new OkHttpClient();
    okHttpClient.setReadTimeout(READ_TIMEOUT, TimeUnit.SECONDS);
    okHttpClient.setConnectTimeout(CONNECT_TIMEOUT, TimeUnit.SECONDS);

    return new OkClient(okHttpClient);
}

日志显示如下

03-23 05:04:00.380 2442-3468/shout.surge.com.shout D/SHOUT_LOG: --->       HTTP POST http://shout-api.herokuapp.com/signup
03-23 05:04:00.380 2442-3468/shout.surge.com.shout D/SHOUT_LOG: Content-Type: application/json; charset=UTF-8
03-23 05:04:00.380 2442-3468/shout.surge.com.shout D/SHOUT_LOG: Content-Length: 52
03-23 05:04:00.384 2442-3468/shout.surge.com.shout D/SHOUT_LOG: {"payload":{"email":"","username":"","password":""}}
03-23 05:04:00.384 2442-3468/shout.surge.com.shout D/SHOUT_LOG: ---> END HTTP (52-byte body)
03-23 05:04:09.180 2442-3468/shout.surge.com.shout D/SHOUT_LOG: <--- HTTP  500 http://shout-api.herokuapp.com/signup (8796ms)

看起来它们是完全相同的调用,但由于某种原因,它在我的移动应用程序中失败了。关于我所缺少的任何见解都会很棒!

【问题讨论】:

  • 500 是服务器端的错误。它很可能是由发送错误请求的客户端和服务器端的错误实现引发的。由于邮递员一切正常,我假设您的改造客户正在以某种方式发送意外请求。与邮递员仔细检查请求。检查网址 - 最后是否有“/”?是“/注册”吗?检查您的实施中的基本网址 - 它们是否相同?标题是否相同?您可以在此处发布所有内容以获得进一步的帮助。这些只是提示。
  • 所以在返回日志中看起来我得到03-22 02:16:20.326 2427-2661/shout.surge.com.shout D/SHOUT_LOG: Content-Type: text/html; charset=utf-8 如果我使用@Header 或使用TypedInput 作为正文,这不会改变。
  • 我猜这只是 500 响应的标头,通常是带有 500 错误消息的 html 页面。您可以使用重新适配器定义更新您的问题,使用完整的调用日志(请求+响应)以及邮递员(url + headers + body)上的任何内容。谢谢!
  • 完成了!..真的希望能解决这个问题

标签: java android ruby-on-rails retrofit


【解决方案1】:

我查看了您的问题,因为我怀疑这确实与应用程序中拨打的电话与邮递员拨打的电话略有不同有关。不幸的是,我无法向您解释为什么会发生这种情况,因为作为 500,它很可能是服务器端的错误实现。

当我像这样添加标题 Accept: application/json 时,问题就解决了:

@Headers("Accept: application/json")
@POST("/signup")
Observable<JsonObject> signup(@Body JsonObject payload);

我注意到我使用的工具 (Advanced REST Client for chrome) 在每次调用中都添加了上述标头。

当我删除此标题时,我得到了您遇到的 500。你也可以使用Accept: */*,但我不确定这是一个好习惯。

很抱歉,我无法告诉您为什么会发生这种情况,但它为我解决了这个问题。我确实在一个android应用程序中尝试过。

【讨论】:

  • 哇,真奇怪!当我下班回家时,我会试一试。虽然很好
猜你喜欢
  • 2018-12-14
  • 1970-01-01
  • 2021-05-19
  • 2020-02-25
  • 1970-01-01
  • 1970-01-01
  • 2016-02-08
  • 1970-01-01
  • 2014-12-29
相关资源
最近更新 更多