服务器是否应始终将JSON对象作为http响应发送?

时间:2016-10-02 09:13:22

标签: json node.js http express retrofit

我正在使用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

关于这个问题有很多主题,但没有关于正确(或更好)使用方法的确切答案。

关于这些案例中最佳实施的任何想法?

1 个答案:

答案 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响应代码之外添加特定错误消息可以告诉客户端到底是什么出错了,并允许客户端代码向用户显示更好的错误消息。

另请注意,truefalse也是有效的JSON。