Okhttp3-不推荐使用RequestBody.create(contentType,content)

Mat*_*ías 13 java okhttp okhttp3

我没有找到任何有关如何替换弃用方法的示例。okhttp3主页上的示例很旧。这是其中之一:

public static final MediaType JSON = MediaType.get("application/json; charset=utf-8");

OkHttpClient client = new OkHttpClient();

String post(String url, String json) throws IOException {
    RequestBody body = RequestBody.create(JSON, json);
      Request request = new Request.Builder()
          .url(url)
          .post(body)
          .build();
  try (Response response = client.newCall(request).execute()) {
    return response.body().string();
  }
}
Run Code Online (Sandbox Code Playgroud)

如果有人可以解决,请多多帮助。

更新:我正在使用'com.squareup.okhttp3:okhttp:4.0.1'

YuT*_*ang 34

Java解决方案: 使用create(String, MediaType)代替create(MediaType, String)例如

Kotlin解决方案: 使用扩展功能content.toRequestBody(contentType);对于文件类型file.asRequestBody(contentType)

注意: 我使用的是kotlin,但是我的IDE不会自动导入像import okhttp3.RequestBody.Companion.toRequestBody这样的类或方法,因此我手动将其导入...然后将其用作@Pratyesh给出的示例

有关更多信息:文档

(例如,在Android Studio中或任何Jetbrain的IDE,解决过时方法或类可以通过仅保持所找到的Ctrl键和点击create(...)RequestBody.create

  • 需要手动导入 *okhttp3.RequestBody.Companion.asRequestBody* 才能使用 *file.asReqestBody* 和 *okhttp3.RequestBody.Companion.toRequestBody* 才能使用 *content.toRequestBody* (4认同)

Pra*_*esh 11

在com.squareup.okhttp3:okhttp:4.1.0中

MediaType.get("application/json; charset=utf-8") 没有更多可用。

相反,我们需要使用"application/json; charset=utf-8".toMediaTypeOrNull()

例如,从现在开始,我们现在需要如何创建请求主体 okhttp:4.1.0

import okhttp3.MediaType.Companion.toMediaTypeOrNull
import okhttp3.RequestBody.Companion.toRequestBody

    val jsonObject = JSONObject()
        jsonObject.put("name", "Ancd test")
        jsonObject.put("city", "delhi")
        jsonObject.put("age", "23")
    val body = jsonObject.toString().toRequestBody("application/json; charset=utf-8".toMediaTypeOrNull())
Run Code Online (Sandbox Code Playgroud)

  • 我希望这会自动导入 (4认同)

小智 7

你可以这样更新吗

val apiRequest = RequestBody.create(MediaType.parse("text/plain;charset=utf-8"), "edit_group")
val tokenRequest = RequestBody.create(MediaType.parse("text/plain;charset=utf-8"), token)
val fileReqBody = RequestBody.create(MediaType.parse("image/*"), file)
Run Code Online (Sandbox Code Playgroud)

val apiRequest = "edit_group".toRequestBody("text/plain;charset=utf-8".toMediaType())
val tokenRequest = token.toRequestBody("text/plain;charset=utf-8".toMediaType())
val file = File(path)
val fileReqBody = file.asRequestBody("image/*".toMediaType())
Run Code Online (Sandbox Code Playgroud)


jlm*_*rga 5

okhttp3的4.0.0版本开始不推荐使用。

该版本的文档说

@JvmStatic
    @Deprecated(
        message = "Moved to extension function. Put the 'content' argument first to fix Java",
        replaceWith = ReplaceWith(
            expression = "content.toRequestBody(contentType)",
            imports = ["okhttp3.RequestBody.Companion.toRequestBody"]
        ),
        level = DeprecationLevel.WARNING)
    fun create(contentType: MediaType?, content: String) = content.toRequestBody(contentType)
Run Code Online (Sandbox Code Playgroud)

我没有尝试过,但是我相信您可以通过以下操作来做到这一点:

@JvmStatic
    @Deprecated(
        message = "Moved to extension function. Put the 'content' argument first to fix Java",
        replaceWith = ReplaceWith(
            expression = "content.toRequestBody(contentType)",
            imports = ["okhttp3.RequestBody.Companion.toRequestBody"]
        ),
        level = DeprecationLevel.WARNING)
    fun create(contentType: MediaType?, content: String) = content.toRequestBody(contentType)
Run Code Online (Sandbox Code Playgroud)

更新:我尝试使用以下依赖项版本编译上面显示的文件,并且RequestBody.Companion.create(json, JSON)似乎不建议使用。

package com.example;

import java.io.IOException;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;

public class Test {

  public static final MediaType JSON = MediaType.get("application/json; charset=utf-8");


  OkHttpClient client = new OkHttpClient();

  public static void main(String[] args) {

  }

  String post(String url, String json) throws IOException {
    //RequestBody body = RequestBody.create(JSON, json);
    RequestBody body = RequestBody.Companion.create(json, JSON);

    Request request = new Request.Builder()
        .url(url)
        .post(body)
        .build();
    try (Response response = client.newCall(request).execute()) {
      return response.body().string();
    }
  }

}

Run Code Online (Sandbox Code Playgroud)


小智 5

您需要手动导入这些文件,这可能是android studio中的错误。不建议使用,但适用于Okhttp 4.2.2

import okhttp3.MediaType.Companion.toMediaTypeOrNull
import okhttp3.RequestBody.Companion.asRequestBody
Run Code Online (Sandbox Code Playgroud)

并用作

val file = File("path")
file.asRequestBody("image/jpeg".toMediaTypeOrNull())
Run Code Online (Sandbox Code Playgroud)


Arp*_*hal 3

刚刚快速浏览了文档。它显示已弃用,但文档中提供了替代方案。
json.toRequestBody(contentType) 应该可以满足您的要求。
以下是文档链接:
https://github.com/square/okhttp/blob/master/okhttp/src/main/java/okhttp3/RequestBody.kt

public static final MediaType JSON = MediaType.get("application/json; charset=utf-8");

OkHttpClient client = new OkHttpClient();

String post(String url, String json) throws IOException {
    RequestBody body = RequestBody.Companion.create(json, JSON)
      Request request = new Request.Builder()
          .url(url)
          .post(body)
          .build();
  try (Response response = client.newCall(request).execute()) {
    return response.body().string();
  }
}
Run Code Online (Sandbox Code Playgroud)