Retrofit将自定义标头添加为标记 - java

时间:2015-03-04 03:08:17

标签: java android retrofit

我只是学习了改造android的基本知识但是我对标题有很多疑问。

我有一个REST API服务器,在我的api导出数据之前,它请求具有存储在Header Authorization上的API KEY。现在在执行之前,我希望将API KEY初始化为标题。

这是我的代码

public interface VerifyClient{

    @Headers("Authorization: eNortjI0s1LKTSxKSUyvckguLcuv0EtJ") // <======================
    @FormUrlEncoded
    @POST("/sendcode/{id}")
    VerifyResponse verify(@Path("id") String id, @Field("to") String to, @Field("type") String type, @Field("code") String code);

}

这项工作正常,但问题是如果另一个客户端api密钥?

另一种方法就是这样。

RequestInterceptor requestInterceptor = new RequestInterceptor()
            {
                @Override
                public void intercept(RequestFacade request) {
                    request.addHeader("Authorization", ApiKey); <======================
                }
            };

            return new RestAdapter
                    .Builder()
                    .setEndpoint(Var.REST_URL)
                    .setRequestInterceptor(requestInterceptor)
                    .build()
                    .create(VerifyClient.class)
                    .verify(userData[0], userData[1], userData[2], userData[3]);
        }

但它返回401 Unauthorized嗯,有人有解决方案吗?或者我执行错了。

2 个答案:

答案 0 :(得分:1)

我有同样的问题,这就是我解决它的方法。

首先,这是我的客户。请注意请求标题“Authorization”:我必须在实际令牌之前放置关键字“Token”。也许这可以帮到你。

public static <S> S createService(Class<S> serviceClass, final String token) {

        RestAdapter.Builder builder = new RestAdapter.Builder()
                .setEndpoint(API_URL)
                .setClient(new OkClient(new OkHttpClient()));

        if (token != null) {
            builder.setRequestInterceptor(new RequestInterceptor() {
                @Override
                public void intercept(RequestFacade request) {
                    request.addHeader("Accept", "application/json");
                    request.addHeader("Authorization", "Token " + token);
                }
            });
        }

        RestAdapter adapter = builder.build();

        return adapter.create(serviceClass);
    }

我在以下链接Retrofit — Token Authentication on Android

中找到了Retrofit客户端

答案 1 :(得分:0)

如果您想为您的用户创建API KEY,我建议您首先制作POJO对象,该对象代表您的用户。

    static class User {
        @SerializedName("identifier")
        String identifier;

        @SerializedName("password")
        String password;

        public User(String username, String password) {
            this.identifier = username;
            this.password = password;
        }
    }

下一步创建处理您的Service请求的POST

    public interface HttpService {
        @POST("path")
        Call<Object> postWithJson(
                @Header("Content-Type") String contentType,
                @Header("Token") String token,
                @Body User user
        );
    }

现在你只需要拨打服务,例如:

String apiKey = 52d5bc6ecc5fasdad123124125r23fsd12312;

Call<Object> call = service.postWithJson("application/json; charset=UTF-8", apiKey, new User("login", "password"));

作为回应得到你想要的,例如: response.headers().get("tokenKey")