所以,当我使用Koush的Ion时,我能够通过一个简单的方式在我的帖子中添加一个json体 .setJsonObjectBody(json).asJsonObject()
我正在转向OkHttp,我真的没有看到一个很好的方法来做到这一点.我到处都收到错误400.
有人有主意吗?
我甚至尝试将其手动格式化为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(); } });*/
编辑:对于后来绊倒这个问题的人来说,这是我的解决方案,它可以异步完成所有事情.所选答案是正确的,但我的代码有点不同.
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); }
更多的工作,主要是因为你必须回到UI线程来做任何UI工作,但你只有...工作才能获得HTTPS的好处.
只需使用JSONObject.toString();
方法.看看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(); }
另一种方法是使用FormBody.Builder()
.
这是回调的一个例子:
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); } };
然后,我们创建自己的身体:
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();
最后,我们调用服务器:
client.newCall(request).enqueue(loginCallback);
你可以创建自己的JSONObject
然后toString()
。
记得像doInBackground
在中那样在后台线程中运行它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(); }