web-dev-qa-db-ja.com

AndroidでGSONやその他のライブラリを使用せずにレトロフィットを使用してStringとして応答を取得する方法

私は次のApiから応答を得ようとしています。

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

しかし、Stringname__として解析して取得するためにStringname__を使用できるように、JSONObjectname__として応答を取得する方法はわかりません。

使用した後付けバージョン:

後付け:2.0.0-beta1

私は今までこれを試してみました:

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

取得中:

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

            }
        });

例外:

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)

どんな助けでも本当に感謝されるでしょう。

92
Aakash

**更新**以下の私の元の答えより少ない儀式でString応答を可能にするスカラ変換器が後付けに追加されました。

サンプルインターフェース -

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

レトロフィットビルダーにScalarsConverterFactoryを追加します。 注:ScalarsConverterFactoryおよび他のファクトリを使用している場合は、最初にスカラファクトリを追加します。

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

あなたはまたあなたのgradleファイルにスカラーコンバーターを含める必要があるでしょう -

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

---オリジナルの回答(まだ動作します、もっと多くのコード)---

私は@CommonsWareに同意します。あなたがJSONを自分で処理する要求を傍受したいのはちょっと変だと思います。ほとんどの場合POJOはあなたが必要とするすべてのデータを持っているので、JSONObjectの土地にいじわる必要はありません。 JSONを操作する必要がある場合は、カスタムgson TypeAdapter またはレトロフィット Converter を使用して、特定の問題を解決することをお勧めします。しかし、retrofitはGsonを介した単なるJSON構文解析を提供します。また、REST要求に関連する面倒なその他の多くのタスクも管理します。あなたがこれらの機能の1つを使いたくないという理由だけで、あなたが全部を捨てなければならないというわけではありません。あなたが生のストリームを取得したい時があるので、ここにそれを行う方法があります -

まず、Retrofit 2を使用している場合は、Call APIの使用を開始する必要があります。変換するオブジェクトをtypeパラメータとして送信する代わりに、okhttpのResponseBodyを使用します -

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

それからあなたはあなたの呼び出しを作成し実行することができます -

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

上記のコードでは、応答オブジェクトに対してstring()を呼び出します。これにより、応答全体がStringに読み込まれます。ストリームを取り込むことができるものに本体を渡す場合は、代わりにcharStream()を呼び出すことができます。 ResponseBody のドキュメントを参照してください。

188
iagreen