wake-up-neo.com

So erhalten Sie eine Antwort als String mit Retrofit ohne Verwendung von GSON oder einer anderen Bibliothek in android

Ich versuche, eine Antwort von der folgenden API zu erhalten:

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

Aber ich weiß nicht, wie ich eine Antwort als String erhalten soll, damit ich mit dem String den JSONObject analysieren und abrufen kann.

Nachrüstversion verwendet:

nachrüstung: 2.0.0-beta1

Ich habe das bis jetzt versucht:

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

Abrufen:

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

            }
        });

Ausnahme:

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)

Jede Hilfe wäre sehr dankbar.

94
Aakash

** Update ** Ein Skalarkonverter wurde zum Nachrüsten hinzugefügt, der eine String - Antwort mit weniger Zeremonie als meine ursprüngliche Antwort unten ermöglicht.

Beispiel Interface -

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

Fügen Sie Ihrem Retrofit Builder die ScalarsConverterFactory hinzu. Hinweis: Wenn Sie ScalarsConverterFactory und eine andere Factory verwenden, fügen Sie zuerst die Skalar-Factory hinzu.

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

Sie müssen auch den Skalarkonverter in Ihre gradle-Datei aufnehmen -

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

--- Originalantwort (funktioniert immer noch, nur mehr Code) ---

Ich stimme mit @CommonsWare überein, dass es etwas seltsam erscheint, dass Sie die Anfrage abfangen möchten, um den JSON selbst zu verarbeiten. In den meisten Fällen verfügt der POJO über alle Daten, die Sie benötigen, sodass Sie nicht im Land JSONObject herumspielen müssen. Ich vermute, dass Ihr spezielles Problem möglicherweise besser mit einer benutzerdefinierten gson TypeAdapter oder einer Nachrüstung Converter gelöst werden kann, wenn Sie die JSON manipulieren müssen. Retrofit bietet jedoch mehr als nur das JSON-Parsing über Gson. Es verwaltet auch viele andere mühsame Aufgaben, die mit REST) - Anfragen verbunden sind. Nur weil Sie eine der Funktionen nicht verwenden möchten, müssen Sie das Ganze nicht wegwerfen Es gibt Zeiten, in denen Sie nur den Rohdatenstrom abrufen möchten.

Wenn Sie Retrofit 2 verwenden, sollten Sie zunächst die API Call verwenden. Anstatt ein zu konvertierendes Objekt als Typparameter zu senden, verwenden Sie ResponseBody von okhttp -

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

dann können Sie Ihren Anruf erstellen und ausführen -

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

Hinweis Der obige Code ruft string() für das Antwortobjekt auf, das die gesamte Antwort in einen String liest. Wenn Sie den Körper an etwas weitergeben, das Streams aufnehmen kann, können Sie stattdessen charStream() aufrufen. Siehe die ResponseBody -Dokumente.

193
iagreen