如何在Retrofit 2.1.0中传递请求头信息

3

你好,最近我一直在使用Retrofit,但遇到了问题,请有经验的人帮忙解决。我已经尝试过多种方法在Retrofit中传递标题,但都没有成功。我的Retrofit版本是2.0.1。

build.gradle文件

compile 'com.google.code.gson:gson:2.6.2'
compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.squareup.okhttp3:logging-interceptor:3.3.1'
compile 'com.squareup.okhttp:okhttp:2.7.2'
compile 'com.squareup.retrofit2:converter-gson:2.1.0'

在ApiClientHeader.java中。
        import okhttp3.Interceptor;
        import okhttp3.OkHttpClient;
        import okhttp3.Request;
        import okhttp3.Response;
        import retrofit2.Retrofit;
        import retrofit2.converter.gson.GsonConverterFactory;

        public class ApiClientHeader {

        public static final String BASE_URL = "URL";
        private static Retrofit retrofit = null;


        public static Retrofit getClient(final String token) {


            OkHttpClient okClient = new OkHttpClient.Builder()
                    .addInterceptor(
                            new Interceptor() {
                                @Override
                                public Response intercept(Interceptor.Chain chain) throws IOException {
                                    Request original = chain.request();

                                    // Request customization: add request headers
                                    Request.Builder requestBuilder = original.newBuilder()
                                            .header("Authorization", "Bearer " + token)
                                            .method(original.method(), original.body());

                                    Request request = requestBuilder.build();
                                    return chain.proceed(request);
                                }
                            })
                    .build();


            if (retrofit == null) {
                retrofit = new Retrofit.Builder()
                        .baseUrl(BASE_URL)
                        .client(okClient)
                        .addConverterFactory(GsonConverterFactory.create())
                        .build();
            }
            return retrofit;
        }

    }

在我的ApiInterface.java文件中

@GET("profile")
Call<JsonObject> getProfile();

在我的活动中,我只是调用函数。

    private void getProfileData()
    {
        Singleton single = new Singleton();
        String auth = single.getAuthorization();

        Log.d("===========>>>>>>",auth);


        ApiInterface apiService =
                ApiClientHeader.getClient(auth).create(ApiInterface.class);
        //showProgress(true);
        Call<JsonObject> profileResponse = apiService.getProfile();
        profileResponse.enqueue(new Callback<JsonObject>() {
            @Override
            public void onResponse(Call<JsonObject> call, Response<JsonObject> response) {

                //showProgress(false);

                Log.d("============>"," Call Request " +String.valueOf(call.request().toString()));
                Log.d("============>", " Response code " + String.valueOf(response.code()));
//                Log.d("============>", " Response Body " + String.valueOf(response.body().toString()));

                if(response.code() == HttpURLConnection.HTTP_OK)
                {

                }

            }

            @Override
            public void onFailure(Call<JsonObject> call, Throwable t) {

                //showProgress(false);
                Log.d("============>"," Call Request " +String.valueOf(call.request().toString()));
                Log.d("============>"," Call Request " +String.valueOf(call.request().headers()));
                Log.d("=======>", "Failure" + t.getMessage());
            }

        });
    }

我仍然遇到了403无效访问错误。 这里我没有使用任何POJO类来发送或接收数据。请帮助我。


添加头部,例如:Call<JsonObject> getProfile(@Header("Authorization") String header); - Uttam Panchasara
4个回答

1
你需要按照以下方式传递认证字符串:
@GET("profile")
Call<JsonObject> getProfile((@Header("Authorization") String authorization))

0
    @Headers({
    "Accept: application/vnd.github.v3.full+json",
    "User-Agent: Retrofit-Sample-App"
})
@GET("users/{username}")
Call<User> getUser(@Path("username") String username);

关于文档的更多信息


我已经看到了这个,请您帮我纠正我的代码并且能否指出我的错误。 - Anil

0

我找到了一个最好的链接,可以用于使用Retrofit 1.9 + OkHttp 2.4进行基于令牌的身份验证

