当前位置: 首页 > 面试题库 >

OkHttp发布正文为JSON

戴高远
2023-03-14
问题内容

所以,当我使用Koush的离子时,我能够使用一个简单的方法将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<JsonObject>() {
            @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<JsonObject>() {
        @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); // new
  // RequestBody body = RequestBody.create(JSON, json); // old
  Request request = new Request.Builder()
      .url(url)
      .post(body)
      .build();
  Response response = client.newCall(request).execute();
  return response.body().string();
}


 类似资料:
  • 问题内容: 我读了一些将jsons发布到服务器的示例。 有人说: OkHttp是Java提供的HttpUrlConnection接口的实现。它提供用于编写​​内容的输入流,并且不知道(或不在乎)内容的格式。 现在,我想用名称和密码的参数对URL进行常规发布。 这意味着我需要自己将名称和值对编码为流? 问题答案: 当前接受的答案已过期。现在,如果您想创建一个发布请求并向其中添加参数,则应该使用Mul

  • 问题内容: 我已经设置好OkHttpClient并成功将GET请求发送到服务器。而且,我还可以将带有空body标签的POST请求发送到服务器。 现在,我正在尝试将以下JSON对象发送到服务器。 为此,我尝试添加OkHttpClient库类,但无法将JSON对象作为http POST请求的主体发送。我尝试通过以下方式构建主体并处理发布请求。 通过POST请求将JSON对象发送到服务器的方式是什么。

  • 问题内容: 我想用Swagger发布一个json主体,像这样: 目前,我有这个定义: 但是数据是在URL中发送的。这是Swagger提供的生成的卷曲: 我知道键值不好,但是我没有找到发布JSON正文的方法。我试过了,但是没有用。 问题答案: 您需要使用参数: 并定义为模型: 参考:https : //github.com/OpenAPITools/openapi-generator/blob/ma

  • 我正在尝试数据发送到远程AWS API。 数据应该是部分上的。 使用邮递员,我可以发送数据,一切都正常工作: 现在,为了使用,我正在执行以下操作: 请求成功,但没有数据更新!好像没有收到一样。 我无法访问远程API日志文件。 所以我的问题是,这是在Guzzle请求的主体部分发布数据的正确方法吗? 谢了。

  • 具体内容在 Pocket

  • 本文向大家介绍CentOS 8 正式发布,包括了CentOS 8 正式发布的使用技巧和注意事项,需要的朋友参考一下 CentOS 8 正式发布! CentOS 8 和RedHat Enterprise Linux 8发行的版本是一致的,都是基于 Fedora 28 和 内核 4.18.支持传统的、新兴的工作负载的工具,为用户提供了稳定的、安全的、一致的基础、跨混合云部署。CentOS 完全遵守 R