com.android.volley.toolbox.JsonObjectRequest を使ってpostでリクエストしようとしたら、なんかできなかった。
ソースを見てみたら、どうもJSONObject をコンストラクタで渡さないと自動的にgetになるという仕様。
https://android.googlesource.com/platform/frameworks/volley/+/5bd5325bd61414480091b262204f1a45d57c1884/src/com/android/volley/toolbox/JsonObjectRequest.java
私はmapでパラメータを渡したいのです。既存のソースの流用的に。
というわけで、mapのパラメータでリクエストして、JSON形式で返してくれるというクラスを作ってみました。
もっといい方法があったら誰か教えて。
package com.gring.volley.toolbox;
import com.android.volley.AuthFailureError;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.toolbox.JsonRequest;
import org.json.JSONObject;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.Map;
/**
* JsonObjectRequestを、mapのパラメータでpostできるように対応しました。
*
*/
public class JsonObjectRequest extends com.android.volley.toolbox.JsonObjectRequest{
/**
* パラメータのマップ
*/
private Map<String, String> mParams;
public JsonObjectRequest(int method, String url, Map<String, String> params, Response.Listener<JSONObject> listener, Response.ErrorListener errorListener) {
super(method, url, null, listener, errorListener);
mParams = params;
}
@Override
protected Map<String, String> getParams() {
return mParams;
}
/**
* リクエストパラメータの形式を、JSON形式ではなく、通常のPOSTに変更する。通常のJSONObjectRequestではこの設定ができない。
* Request.javaから引用
* @return
*/
public String getBodyContentType() {
return "application/x-www-form-urlencoded; charset=" + getParamsEncoding();
}
@Override
public byte[] getBody() {
Map<String, String> params = getParams();
if (params != null && params.size() > 0) {
return encodeParameters(params, getParamsEncoding());
}
return null;
}
/**
* Converts <code>params</code> into an application/x-www-form-urlencoded encoded string.
*/
private byte[] encodeParameters(Map<String, String> params, String paramsEncoding) {
StringBuilder encodedParams = new StringBuilder();
try {
for (Map.Entry<String, String> entry : params.entrySet()) {
encodedParams.append(URLEncoder.encode(entry.getKey(), paramsEncoding));
encodedParams.append('=');
encodedParams.append(URLEncoder.encode(entry.getValue(), paramsEncoding));
encodedParams.append('&');
}
return encodedParams.toString().getBytes(paramsEncoding);
} catch (UnsupportedEncodingException uee) {
throw new RuntimeException("Encoding not supported: " + paramsEncoding, uee);
}
}
}