android - 使用 OKHttp 创建适当的 MultipartBuilder Http 请求

标签 android multipartform-data okhttp

我想重新编码我的项目并使用 okHttp 而不是 Android 中实现的默认 HttpClient。

我已经下载了 okhttp-main 版本的最新源。

现在我找到了一些如何创建和构建 POST 请求的示例。

现在我的问题。我想创建一个 RequestBody 来保存多个数据(字符串、文件等),但我不能直接分配它们。

意味着 RequestBuilder 必须经过不同的循环才能添加数据。

OkHTTPs RequestBody 似乎立即需要示例中列出的数据 https://github.com/square/okhttp/wiki/Recipes

当我想尝试类似的东西时

RequestBody requestBody = new MultipartBuilder().type(MultipartBuilder.FORM);

for (Object aMData : dataClass.getData().entrySet()) {
            Map.Entry mapEntry = (Map.Entry) aMData;
            String keyValue = (String) mapEntry.getKey();
            String value = (String) mapEntry.getValue();
            requestBody.addPart(keyValue, value);
}


for (DataPackage dataPackage : dataClass.getDataPackages()) {
            requestBody.addPart("upfile[]", dataPackage.getFile());
}

requestBody.build();

它失败是因为 build() 本身创建了 RequestBody。在它只是一个 MultipartBuilder() 之前。如果我尝试将类型强制为 RequestBody,它将无法编译/运行。

那么,在创建 MultiPartBuilder 并添加数据和字符串后添加这些数据的正确方法是什么?

最佳答案

使用 OkHttp 分段上传文件

private static final String IMGUR_CLIENT_ID = "...";
private static final MediaType MEDIA_TYPE_PNG = MediaType.parse("image/png");

private final OkHttpClient client = new OkHttpClient();

public void run() throws Exception {
  // Use the imgur image upload API as documented at https://api.imgur.com/endpoints/image
  RequestBody requestBody = new MultipartBuilder()
      .type(MultipartBuilder.FORM)
      .addPart(
          Headers.of("Content-Disposition", "form-data; name=\"title\""),
          RequestBody.create(null, "Square Logo"))
      .addPart(
          Headers.of("Content-Disposition", "form-data; name=\"image\""),
          RequestBody.create(MEDIA_TYPE_PNG, new File("website/static/logo-square.png")))
      .build();

  Request request = new Request.Builder()
      .header("Authorization", "Client-ID " + IMGUR_CLIENT_ID)
      .url("https://api.imgur.com/3/image")
      .post(requestBody)
      .build();

  Response response = client.newCall(request).execute();
  if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);

  System.out.println(response.body().string());
}

关于android - 使用 OKHttp 创建适当的 MultipartBuilder Http 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24306320/

相关文章:

android - 按轴计算 Canvas 中的点坐标

Java JSON 从 JSONArray 的 JSONObject 中的选定名称中提取值

java - android java中两个函数之间的 sleep ?

javascript - 如何禁用多部分表单上的下一个按钮?

java - 为什么我在使用 Retrofit2 时得到 "Type okhttp3.Call does not have type parameters"?

android - 几何概念的解释

python - 如何从 multipart/form-data 请求中提取二进制数据? (Python)(由 AWS API Gateway 编码的多部分请求 base64)

python - 如何使用 multipart/form-data 创建一个将 pdf 文件作为输入的 AWS Lambda/API 网关 python 函数?

java - 如何创建 OkHttp 所需的虚拟 ResponseBody 对象?

java - 基于Java的B2B客户端/服务器服务中的Okhttp(高并发)