你可以添加NetworkInterceptor,我在我的演示中使用了它,如下所示:

    httpClient.addNetworkInterceptor(new Interceptor() {
        @Override
        public Response intercept(Chain chain) throws IOException {

            Request originalRequest = chain.request();

            // Add authorization header with updated authorization value to intercepted request
            Request authorisedRequest = originalRequest.newBuilder()
                    .header("Authorization", AccountAuthenticator.getAccessTokenWithTokenType(mContext))
                    .build();
            return chain.proceed(authorisedRequest);
        }
    });

依赖项:

compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
compile 'com.google.code.gson:gson:2.8.0'
compile 'com.squareup.okhttp3:logging-interceptor:3.3.1'

谢谢。


你能给我这个的依赖项吗? - Anil
更新了带有依赖项的答案。 - Pratik Butani
必需品:okHttp3.OkHttpClient - Anil
要求:okHttp3.OkHttpClient 找到:okHttp3.OkHttpClient.builder 这是我的代码 OkHttpClient okClient = new OkHttpClient.Builder() .addNetworkInterceptor(new Interceptor() { - Anil

-1

尝试使用以下代码与您的类一起使用,它对我有效:

final RestAdapter restAdapter = new RestAdapter.Builder().setClient(client).setLogLevel(RestAdapter.LogLevel.FULL).setRequestInterceptor(new RequestInterceptor() {

            @Override
            public void intercept(RequestFacade requestFacade) {
                requestFacade.addHeader("key", "value");
                requestFacade.addHeader("X-Requested-With", "XMLHttpRequest");
            }
        }).setConverter(new GsonConverter(gson)).setEndpoint(context.getString(R.string.base_url)).build();

编辑文章:

public class RestClient {

    // private static final String BASE_URL = "http://api.plumperfect.com";
    private WebServicesInterface apiService;
    private static RestClient instance;

    public RestClient(Context context) {
        instance = this;
        final Gson gson = new GsonBuilder().registerTypeAdapterFactory(new ItemTypeAdapterFactory()).setDateFormat("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'SSS'Z'").create();
        // final int cacheSize = 10 * 1024 * 1024; // 10 MiB
        // final File cacheDirectory = new File(context.getCacheDir().getAbsolutePath(), "HttpCache");
        // final OkHttpClient client = new OkHttpClient();
        // Cache cache;
        // try {
        // cache = new Cache(cacheDirectory, cacheSize);
        // client.setCache(cache);
        // } catch (IOException e) {
        // e.printStackTrace();
        // }


        final OkHttpClient okHttpClient = new OkHttpClient();

        final Client client = new OkClient(okHttpClient);

        final RestAdapter restAdapter = new RestAdapter.Builder().setClient(client).setLogLevel(RestAdapter.LogLevel.FULL).setRequestInterceptor(new RequestInterceptor() {

            @Override
            public void intercept(RequestFacade requestFacade) {
                      requestFacade.addHeader("key", "value");
                requestFacade.addHeader("X-Requested-With", "XMLHttpRequest");
            }
        }).setConverter(new GsonConverter(gson)).setEndpoint(context.getString(R.string.base_url)).build();

        apiService = restAdapter.create(WebServicesInterface.class);
    }

    public WebServicesInterface getApiService() {
        return apiService;
    }

    public static RestClient getInstance() {
        return instance;
    }

}

第二类:

public class ItemTypeAdapterFactory implements TypeAdapterFactory {

    @Override
    public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
        final TypeAdapter<T> delegate = gson.getDelegateAdapter(this, type);
        final TypeAdapter<JsonElement> elementAdapter = gson.getAdapter(JsonElement.class);

        return new TypeAdapter<T>() {

            public void write(JsonWriter out, T value) throws IOException {
                delegate.write(out, value);
            }

            public T read(JsonReader in) throws IOException {

                JsonElement jsonElement = elementAdapter.read(in);
                if (jsonElement.isJsonObject()) {
                    JsonObject jsonObject = jsonElement.getAsJsonObject();
                    if (jsonObject.has(Constants.DATA) && jsonObject.get(Constants.DATA).isJsonObject()) {
                        jsonElement = jsonObject.get(Constants.DATA);
                    }
                }

                return delegate.fromJsonTree(jsonElement);
            }
        }.nullSafe();
    }

}

如何添加这个功能,可以提供简要信息。 - Anil
我在我的帖子中分享了我的类,请查看。 - Mavya Soni

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接