良い一日!
私のアプリは、クライアント側の Volley ライブラリで確立された単純な http クライアント サーバー通信を使用します。まず、承認リクエストを起動します。
public class AuthenticationRequest extends StringRequest {
private static final String TAG = AuthenticationRequest.class.getSimpleName();
private String login;
private String password;
public AuthenticationRequest(int method,
String url,
Response.Listener<String> listener,
Response.ErrorListener errorListener) {
super(method, url, listener, errorListener);
}
public void setLogin(String login) {
this.login = login;
}
public void setPassword(String password) {
this.password = password;
}
@Override
protected Map<String, String> getParams() {
HashMap<String, String> parameters = new HashMap<>();
parameters.put("login", login);
parameters.put("password", password);
return parameters;
}
@Override
protected Response<String> parseNetworkResponse(NetworkResponse response) {
for (Map.Entry<String, String> entry : response.headers.entrySet()) {
Log.d(TAG, entry.getKey() + " -- " + entry.getValue());
}
String sessionId = response.headers.get("Set-Cookie");
return Response.success(sessionId, HttpHeaderParser.parseCacheHeaders(response));
}
}
その直後に、現在のユーザーに関連付けられているデバイスのリストを要求します。現時点では、応答ヘッダーからのクッキーがあります。認証リクエストの完全なヘッダー応答出力:
- キャッシュ制御 -- ストアなし、キャッシュなし、再検証が必要、チェック後 = 0、チェック前 = 0
- 接続 -- キープアライブ
- コンテンツの長さ -- 16
- コンテンツ タイプ -- text/html; 文字セット=utf-8
- 日付 -- 2015 年 9 月 18 日金曜日 06:15:57 GMT
- 有効期限 -- 1981 年 11 月 19 日(木)08:52:00 GMT
- プラグマ -- キャッシュなし
- サーバー -- nginx
- セット Cookie -- PHPSESSID=osurmkq1fmnj462c3hk76l1405; パス=/
- X-Android-Received-Millis -- 1442553247146
- X-Android-Sent-Millis -- 1442553247096
- X-Powered-By -- PHP/5.3.27
Auth リクエストの onResponce コールバックで、Set-Cookie 値を sessionId として取得し、DeviceListRequest を起動します。
public class DeviceListRequest extends StringRequest {
private static final String TAG = DeviceListRequest.class.getSimpleName();
private String phpSessId;
public DeviceListRequest(int method,
String url,
Response.Listener<String> listener,
Response.ErrorListener errorListener) {
super(method, url, listener, errorListener);
}
public void setPhpSessId(String phpSessId) {
this.phpSessId = phpSessId;
}
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
HashMap<String, String> headers = new HashMap<>();
Log.d(TAG, phpSessId);
headers.put("Cookie", phpSessId);
return headers;
}
}
ここで、sessionId をデバイス リスト リクエストのヘッダーに追加しましたが、応答として {"status":false,"error":"No authorization"} が表示されます。
デスクトップ PC の Chrome ブラウザで、期待どおりにデバイスのリストを受け取ります - 問題は Android にあります。
教えてください、私のコードの問題は何ですか? たぶん、ヘッダーの設定が間違っていますか???
リクエスト送信手順のコード:
public void authenticationRequest(String login, String password) {
final AuthenticationRequest request = new AuthenticationRequest(Request.Method.GET,
AUTHENTICATION_URL,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.d(TAG, "Response: " + response);
phpSessId = response;
deviceListRequest(phpSessId);
}
},
this);
request.setLogin(login);
request.setPassword(password);
requestQueue.add(request);
}
public void deviceListRequest(String phpSessId) {
DeviceListRequest request = new DeviceListRequest(Request.Method.GET,
DEVICE_LIST_URL,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.d(TAG, "Response: " + response);
}
},
this);
request.setPhpSessId(phpSessId);
requestQueue.add(request);
}