2017-05-25 5 views
0

ログイン後にユーザーのid, email and JWT tokenを返すノードバックエンドがあります。 IDと電子メールはJSON応答本体に設定され、トークンはHTTPヘッダーとして設定されます。Android Volley読み込みと保存HTTPヘッダー

私がやってみたいのは、ヘッダからそのトークンを読んで、後でトークンを削除するので、ユーザがログアウトするまでそれを保存しておくだけです。

getHeaders()を上書きしてヘッダーを設定する方法と、parseNetworkResponse()を上書きしてヘッダーを読み取る方法について、いくつかの記事があります。 parseNetworkResponse()の私の問題は、私が避けたいJSON本体の情報を書く必要があるということです。 getHeaders()の私の他の問題は、サーバから生成されたJWT tokenを使用しなければならないため、私のヘッダをHashMapに「ハードコード」できないということです。

これは私の最初の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; 
    } 
} 
関連する問題