Ik probeer een reactie te krijgen van de volgende API:
https://api.github.com/users/username
Maar ik weet niet hoe ik een reactie kan krijgen als String
, zodat ik de String
kan gebruiken om het JSONObject
te ontleden en te verkrijgen.
Gebruikte retrofit-versie:
retrofit:2.0.0-beta1
Ik heb dit tot nu toe geprobeerd:
public interface GitHubService {
@GET("/users/{user}")
public String listRepos(@Path("user") String user,Callback<String> callback);
}
ophalen :
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) {
}
});
uitzondering:
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)
Alle hulp wordt zeer op prijs gesteld.
Antwoord 1, autoriteit 100%
** Update ** Er is een scalar-converter toegevoegd om achteraf een String
-reactie mogelijk te maken met minder ceremonie dan mijn oorspronkelijke antwoord hieronder.
Voorbeeld interface —
public interface GitHubService {
@GET("/users/{user}")
Call<String> listRepos(@Path("user") String user);
}
Voeg de ScalarsConverterFactory
toe aan uw retrofit-builder. Opmerking:Als u ScalarsConverterFactory
en een andere fabriek gebruikt, voeg dan eerst de scalarsfabriek toe.
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(ScalarsConverterFactory.create())
// add other factories here, if needed.
.build();
Je moet ook de scalar-converter in je gradle-bestand opnemen —
implementation 'com.squareup.retrofit2:converter-scalars:2.1.0'
— Oorspronkelijk antwoord(werkt nog, alleen meer code) —
Ik ben het met @CommonsWare eens dat het een beetje vreemd lijkt dat je het verzoek om de JSON zelf te verwerken wilt onderscheppen. Meestal heeft de POJO alle gegevens die je nodig hebt, dus je hoeft niet te rommelen in JSONObject
-land. Ik vermoed dat uw specifieke probleem beter kan worden opgelost met een aangepaste gson TypeAdapter
of een retrofit Converter
als u de JSON moet manipuleren. Retrofit biedt echter meer de alleen JSON-parsing via Gson. Het beheert ook veel van de andere vervelende taken die betrokken zijn bij REST-verzoeken. Alleen omdat je een van de functies niet wilt gebruiken, wil nog niet zeggen dat je het hele ding moet weggooien. Er zijn momenten dat je gewoon de onbewerkte stream wilt hebben, dus hier is hoe je het doet –
Als u Retrofit 2 gebruikt, moet u eerst de API Call
gaan gebruiken. Gebruik ResponseBody
van okhttp —
in plaats van een te converteren object als de typeparameter te verzenden.
public interface GitHubService {
@GET("/users/{user}")
Call<ResponseBody> listRepos(@Path("user") String user);
}
dan kunt u uw oproep maken en uitvoeren —
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();
}
});
OpmerkingDe bovenstaande code roept string()
aan op het antwoordobject, dat het volledige antwoord in een tekenreeks leest. Als je het lichaam doorgeeft aan iets dat streams kan opnemen, kun je in plaats daarvan charStream()
aanroepen. Zie de ResponseBody
-documenten .