android - 如何发送带有 json 多部分正文和图像文件的 OkHttp post 请求

标签 android okhttp square

我想发送一个 post 请求,我必须在其中发送一些数据,其中包括 json 格式的数据和一个图像文件。

当我单独发送请求时,它工作正常,但不能一起工作。

请在这里帮助我,如何实现这一目标。

我用来发送json格式数据的是什么:

Map<String, String> map = new HashMap<>();
postParam.put("title", "XYZ");
postParam.put("isGroup", "true");
postParam.put("ownerId", "123");
JSONArray jsonArray = new JSONArray();
jsonArray.put("1");
jsonArray.put("2");
jsonArray.put("2");
postParam.put("groupMembers", jsonArray.toString());
MediaType JSON = MediaType.parse("application/json");
JSONObject parameter = new JSONObject(postParam);
RequestBody body = RequestBody.create(JSON, parameter.toString());
Request request = new Request.Builder()
            .url(postUrl)
            .addHeader("content-type", "application/json; charset=utf-8")
            .post(body)
            .build();

当我没有使用该文件时,它工作正常。 但是我必须通过此请求将图像文件作为多部分数据发送,然后是如何发送。

最佳答案

Kotlin 用法

尝试使用这段代码。它适用于我的情况。让我知道它是否有效并使其成为正确答案(:

    private const val CONNECT_TIMEOUT = 15L
    private const val READ_TIMEOUT = 15L
    private const val WRITE_TIMEOUT = 15L

    private fun performPostRequest(urlString: String, jsonString: String, image: File, token: String): String? {
        /* https://github.com/square/okhttp#requirements
        OkHttp uses your platform's built-in TLS implementation.
        On Java platforms OkHttp also supports Conscrypt,
        which integrates BoringSSL with Java.
        OkHttp will use Conscrypt if it is the first security provider: */
        Security.insertProviderAt(Conscrypt.newProvider(), 1)

        return try {
            val client = OkHttpClient.Builder()
                .connectTimeout(CONNECT_TIMEOUT, TimeUnit.SECONDS)
                .writeTimeout(WRITE_TIMEOUT, TimeUnit.SECONDS)
                .readTimeout(READ_TIMEOUT, TimeUnit.SECONDS)
                .build()

            val body: RequestBody = MultipartBody.Builder().setType(MultipartBody.FORM)
                .addFormDataPart("parameterNameInServerSideJSON", jsonString)
                .addFormDataPart("parameterNameInServerSideImage", "test.jpeg", image.asRequestBody("image/jpg".toMediaTypeOrNull()))
                .build()

            val request = Request.Builder()
                .url(URL(urlString))
                .header("Authorization", token) // in case you use authorization
                .post(body)
                .build()

            val response = client.newCall(request).execute()
            response.body?.string()
        }
        catch (e: IOException) {
            e.printStackTrace()
            null
        }
    }

我用过这个版本的okhttp

    implementation 'com.squareup.okhttp3:okhttp:4.3.1'

关于android - 如何发送带有 json 多部分正文和图像文件的 OkHttp post 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49685527/

相关文章:

javascript - 使用沙盒帐户时出现 API 错误

android - 更新gradle-./gradlew:找不到此类文件

java - 使用 eBay 的库存 API 改造 + OkHTTP

android - OkHttp:SSLPeerUnverifiedException 无法找到签署 X.509 证书的可信证书

java - Square Tape file backed queue 可以从 android 的主线程使用吗?

java - Okhttp3 在 Android Studio 中看不到 WebSocket 接口(interface)

android - 重复的背景图像被拉伸(stretch)

java - 如何使用 google-api-client 通过 Android 检索 google 日历事件

java - 动态更改按钮文本。

java - OkHttpClient - 忽略系统属性中的代理