87

私は OAuth を使用しており、リクエストを行うたびに OAuth トークンをヘッダーに入れる必要があります。注釈が表示@Headerされますが、実行時に渡すことができるようにパラメーター化する方法はありますか?

コンセプトはこちら

@Header({Authorization:'OAuth {var}', api_version={var} })

実行時にそれらを渡すことができますか?

@GET("/users")
void getUsers(
    @Header("Authorization") String auth, 
    @Header("X-Api-Version") String version, 
    Callback<User> callback
)
4

4 に答える 4

100

@Header パラメータを使用する以外に、RequestInterceptor を使用して、インターフェイスを変更せずにすべてのリクエストを更新したいと思います。次のようなものを使用します。

RestAdapter.Builder builder = new RestAdapter.Builder()
    .setRequestInterceptor(new RequestInterceptor() {
        @Override
        public void intercept(RequestFacade request) {
            request.addHeader("Accept", "application/json;versions=1");
            if (isUserLoggedIn()) {
                request.addHeader("Authorization", getToken());
            }                    
        }
    });

p/s : Retrofit2 を使用している場合は、Interceptor代わりに使用する必要があります。RequestInterceptor

RequestInterceptorRetrofit 2.0 では使用できなくなったため

于 2013-12-10T11:32:37.367 に答える
56

はい、実行時に渡すことができます。実際のところ、あなたがタイプしたのとほとんど同じです。これは、たとえばSecretApiInterface.javaという名前の API インターフェイス クラスにあります。

public interface SecretApiInterface {

    @GET("/secret_things")
    SecretThing.List getSecretThings(@Header("Authorization") String token)

}

次に、リクエストからこのインターフェースにパラメーターを渡します。これらの行に沿って何かを渡します: (このファイルは、たとえばSecretThingRequest.javaになります)

public class SecretThingRequest extends RetrofitSpiceRequest<SecretThing.List, SecretApiInteface>{

    private String token;

    public SecretThingRequest(String token) {
        super(SecretThing.List.class, SecretApiInterface.class);
        this.token = token;
    }

    @Override
    public SecretThing.List loadDataFromNetwork() {
        SecretApiInterface service = getService();
        return service.getSecretThings(Somehow.Magically.getToken());
    }
}

Somehow.Magically.getToken()トークンを返すメソッド呼び出しは どこにありますか。それをどこでどのように定義するかはあなた次第です。

もちろん、あなたの場合のように、インターフェイスの実装に複数の@Header("Blah") String blah注釈を含めることができます!

私も紛らわしいと思いました.ドキュメントには、ヘッダーを置き換えると明確に書かれていますが、そうではありません!
実際には@Headers("hardcoded_string_of_liited_use")注釈と同じように追加されます

お役に立てれば ;)

于 2013-09-12T01:29:13.160 に答える
37

受け入れられた答えは、Retrofit の古いバージョンに対するものです。将来の視聴者のために、Retrofit2.0 でこれを行う方法は、カスタム OkHttp クライアントを使用することです。

OkHttpClient httpClient = new OkHttpClient.Builder()
  .addInterceptor(new Interceptor() {
    @Override
    public Response intercept(Chain chain) throws IOException {
      Builder ongoing = chain.request().newBuilder();
      ongoing.addHeader("Accept", "application/json;versions=1");
      if (isUserLoggedIn()) {
        ongoing.addHeader("Authorization", getToken());
      }
      return chain.proceed(ongoing.build());
    }
  })
  .build();

Retrofit retrofit = new Retrofit.Builder()
  // ... extra config
  .client(httpClient)
  .build();

それが誰かを助けることを願っています。:)

于 2016-04-21T14:59:35.063 に答える
8

レトロフィット 2.3.0

OkHttpClient.Builder okHttpClientBuilder = new OkHttpClient.Builder();
    okHttpClientBuilder
            .addInterceptor(new Interceptor() {
                @Override
                public okhttp3.Response intercept(Chain chain) throws IOException {
                    Request request = chain.request();
                    Request.Builder newRequest = request.newBuilder().header("Authorization", accessToken);
                    return chain.proceed(newRequest.build());
                }
            });

    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(GithubService.BASE_URL)
            .client(okHttpClientBuilder.build())
            .addConverterFactory(GsonConverterFactory.create())
            .build();

これを使用してGitHubに接続しています。

于 2018-08-10T20:20:53.490 に答える