LoginSignup
22
22

More than 5 years have passed since last update.

Android volleyで、JsonObjectRequestを、mapのパラメータでpostできるようにする。

Posted at

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

22
22
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
22