使用Retrofit提供500的POST请求

1tS*_*rge 5 java android ruby-on-rails retrofit

我有以下通过postman发送的Body返回就好了(作为原始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);
}
Run Code Online (Sandbox Code Playgroud)

服务呼叫和适配器如下

服务:

@POST("/signup")
Observable<JsonObject> signup(@Body JsonObject payload);
Run Code Online (Sandbox Code Playgroud)

适配器:

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);
}
Run Code Online (Sandbox Code Playgroud)

日志显示如下

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)
Run Code Online (Sandbox Code Playgroud)

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

Fre*_*red 2

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

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

@Headers("Accept: application/json")
@POST("/signup")
Observable<JsonObject> signup(@Body JsonObject payload);
Run Code Online (Sandbox Code Playgroud)

我注意到我正在使用的工具(Advanced REST Client for chrome)正在将所述标头添加到每个调用中。

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

很抱歉,我没有足够的信息告诉您为什么会发生这种情况,但它解决了我的问题。我确实在 Android 应用程序中尝试过。