我想重新编码我的项目并使用 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/