web-dev-qa-db-fra.com

Comment obtenir une réponse sous forme de chaîne en utilisant retrofit sans utiliser GSON ou toute autre bibliothèque dans android

J'essaie d'obtenir une réponse de l'API suivante:

https://api.github.com/users/username

Mais je ne sais pas comment obtenir une réponse en tant que String afin de pouvoir utiliser le String pour analyser et obtenir le JSONObject.

Version de rattrapage utilisée:

modification: 2.0.0-beta1

J'ai essayé jusqu'à présent:

public interface GitHubService {
        @GET("/users/{user}")
        public String listRepos(@Path("user") String user,Callback<String> callback);
    }

recherche:

GitHubService service = retrofit.create(GitHubService.class);
        service.listRepos("username", new Callback<String>() {
            @Override
            public void onResponse(Response response) {
                System.out.println(response.toString());
            }

            @Override
            public void onFailure(Throwable t) {

            }
        });

exception:

Caused by: Java.lang.IllegalArgumentException: Could not locate call adapter for class Java.lang.String. Tried:
    * retrofit.ExecutorCallAdapterFactory
            at retrofit.Utils.resolveCallAdapter(Utils.Java:67)
            at retrofit.MethodHandler.createCallAdapter(MethodHandler.Java:49)

Toute aide sera grandement appréciée.

94
Aakash

** Mise à jour ** Un convertisseur scalaire a été ajouté à la conversion pour permettre une réponse String avec moins de cérémonie que ma réponse originale ci-dessous.

Exemple d'interface -

public interface GitHubService {
    @GET("/users/{user}")
    Call<String> listRepos(@Path("user") String user);
}

Ajoutez le ScalarsConverterFactory à votre constructeur de rénovation. Remarque: Si vous utilisez ScalarsConverterFactory et une autre fabrique, ajoutez d'abord la fabrique de scalaires.

Retrofit retrofit = new Retrofit.Builder()
    .baseUrl(BASE_URL)
    .addConverterFactory(ScalarsConverterFactory.create())
    // add other factories here, if needed.
    .build();

Vous devrez également inclure le convertisseur de scalaires dans votre fichier gradle -

implementation 'com.squareup.retrofit2:converter-scalars:2.1.0'

--- Réponse originale (fonctionne toujours, juste plus de code) ---

Je suis d'accord avec @CommonsWare pour dire qu'il semble un peu étrange que vous souhaitiez intercepter la demande de traitement du JSON vous-même. La plupart du temps, le POJO dispose de toutes les données dont vous avez besoin, vous n'avez donc pas besoin de vous perdre dans les terres de JSONObject. Je pense que votre problème spécifique pourrait être mieux résolu en utilisant un gson personnalisé TypeAdapter ou une adaptation ultérieure Converter si vous devez manipuler le JSON. Cependant, la mise à niveau fournit davantage la simple analyse JSON via Gson. Il gère également de nombreuses autres tâches fastidieuses impliquées dans les requêtes REST. Ce n’est pas parce que vous ne voulez pas utiliser l’une des fonctionnalités que vous devez tout jeter à la poubelle. Il y a des moments où vous voulez juste obtenir le flux brut, alors voici comment le faire -

Premièrement, si vous utilisez Retrofit 2, vous devez commencer à utiliser l’API Call. Au lieu d’envoyer un objet à convertir en tant que paramètre de type, utilisez ResponseBody de okhttp -

public interface GitHubService {
    @GET("/users/{user}")
    Call<ResponseBody> listRepos(@Path("user") String user);
}

alors vous pouvez créer et exécuter votre appel -

GitHubService service = retrofit.create(GitHubService.class);
Call<ResponseBody> result = service.listRepos(username);
result.enqueue(new Callback<ResponseBody>() {
    @Override
    public void onResponse(Response<ResponseBody> response) {
        try {
            System.out.println(response.body().string());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onFailure(Throwable t) {
        e.printStackTrace();
    }
});

Remarque Le code ci-dessus appelle string() sur l'objet de réponse, qui lit l'intégralité de la réponse dans une chaîne. Si vous transmettez le corps à quelque chose qui peut ingérer des flux, vous pouvez plutôt appeler charStream(). Voir la documentation ResponseBody .

193
iagreen