2017-05-25 79 views
0

我有一個節點後端,它在登錄後返回用戶的id, email and JWT token。 ID和電子郵件設置在JSON響應正文中,令牌設置爲HTTP標頭。Android Volley讀取和存儲HTTP標頭

我想要做的只是從標題中讀取該標記並將其存儲爲將來的請求,直到用戶註銷爲止,因爲我之後會刪除標記。

我發現了幾個關於如何通過覆蓋getHeaders()來設置標題的帖子,以及如何通過覆蓋parseNetworkResponse()來讀取標題。我與parseNetworkResponse()的問題是,我必須在JSON正文上編寫信息,這是我想避免的。我的getHeaders()的其他問題是我不能「硬編碼」我的頭到HashMap中,因爲我必須使用從服務器生成的JWT token

這是我的第一個Android項目,總的來說我認爲這是一個簡單的用例,但我現在有點困惑,所以任何幫助都將不勝感激。

相關代碼:

// AuthenticationRequest.java 
public class AuthenticationRequest extends JsonObjectRequest{ 

    public AuthenticationRequest(int method, String url, JSONObject payload, 
           Response.Listener<JSONObject> listener, Response.ErrorListener errorListener) { 
     super(method, url, payload, listener, errorListener); 
    } 

    @Override 
    protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) { 
     try { 
      String jsonString = new String(response.data, HttpHeaderParser.parseCharset(response.headers, PROTOCOL_CHARSET)); 
      JSONObject jsonResponse = new JSONObject(jsonString); 

      // I could fetch here with response.headers 

      return Response.success(jsonResponse, HttpHeaderParser.parseCacheHeaders(response)); 
     } catch (UnsupportedEncodingException | JSONException e) { 
      return Response.error(new ParseError(e)); 
     } 
    } 
} 

// BasicActivity.java 
private void sendRequestToServer(String url, int method, JSONObject payload, final Class toGo) { 
     final AuthenticationRequest request = 
       new AuthenticationRequest(method, url, payload, response -> { 
        try { 
         startActivity(new Intent(this, toGo).putExtra("jsonData", response.toString())); 
        } catch (Exception e) { 
         e.printStackTrace(); 
        } 
       }, Throwable::printStackTrace); 
     VolleySingleton.getInstance(this).addToRequestQueue(request); 
    } 
+0

您使用的是已經訪問標題的類:http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/andr oid/4.2.2_r1/com/android/volley/toolbox/HttpHeaderParser.java/ – Submersed

+0

@Submersed首先感謝您的幫助:)我意識到這一點。我試圖實現的是永久存儲具體頭文件'x-auth'(由服務器端生成)。 – thedude

回答

0

張望了一下後打所以我解決我的問題。我創建了一個非常基本的TokenHandler類,只關心設置/獲取以及後來刪除令牌。

TokenHandler.java

public final class TokenHandler { 
    private TokenHandler() {} 

    private static String token = ""; 

    public static void setToken(String newToken) { 
     if (newToken != null) 
      token = newToken; 
    } 

    public static String getToken() { 
     return token; 
    } 
} 

你設置它在你的子類的請求是這樣的:

AuthRequest.java

public class AuthRequest extends JsonObjectRequest{ 

    // constructor 

    @Override 
    protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) { 
     try { 
      String jsonString = new String(response.data, HttpHeaderParser.parseCharset(response.headers, PROTOCOL_CHARSET)); 
      JSONObject jsonResponse = new JSONObject(jsonString); 

      // set token after receiving from login response 
      TokenHandler.setToken(response.headers.get("x-auth")); 

      return Response.success(jsonResponse, HttpHeaderParser.parseCacheHeaders(response)); 
     } catch (UnsupportedEncodingException | JSONException e) { 
      return Response.error(new ParseError(e)); 
     } 
    } 

    @Override 
    public Map<String, String> getHeaders() throws AuthFailureError { 
     Map<String, String> headers = new HashMap<>(); 
     headers.put("x-auth", TokenHandler.getToken()); 
     return headers; 
    } 
}