2016-10-02 80 views
0

我正在使用Express和一个Android本机应用程序使用Retrofit 1.9来使用node.js服务器。 对于仅向客户端返回真/假答案的登录API,是否仍应使用JSON?服务器应该总是发送一个JSON对象作为http响应吗?

在我看来,服务器只发送一个状态码响应:

if(isLegal) { 
    res.sendStatus(200); 
    dbConnector.updateUser(token); 
} 
else{ 
    console.log('Token is not legal'); 
    res.sendStatus(403); 
} 

但改造框架试图应对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: Expected BEGIN_OBJECT but was STRING

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

有关这些情况下的最佳实施的任何想法?

+1

Retrofit使用Gson作为json库,它会尝试解析从服务器接收到的任何对象。 – nurgasemetey

+0

这是肯定的。但是在非JSON响应的情况下,将会抛出异常。 –

+0

您可以为此场景创建简单的类。也许将来,这个登录过程将会延长。 – nurgasemetey

回答

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。

相关问题