2010-10-08 74 views
8

我正在開發一個REST API,並且需要在應用程序進程(從祕密密鑰進行MAC加密)中傳輸密碼以驗證消息的每個請求。我正在考慮將它們放在消息頭中,以避免在包含發佈/檢索對象(XML或JSON)的消息體中添加非數據信息。使用REST API在消息頭中傳遞參數

這是最佳做法嗎?

我可以在標題中添加所需的參數嗎?我讀過,我必須用「x-」作爲前綴。此參數的行爲與Path或Query參數完全相同?

我正在使用澤西島。

謝謝你的幫助。

+0

Additonnal問題:是它更好地使用現有的頭參數(日期,授權)或創建特定的人(X-APP-日,X-APP-AUTH )? – Zofren 2010-10-11 13:20:57

回答

8
  1. 是的我相信有標題參數傳輸某些數據是可以接受的。 JAX-RS標準甚至定義了@HeaderParam annotation。簡單的example of @HeaderParam

  2. 這是一個將非標準http標頭用「x-」前綴的約定。

我和你有類似的情況:我需要在每個REST調用中傳輸用戶令牌和應用程序ID。爲了避免代碼重複,我實現了PreProcessInterceptor(我使用Resteasy),通過它來路由所有REST請求。如果用戶令牌無效並且用戶沒有給予應用程序ID的權限,那麼我將返回401未授權。我的代碼看起來與此類似(簡體版):

@Provider 
@ServerInterceptor 
public class RestSecurityInterceptor implements PreProcessInterceptor { 

    @Override 
    public ServerResponse preProcess(HttpRequest request, ResourceMethod method) 
      throws UnauthorizedException { 

     String token = request.getHttpHeaders().getRequestHeader("token").get(0); 

     // user not logged-in? 
     if (checkLoggedIn(token)) { 
      ServerResponse response = new ServerResponse(); 
      response.setStatus(HttpResponseCodes.SC_UNAUTHORIZED); 
      MultivaluedMap<String, Object> headers = new Headers<Object>(); 
      headers.add("Content-Type", "text/plain"); 
      response.setMetadata(headers); 
      response.setEntity("Error 401 Unauthorized: " 
       + request.getPreprocessedPath()); 
      return response; 
     } 
     return null; 
    } 
} 
+0

謝謝。 Interceptor解決方案非常優雅,但我的身份驗證過程並未在我的所有應用程序中推廣。 – Zofren 2011-02-21 07:18:14