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

时间:2019-07-18 18:13:15

标签: 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();
  }
}

如果有人能解决它,我将不胜感激。

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

9 个答案:

答案 0 :(得分:42)

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

科特琳解决方案: 使用扩展功能content.toRequestBody(contentType); 为文件类型file.asRequestBody(contentType)

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

给出的示例

更多信息:文档

(在Android Studio或任何Jetbrain的IDE中,只需按住 Ctrl 并单击create(...)的{​​{1}},即可找到不推荐使用的方法或类的解决方案)

答案 1 :(得分: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())

答案 2 :(得分:8)

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

import okhttp3.MediaType.Companion.toMediaTypeOrNull
import okhttp3.RequestBody.Companion.asRequestBody

并用作

val file = File("path")
file.asRequestBody("image/jpeg".toMediaTypeOrNull())

答案 3 :(得分:1)

version 4.0.0 of okhttp3起已弃用。

该版本的文档说

@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)

我还没有尝试过,但是我相信您应该做以下事情:

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();
    }
  }

}

更新:我尝试使用以下依赖项版本来编译上面显示的文件,RequestBody.Companion.create(json, JSON)似乎没有被弃用。

<dependency>
    <groupId>com.squareup.okhttp3</groupId>
    <artifactId>okhttp</artifactId>
    <version>4.0.0</version>
</dependency>

答案 4 :(得分:0)

只是快速浏览了文档。读取已弃用,但是文档中提供了替代方法。
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();
  }
}

答案 5 :(得分:0)

根据okhttp的确定4更新为官方文档的许多东西

RequestBody.create()升级到File.asRequestBody()

答案 6 :(得分:0)

你只需要翻转你的参数。

@kotlin.jvm.JvmStatic @kotlin.Deprecated public final fun create(contentType: okhttp3.MediaType?, file: java.io.File): okhttp3.RequestBody { }

    @kotlin.jvm.JvmStatic @kotlin.Deprecated @kotlin.jvm.JvmOverloads public final fun create(contentType: okhttp3.MediaType?, content: kotlin.ByteArray, offset: kotlin.Int , byteCount: kotlin.Int): okhttp3.RequestBody {}

    @kotlin.jvm.JvmStatic @kotlin.Deprecated public final fun create(contentType: okhttp3.MediaType?, content: kotlin.String): okhttp3.RequestBody {}

    @kotlin.jvm.JvmStatic @kotlin.Deprecated public final fun create(contentType: okhttp3.MediaType?, content: okio.ByteString): okhttp3.RequestBody { }

答案 7 :(得分:0)

你可以这样更新吗

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)

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())

答案 8 :(得分:0)

只需更改ResponseBody.create(MediaType.parse("text/json"), plainBody.trim())ResponseBody.create(plainBody.trim(),MediaType.parse("text/json"))