Okhttp3 – RequestBody.create(contentType, content) Obsoleto

6 minutos de lectura

avatar de usuario
matias

No encontré ningún ejemplo de cómo reemplazar el método de obsolescencia. Los ejemplos en la página principal de okhttp3 son antiguos. Este es uno de ellos:

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

Si alguien pudo solucionarlo, agradecería su ayuda.

Actualización: estoy usando ‘com.squareup.okhttp3:okhttp:4.0.1’

  • No parece estar en desuso: cuadrado.github.io/okhttp/3.x/okhttp/okhttp3/…

    – JB Nizet

    18 de julio de 2019 a las 18:21

  • Estoy usando ‘com.squareup.okhttp3:okhttp:4.2.1’, y todas las sugerencias en este SO y otras que he buscado durante las últimas 2 horas están depreciadas o no pueden ser resueltas por el IDE. Intenté importar bibliotecas manualmente y cualquier otra sugerencia que pueda encontrar en SO y en la documentación de okHttp, no funciona. No puedo creer que algo tan usado sea tan difícil de usar. Si hay alguien por ahí que pueda ayudar (¿Jake?), solo necesito llamar a api con un postBody en blanco. En Postman, se llama como “publicación (null)”. Gracias por cualquier sugerencia que alguien tenga por adelantado.

    – jonathan3087

    20 de noviembre de 2019 a las 17:55


avatar de usuario
yutang

Solución Java:
Usar create(String, MediaType) en vez de create(MediaType, String) por ejemplo

Solución Kotlin:
Usar la función de extensión content.toRequestBody(contentType); para el tipo de archivo file.asRequestBody(contentType)

Nota:
Estoy usando kotlin, pero mi IDE simplemente no importa automáticamente la clase o el método como import okhttp3.RequestBody.Companion.toRequestBodyasí que lo importo manualmente… luego lo uso como el ejemplo dado por Saeed Younus y Pratyesh a continuación

Para más: La documentación

(En Android Studio o cualquier IDE de Jetbrain, la solución a los métodos o clases en desuso se puede encontrar simplemente manteniendo presionada la tecla Control y haciendo clic en el create(...) de RequestBody.create)

  • necesita importar manualmente okhttp3.RequestBody.Companion.asRequestBody usar archivo.asReqestBody y okhttp3.RequestBody.Companion.toRequestBody usar contenido.toRequestBody

    – Maestro Zzzing

    14 de febrero de 2020 a las 4:40


  • @YuTang, ¿qué es el contenido en content.RequestBody? ¿Significa esto que puedo pasar content:// uri?

    – Sudhir Singh Khanger

    14 de abril de 2020 a las 17:51

  • @Sudhir Khanger, la cadena de contenido puede ser cualquier cosa que desee publicar en el servidor posterior, como JSON.

    – YuTang

    18 de abril de 2020 a las 2:38

  • para tal desaprobación genérica, android studio o intellij solo debería tener un botón de corrección, en lugar de solo suprimir …

    – Fuego de Dragon

    7 de junio de 2020 a las 4:45

  • Como dijo DragonFire, cuando su IDE es android studio o intellij. solo para ubicar el cursor en la función obsoleta y usar Alt + Enterelige la opción de arreglar, creo que eso es lo que quieres.

    – YuTang

    7 de junio de 2020 a las 6:18

avatar de usuario
Pratyesh

En com.squareup.okhttp3:okhttp:4.1.0

MediaType.get("application/json; charset=utf-8") no hay más disponible.

en su lugar esto tenemos que usar "application/json; charset=utf-8".toMediaTypeOrNull().

Por ejemplo, cómo necesitamos crear el cuerpo de la solicitud ahora ya que 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())

¡A aquellos que se preguntan de dónde vienen las respuestas!

Todas las alternativas/soluciones (como se describe en la respuesta) están documentadas en el código obsoleto correspondiente! Simplemente maniobre hacia él (el código obsoleto) usando cualquier medio que admita su IDE. Por ejemplopara ver la alternativa/solución al código obsoleto RequestBody.create(...,...) cuando usas Estudio Android o cualquier IDE de Jetbrainsolo mantén presionado Ctrl y pasa el cursor sobre el RequestBody.create(...,...) luego haga clic en él cuando se desplace con éxito

  • Desearía que esto se importara automáticamente

    – Jaime

    4 sep 2019 a las 14:56

Debe importar estos archivos manualmente, puede que se trate de un error en el estudio de Android. No se sugiere, pero esto funciona para Okhttp 4.2.2

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

y usar como

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

  • ¿podría ayudarme a implementar este código aquí stackoverflow.com/questions/64744692/… ?

    – sara

    9 de noviembre de 2020 a las 1:40

avatar de usuario
jlmayorga

Estaba en desuso desde versión 4.0.0 de okhttp3.

La documentación para esa versión dice

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

No lo he probado pero creo que deberías ser bueno haciendo lo siguiente:

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

}

Actualizar: Traté de compilar el archivo que se muestra arriba usando la siguiente versión de dependencia y RequestBody.Companion.create(json, JSON) no parece estar en desuso.

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

solo cambia ResponseBody.create(MediaType.parse("text/json"), plainBody.trim())
a ResponseBody.create(plainBody.trim(),MediaType.parse("text/json"))

avatar de usuario
Nankai

puedes actualizar asi

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)

a

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

Acabo de echar un vistazo rápido a la documentación. Se lee en desuso, sin embargo, la alternativa se proporciona en el documento.
json.toRequestBody(contentType) debería hacer el truco por ti.
A continuación se muestra el enlace de la documentación:
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();
  }
}

  • Esto no funcionará, la variable json es una cadena y no tiene el método toRequestBody

    – jlmayorga

    18 de julio de 2019 a las 18:43

  • Perdón estaba pensando en Kotlin. En java sería una función estática importada del paquete.

    – Arpan Kanthal

    18 de julio de 2019 a las 19:08

  • @jlmayorga: Tenías razón. Votar tu respuesta porque la mía es un duplicado

    – Arpan Kanthal

    18 de julio de 2019 a las 19:43

  • La URL proporcionada está rota

    – BarbetNL

    27 de junio a las 10:27

¿Ha sido útil esta solución?