web-dev-qa-db-fra.com

Okhttp3 - RequestBody.create (contentType, content) Déconseillé

Je n'ai trouvé aucun exemple de la façon de remplacer la méthode de dépréciation. Les exemples de la page principale okhttp3 sont anciens. C'est l'un d'eux:

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 quelqu'un pouvait le résoudre, j'apprécierais votre aide.

Mise à jour: j'utilise 'com.squareup.okhttp3: okhttp: 4.0.1'

39
Matías

Solution Java: Utilisez create(String, MediaType) au lieu de create(MediaType, String) par exemple

Solution Kotlin: Utilisez la fonction d'extension content.toRequestBody(contentType); pour le type de fichier file.asRequestBody(contentType)

Note: J'utilise kotlin, mais mon IDE n'importe pas automatiquement la classe ou la méthode comme import okhttp3.RequestBody.Companion.toRequestBody, Donc je l'importe manuellement ... puis utilisez-le comme exemple donné par @Pratyesh

Pour en savoir plus: La documentation

(Dans Android Studio ou n'importe quel IDE Jetbrain, la solution aux méthodes ou classes obsolètes peut être trouvée en maintenant simplement la Ctrl et en cliquant sur la fonction create(...) de RequestBody.create)

60
YuTang

Dans com.squareup.okhttp3: okhttp: 4.1.0

MediaType.get("application/json; charset=utf-8") plus disponible.

au lieu de cela, nous devons utiliser "application/json; charset=utf-8".toMediaTypeOrNull().

Par exemple, comment nous devons créer le corps de la demande maintenant depuis 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 ceux qui se demandent d'où viennent les réponses!

Toutes les alternatives/solutions (comme décrit par la réponse) sont documentées dans le code obsolète correspondant! Manoeuvrez-le simplement (le code obsolète) en utilisant ce que signifie votre IDE supporte. Par exemple , pour voir l'alternative/solution au code obsolète RequestBody.create(...,...) lors de l'utilisation AndroidStudio ou n'importe quel IDE de Jetbrain, appuyez longuement sur Ctrl et survolez la RequestBody.create(...,...) puis cliquez dessus quand elle est survolée avec succès

17
Pratyesh

Vous devez importer ces fichiers manuellement. Il s'agit peut-être d'un bogue dans Android studio. Ce n'est pas suggéré, mais cela fonctionne pour Okhttp 4.2.2

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

et utiliser comme

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

Il est obsolète depuis version 4.0.0 de okhttp .

La documentation de cette version indique

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

Je ne l'ai pas essayé mais je pense que vous devriez être bon en faisant ce qui suit:

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

}

Mise à jour: J'ai essayé de compiler le fichier montré ci-dessus en utilisant la version de dépendance suivante et RequestBody.Companion.create(json, JSON) ne semble pas être obsolète.

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

Je viens de jeter un coup d'œil à la documentation. Il se lit obsolète, cependant l'alternative est fournie dans le doc.
json.toRequestBody (contentType) devrait faire l'affaire pour vous.
Ci-dessous le lien de documentation:
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();
  }
}
1
Arpan Kanthal