Я пытаюсь создать клиент для REST API с помощью Retrofit. API использует базовую аутентификацию, и мне не удалось пройти аутентификацию с помощью Retrofit.
Я протестировал 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);
}
Когда я вызываю updateUser в UserService
Response<UserAPIResponse> response = UserService.userUpdate(userUpdateRequest).execute();
Код ответа 401 (неавторизованный/аутентификация не удалась)
Команда curl с параметром -u и теми же учетными данными работает, как и ожидалось.
Credentials.basic("jesse", "password1")
. 15.06.2016