Android Volley读取和存储HTTP标头

时间:2017-05-25 13:44:13

标签: java android android-volley

我有一个节点后端,它在登录后返回用户的id, email and JWT token。 Id和电子邮件在 JSON响应正文中设置,令牌设置为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);
    }

1 个答案:

答案 0 :(得分:1)

所以在玩了一下后我解决了我的问题。我创建了一个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;
    }
}