我通过邮递员发送以下身体返回就好了(作为原始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)
看起来他们是完全相同的电话,但由于某种原因,它在我的移动应用程序中失败了。任何关于我错过的东西的见解都会很棒!
答案 0 :(得分:2)
我看了一下你的问题,因为我怀疑这确实与使用邮递员的电话在应用程序中进行的调用有很小的不同。不幸的是,我无法向你解释为什么会发生这种情况,因为它是500,它很可能是服务器端的错误实现。
当我添加标题Accept: application/json
时,问题就解决了:
@Headers("Accept: application/json")
@POST("/signup")
Observable<JsonObject> signup(@Body JsonObject payload);
我注意到我正在使用的工具(Advanced REST Client for chrome)正在为每次调用添加所述标题。
当我删除此标题时,我会收到您遇到的500。你也可以使用Accept: */*
,但我不确定这是一个好习惯。
对不起,我没有足够的信息告诉你为什么会这样,但它解决了我的问题。我确实在Android应用程序中尝试了它。