web-dev-qa-db-ja.com

POST OKhttpのリクエストAndroid

OkHttpClientを設定して、GETリクエストをサーバーに正常に送信しています。また、POSTリクエストを本文タグが空のサーバーに送信することもできます。

今、私は次のJSONオブジェクトをサーバーに送信しようとしています。

{
"title": "Mr.",
"first_name":"Nifras",
"last_name": "",
"email": "[email protected]",
"contact_number": "75832366",
"billing_address": "",
"connected_via":"Application"
}

このため、OkHttpClientライブラリクラスRequestBodyを追加しようとしていますが、JSONオブジェクトをhttp POSTリクエストの本文として送信できません。次の方法で、本文と投稿リクエストを処理します。

OkHttpClient client = new OkHttpClient();

    RequestBody body = new RequestBody() {
        @Override
        public MediaType contentType() {
            return ApplicationContants.JSON;
        }

        @Override
        public void writeTo(BufferedSink sink) throws IOException {
              // This is the place to add json I thought. But How could i do this
        }
    };

    Request request = new Request.Builder()
            .url(ApplicationContants.BASE_URL + ApplicationContants.CUSTOMER_URL)
            .post(body)
            .build();

POSTリクエストを介してJSONオブジェクトをサーバーに送信する方法は何ですか。

前もって感謝します。

6
nifCody

これを試して

Gradleを追加するcompile 'com.squareup.okhttp3:okhttp:3.2.0'

public static JSONObject foo(String url, JSONObject json) {
        JSONObject jsonObjectResp = null;

        try {

            MediaType JSON = MediaType.parse("application/json; charset=utf-8");
            OkHttpClient client = new OkHttpClient();

            okhttp3.RequestBody body = RequestBody.create(JSON, json.toString());
            okhttp3.Request request = new okhttp3.Request.Builder()
                    .url(url)
                    .post(body)
                    .build();

            okhttp3.Response response = client.newCall(request).execute();

            String networkResp = response.body().string();
            if (!networkResp.isEmpty()) {
                jsonObjectResp = parseJSONStringToJSONObject(networkResp);
            }
        } catch (Exception ex) {
            String err = String.format("{\"result\":\"false\",\"error\":\"%s\"}", ex.getMessage());
            jsonObjectResp = parseJSONStringToJSONObject(err);
        }

        return jsonObjectResp;
    }

解析応答

   private static JSONObject parseJSONStringToJSONObject(final String strr) {

    JSONObject response = null;
    try {
        response = new JSONObject(strr);
    } catch (Exception ex) {
        //  Log.e("Could not parse malformed JSON: \"" + json + "\"");
        try {
            response = new JSONObject();
            response.put("result", "failed");
            response.put("data", strr);
            response.put("error", ex.getMessage());
        } catch (Exception exx) {
        }
    }
    return response;
}
7
young

これを行うだけです:

@Override
public void writeTo(BufferedSink sink) throws IOException {
     sink.writeUtf8(yourJsonString); 
}

そして、それはうまく動作するはずです:-)私がドキュメントを正しく理解していれば、sinkは、投稿したいデータを書き込むことができるコンテナです。 writeUtf8メソッドは、UTF-8エンコーディングを使用して、Stringをバイトに変換するのに便利です。

1
Kelevandos