我正在尝试使用 Retrofit 为 REST API 构建客户端。 API 使用基本身份验证,我无法使用 Retrofit 进行身份验证。
我使用下面的curl测试了API,它按预期工作
curl -H "Accept: application/json" -H "Content-type: application/json" -X POST -d '{some_json}' -u api_key: https://apitest.com/api/v1/customers
下面是Retrofit客户端
public interface UserService {
String HOST = "https://apitest.com";
public static OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
public static Retrofit.Builder builder =
new Retrofit.Builder()
.baseUrl(HOST)
.addConverterFactory(GsonConverterFactory.create());
/*
* CREATE/UPDATE User
*/
@POST("api/v1/customers")
Call<UserAPIResponse> userUpdate(@Body UserUpdateRequest userUpdateRequest);
static UserService newInstance(String userAPIKey) {
String credentials = userAPIKey + ":";
final String basic = "Basic "+ Base64.encodeBase64(credentials.getBytes());
httpClient.addInterceptor(new Interceptor() {
@Override
public Response intercept(Interceptor.Chain chain) throws IOException {
Request original = chain.request();
Request.Builder requestBuilder = original.newBuilder()
.header("Authorization", basic);
requestBuilder.header("Accept", "application/json");
requestBuilder.method(original.method(),original.body());
Request request = requestBuilder.build();
return chain.proceed(request);
}
});
OkHttpClient client = httpClient.build();
Retrofit retrofit = builder.client(client).build();
return retrofit.create(BlueshiftUserService.class);
}
当我在 UserService 上调用 updateUser 时
Response<UserAPIResponse> response = UserService.userUpdate(userUpdateRequest).execute();
response.code 为 401(未经授权/身份验证失败)
带有 -u 和相同凭据的curl 命令按预期工作。
最佳答案
问题出在凭据编码上。我没有将其作为字符串发送。
byte[] encodedAuth= Base64.encodeBase64(credentials.getBytes());
final String basic = "Basic " + new String(encodedAuth);
关于retrofit - 带改造的基本身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37830236/