読者です 読者をやめる 読者になる 読者になる

【android】Volleyでpostパラメータを送信してjsonを受取る方法メモ

はじめに

今回やりたかったのは、以下のようなよくある処理ですが少しはまったのでメモしておきます
・アプリからpost送信
・サーバーにて$_POST(phpです)を受信してjsonを返す
・アプリでjsonを処理する

インストールと設定とか

まずはインストールして使えるようにする

git init # gitで管理していなければ
git submodule add https://android.googlesource.com/platform/frameworks/volley modules/volley

AndroidManifest.xmlにパーミション追加

<!-- インターネット使用 -->
<uses-permission android:name="android.permission.INTERNET" />

実装

サーバ側(php)

// $_POSTで受取る

header("Content-Type: application/json; charset=utf-8");
echo json_encode(array(
    "status" => 1, // 処理結果(今回は1なら正常という意味とする)
    "result" => array( // アプリ側に返却したいがあればresult以下にセットすることとする
        "userList" => array(
            array("id" => "1", "name"=>"ユーザー1"),
            array("id" => "2", "name"=>"ユーザー2"),
            ・・・
        ),
    ),
));

android

protected void onCreate(Bundle savedInstanceState) {

    ・・・

    // apiのurl
    String url = "http://example.com/json.php";
    RequestQueue queue = Volley.newRequestQueue(this);

    StringRequest request = new StringRequest(Request.Method.POST,url,
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    try {
                        // レスポンス文字列をjsonオブジェクトに変換して解析してゆく
                        JSONObject jsonObject = new JSONObject(response);
                        if (jsonObject.getInt("status") == 1) {
                            JSONObject result = jsonObject.getJSONObject("result");
                            JSONArray userList = result.getJSONArray("userList");
                        }
                    } catch (JSONException e) {
                        // error
                    }
                }
            },
            new Response.ErrorListener(){
                @Override
                public void onErrorResponse(VolleyError error){
                    //error
                }
            }){
        @Override
        protected Map<String,String> getParams(){
            // パラメータ設定
            Map<String,String> params = new HashMap<String,String>();
            params.put("param1","パラメータ1");
            params.put("param2","パラメータ2");
            ・・・
            return params;
        }
    };

    // 送信
    queue.add(request);
}

やりたいことはこれでできました
今回はまったポイントとしては、JsonObjectRequestを使っていたのですがこれを使うとレスポンスがJSONObjectで返ってくるので処理が簡単だったのですが、サーバー側へ送信するパラメータもjson形式になってしまうようでStringRequestを使う形にしました。

$input = file_get_contents("php://input");

JsonObjectRequestで送ったパラメータはphp側でも上記のように取得できるのですが、今回は$_POSTで取得したかったのでこちらを使うことにしました

やりかたあるのかもしれませんが、、、以上です