Reactie krijgen als String met retrofit zonder GSON of een andere bibliotheek in Android te gebruiken

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 Stringkan gebruiken om het JSONObjectte 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 ScalarsConverterFactorytoe aan uw retrofit-builder. Opmerking:Als u ScalarsConverterFactoryen 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 TypeAdapterof een retrofit Converterals 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 Callgaan gebruiken. Gebruik ResponseBodyvan 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 .

Other episodes