我正在使用Express和一个Android原生app在node.js服务器上工作,使用Retrofit 1.9。 对于仅返回客户端的真/假答案的登录API,是否仍应使用JSON?
我认为,服务器只需发送状态码响应:
if(isLegal) {
res.sendStatus(200);
dbConnector.updateUser(token);
}
else{
console.log('Token is not legal');
res.sendStatus(403);
}
但是Retrofit框架尝试将响应转换为JSON,这让我觉得我必须发送一个带有答案的JSON对象,尽管看起来很奇怪。
我的改造restClient:
public class RestClient {
private static final String URL = SessionDetails.getInstance().serverAddress;
private retrofit.RestAdapter restAdapter;
private ServerAPI serverAPI;
public RestClient() {
restAdapter = new retrofit.RestAdapter.Builder()
.setEndpoint(URL)
.setLogLevel(retrofit.RestAdapter.LogLevel.FULL)
.build();
serverAPI = restAdapter.create(ServerAPI.class);
}
public ServerAPI getService() {
return serverAPI;
}
}
用法:
restClient.getService().login(token.getToken(), token.getUserId(), new Callback<Void>() {
@Override
public void success(Void aVoid, Response response) {
Log.d("Chooser", "Successful login on server.");
}
@Override
public void failure(RetrofitError error) {
error.printStackTrace();
Log.d("Chooser", "Login failed on server.");
}
});
使用它会导致以下错误:
com.google.gson.JsonSyntaxException:java.lang.IllegalStateException:预期为BEGIN_OBJECT但是为STRING
关于这个问题有很多主题,但没有关于正确(或更好)使用方法的确切答案。
关于这些案例中最佳实施的任何想法?
答案 0 :(得分:1)
使用您的HTTP响应发送一个空的身体是完全合法的,一些客户可能只关心响应状态,但有些客户可能希望得到一个响应,所以发送一个机构永远不会伤害,有时可能会有用。
除HTTP响应状态外,您还可以包含JSON响应:
// Express 4.x:
res.status(403).json({error: 'Token is not legal'});
// Express 3.x:
res.json(403, {error: 'Token is not legal'});
这样的错误消息对于客户端开发非常有用。您可以出于多种原因获得403,非法令牌,过期令牌,合法未过期令牌,但对于没有特权的错误用户 - 除了HTTP响应代码之外添加特定错误消息可以告诉客户端到底是什么出错了,并允许客户端代码向用户显示更好的错误消息。
另请注意,true
和false
也是有效的JSON。