2016-10-02 110 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。

相關問題