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.
** 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
.