OkHttp Publicar cuerpo como JSON

Entonces, cuando estaba usando Koush’s Ion, pude agregar un cuerpo json a mis publicaciones con un simple .setJsonObjectBody(json).asJsonObject()

Me estoy mudando a OkHttp, y realmente no veo una buena manera de hacerlo. Estoy recibiendo el error 400 en todo el lugar.

¿Alguien tiene alguna idea?

Incluso he intentado formatearlo manualmente como una cadena json.

 String reason = menuItem.getTitle().toString(); JsonObject json = new JsonObject(); json.addProperty("Reason", reason); String url = mBaseUrl + "/" + id + "/report"; Request request = new Request.Builder() .header("X-Client-Type", "Android") .url(url) .post(RequestBody .create(MediaType .parse("application/json"), "{\"Reason\": \"" + reason + "\"}" )) .build(); client.newCall(request).enqueue(new com.squareup.okhttp.Callback() { @Override public void onFailure(Request request, IOException throwable) { throwable.printStackTrace(); } @Override public void onResponse(Response response) throws IOException { if (!response.isSuccessful()) throw new IOException( "Unexpected code " + response); runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(context, "Report Received", Toast.LENGTH_SHORT).show(); } }); } }); /*Ion.with(getContext(), url) .setHeader("X-Client-Type", "Android") .setJsonObjectBody(json) .asJsonObject() .setCallback(new FutureCallback() { @Override public void onCompleted(Exception e, JsonObject result) { Toast.makeText(context, "Report Received", Toast.LENGTH_SHORT).show(); } });*/ 

Editar: Para cualquiera que se tropiece con esta pregunta más adelante, aquí está mi solución que hace todo asincrónicamente. La respuesta seleccionada ES CORRECTA, pero mi código es un poco diferente.

 String reason = menuItem.getTitle().toString(); if (reason.equals("Copyright")) reason = "CopyrightInfringement"; JsonObject json = new JsonObject(); json.addProperty("Reason", reason); String url = mBaseUrl + "/" + id + "/report"; String jsonString = json.toString(); RequestBody body = RequestBody.create(JSON, jsonString); Request request = new Request.Builder() .header("X-Client-Type", "Android") .url(url) .post(body) .build(); client.newCall(request).enqueue(new com.squareup.okhttp.Callback() { @Override public void onFailure(Request request, IOException throwable) { throwable.printStackTrace(); } @Override public void onResponse(Response response) throws IOException { if (!response.isSuccessful()) throw new IOException( "Unexpected code " + response); runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(context, "Report Received", Toast.LENGTH_SHORT).show(); } }); } }); /*Ion.with(getContext(), url) .setHeader("X-Client-Type", "Android") .setJsonObjectBody(json) .asJsonObject() .setCallback(new FutureCallback() { @Override public void onCompleted(Exception e, JsonObject result) { Toast.makeText(context, "Report Received", Toast.LENGTH_SHORT).show(); } });*/ ... private void runOnUiThread(Runnable task) { new Handler(Looper.getMainLooper()).post(task); } 

Un poco más de trabajo, principalmente porque tiene que volver al hilo de la interfaz de usuario para realizar cualquier trabajo de IU, pero tiene el beneficio de que HTTPS simplemente … funciona.

Solo usa JSONObject.toString(); método . Y eche un vistazo al tutorial de OkHttp:

 public static final MediaType JSON = MediaType.parse("application/json; charset=utf-8"); OkHttpClient client = new OkHttpClient(); String post(String url, String json) throws IOException { RequestBody body = RequestBody.create(JSON, json); Request request = new Request.Builder() .url(url) .post(body) .build(); Response response = client.newCall(request).execute(); return response.body().string(); } 

Otro enfoque es mediante el uso de FormBody.Builder() .
Aquí hay un ejemplo de callback:

 Callback loginCallback = new Callback() { @Override public void onFailure(Call call, IOException e) { try { Log.i(TAG, "login failed: " + call.execute().code()); } catch (IOException e1) { e1.printStackTrace(); } } @Override public void onResponse(Call call, Response response) throws IOException { // String loginResponseString = response.body().string(); try { JSONObject responseObj = new JSONObject(response.body().string()); Log.i(TAG, "responseObj: " + responseObj); } catch (JSONException e) { e.printStackTrace(); } // Log.i(TAG, "loginResponseString: " + loginResponseString); } }; 

Entonces, creamos nuestro propio cuerpo:

 RequestBody formBody = new FormBody.Builder() .add("username", userName) .add("password", password) .add("customCredential", "") .add("isPersistent", "true") .add("setCookie", "true") .build(); OkHttpClient client = new OkHttpClient.Builder() .addInterceptor(this) .build(); Request request = new Request.Builder() .url(loginUrl) .post(formBody) .build(); 

Finalmente, llamamos al servidor:

 client.newCall(request).enqueue(loginCallback); 

Puede crear su propio JSONObject luego JSONObject toString() .

Recuerde ejecutarlo en el hilo de fondo como doInBackground en AsyncTask .

  // create your json here JSONObject jsonObject = new JSONObject(); try { jsonObject.put("username", "yourEmail@com"); jsonObject.put("password", "yourPassword"); jsonObject.put("anyKey", "anyValue"); } catch (JSONException e) { e.printStackTrace(); } OkHttpClient client = new OkHttpClient(); MediaType JSON = MediaType.parse("application/json; charset=utf-8"); // put your json here RequestBody body = RequestBody.create(JSON, jsonObject.toString()); Request request = new Request.Builder() .url("https://yourUrl/") .post(body) .build(); Response response = null; try { response = client.newCall(request).execute(); String resStr = response.body().string(); } catch (IOException e) { e.printStackTrace(); }