【问题标题】:Send raw POST request with OkHttp 3使用 OkHttp 3 发送原始 POST 请求
【发布时间】:2023-03-03 08:43:26
【问题描述】:

要使用 OkHttp 发送 POST 请求,我已经看到他们使用 FormBody.Builder,但这需要我手动输入 POST 数据的每个名称和值。有没有办法使用带有 POST 数据的单个字符串创建 RequestBody?例如,而不是

FormBody.Builder bodyBuilder = new FormBody.Builder();

bodyBuilder.add("name", "value");
bodyBuilder.add("name2", "value2");

...只是在做

bodyBuilder.add("name=value&name2=value2");

【问题讨论】:

  • 欢迎来到 StackOverflow! “手动输入”是什么意思?你把它放在你的源代码中一次就可以了?
  • 你试过RequestBody.create(MediaType contentType, String content)吗?将 contentType 和内容作为字符串传递。
  • 是的,但我正在进行的项目是基于解析 POST 数据并发送一些请求。而且,每次将原始数据转换为地图都会降低性能
  • rcorreia 是的,我做到了,但由于某种原因它没有发送任何数据......但是 contentType 重要吗?
  • @JohnRock 尝试创建这个变量public static final MediaType FORM = MediaType.parse("multipart/form-data");。将 FORM 变量作为 contentType 传递。

标签: java http okhttp3


【解决方案1】:

你可以这样做:

RequestBody body = RequestBody.create(MediaType.get("application/x-www-form-urlencoded"), "key1=value1&key2=value2");

Request request = new Request.Builder()
.url(url)
.post(body)
.build();

【讨论】:

    【解决方案2】:

    当然,使用RequestBuilder

      Request request = new Request.Builder()
          .url(url)
          .post(body) // here you put your body
          .build();
    

    但是 URL 编码和其他相关的东西会在你身边。

    【讨论】:

      【解决方案3】:

      创建一个名为 FORM 的 MediaType 变量:

      public static final MediaType FORM = MediaType.parse("multipart/form-data");
      

      使用 FORM 变量和未解析的参数(字符串)创建一个 RequestBody:

      RequestBody requestBody = RequestBody.create(FORM, params);
      

      发布完整的 requestBody 变量。

      Request request = new Request.Builder()
          .url(url)
          .post(requestBody)
          .build();
      

      【讨论】:

      • 由于某种原因,它不会以这种方式发送帖子数据
      • 你看到服务器端的请求了吗?您可以发布完整的请求吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-24
      • 2018-09-02
      • 2014-06-20
      • 2015-08-06
      • 1970-01-01
      • 2016-07-30
      • 2017-05-04
      相关资源
      最近更新 更多