问题描述
我正在 android studio (java) 中制作一个 android 应用程序,它使用其余的 API 来获取和发布数据。 我可以登录并注册到服务器,但为了从服务器获取数据,我需要会话 cookie,但我不知道如何使用 volley 库获取会话 cookie。
private void login(String email,String password){
String url = "https://someURL.com/login";
StringRequest stringRequest = new StringRequest(Request.Method.POST,url,new Response.Listener<String>() {
@Override
public void onResponse(String response) {
textView.setText("String Response : "+ response.toString());
}
},new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
textView.setText("error");
}
}){
protected Map<String,String> getParams() throws AuthFailureError {
Map<String,String> params = new HashMap<>();
params.put("email",email);
params.put("password",password);
return params;
}
};
requestQueue.add(stringRequest);
}
这是我的请求代码:-
private void getProfile(String id,String email,String password){
String url = "https://someURL.com/profile/:"+id;
StringRequest stringRequest = new StringRequest(Request.Method.GET,new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
textView.setText("Profile error");
}
});
requestQueue.add(stringRequest);
}
两者都工作正常,但为了从服务器获取数据,我需要创建一个基于 cookie 的会话。请帮助...我已经搜索了资源,但没有任何效果。
解决方法
我已经解决了这个问题(通过浏览 volley 库的文档和源代码)。 我得到的解决方案不是自动处理会话cookie的方法,而是通过覆盖Volley的一些方法来解决的。 我的问题是如何获取会话 cookie,然后如何设置会话 cookie(我知道这是一种新手的说法,技术上不正确 - 为清楚起见,请进一步阅读)以供进一步请求。
我通过覆盖 Volley 的“parseNetworkResponse”方法解决了我的第一个问题。这个方法有一个'response'参数,它可以通过使用'response.headers'给出来自服务器的所有响应头。 以下是我的代码:-
@Override
protected Response<String> parseNetworkResponse(NetworkResponse response) {
Map<String,String> responseHeaders = response.headers;
cookie = new String(responseHeaders.get("Set-Cookie"));
Log.i("cookies",cookie);
jsonObject = new JSONObject(response.headers);
Log.i("response",String.valueOf(jsonObject));
return super.parseNetworkResponse(response);
}
对于我的第二个问题,我重载了 'getHeaders' 方法。对于任何基于身份验证的查询,此方法可用于将 cookie 发送回服务器。
以下是我的代码:-
@Override
public Map<String,String> getHeaders() throws AuthFailureError {
Map<String,String> headers = new HashMap<>();
try {
headers.put("cookie",String.valueOf(jsonObject.get("Set-Cookie")));
Log.i("header created ",headers.toString());
} catch (JSONException e) {
e.printStackTrace();
}
return headers;
}
*在从任何 API 测试应用程序应用到代码之前,请检查您的响应 cookie。
请随时提出任何修改建议(我只是 android studio 和 StackOverflow 的初学者)。 以及任何进一步的解释。我找了 10 多天的解决方案。