gpt4 book ai didi

java - Android Volley 读取并存储 HTTP Header

转载 作者:行者123 更新时间:2023-11-30 00:31:54 27 4
gpt4 key购买 nike

我有一个节点后端,它在登录后返回用户的 id、email 和 JWT token。 ID 和电子邮件在 JSON 响应正文中设置, token 设置为 HTTP header 。

我想做的只是从 header 中读取该 token 并将其存储以供将来请求使用,直到用户注销为止,因为之后我将删除该 token 。

我找到了几篇关于如何通过覆盖 getHeaders() 设置 header 以及如何通过覆盖 parseNetworkResponse() 读取 header 的帖子。 parseNetworkResponse() 的问题是,我必须将信息写入 JSON 正文,我想避免这种情况。 getHeaders() 的另一个问题是我无法将 header “硬编码”到 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);
}

最佳答案

所以在玩了一会儿之后我解决了我的问题。我创建了一个 TokenHandler 类,它非常基础,只关心设置/获取和稍后删除 token 。

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;
}
}

关于java - Android Volley 读取并存储 HTTP Header,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44182171/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com