web-dev-qa-db-fra.com

Envoi de corps JSON via POST demande dans OKhttp dans Android

J'ai configuré OkHttpClient et envoyé avec succès la requête GET au serveur. Et aussi je pouvais pouvoir envoyer la demande POST au serveur avec la balise body vide.

Maintenant, j'essaie d'envoyer l'objet JSON suivant au serveur. 

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

Pour cela, j’essaie d’ajouter la classe RequestBody de la bibliothèque OkHttpClient, mais je ne parviens pas à envoyer l’objet JSON en tant que corps de la requête http POST. De la manière suivante, j'ai essayé de créer le corps et de traiter la demande de publication.

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

Comment envoyer l'objet JSON au serveur via la demande POST.

Merci d'avance.

5
nifCody

Essaye ça

Ajouter Gradle dépend 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;
    }

Réponse d'analyse

   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

Faites juste ceci:

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

Et cela devrait fonctionner correctement :-) Si je comprends bien la documentation, sink est un conteneur dans lequel vous pouvez écrire les données que vous souhaitez publier. La méthode writeUtf8 est pratique pour transformer la String en octets, en utilisant le codage UTF-8.

1
Kelevandos