2017-05-25 73 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; 
    } 
}