2016-12-21 8 views
0

Я знаком с использованием динамических URL-адресов с Retrofit2, но с проблемой отправки имени пользователя & пароля в запросе. WebAPI работает, введя URL-адрес, на экране появляется запрос на вход для имени пользователя &, после аутентификации отображается ответ JSON. Интерфейс определяется для динамического URL:Retrofit2 - Не удается получить базовую аутентификацию для webAPI с динамическим URL-адресом

@GET 
public Call<User> getJSON(@Url String string); 

Мой запрос выглядит следующим образом:

Retrofit retrofit = new Retrofit.Builder() 
      .baseUrl(API_URL) 
      .addConverterFactory(GsonConverterFactory.create()) 
      .build(); 

    LoginService service = retrofit.create(LoginService.class); 

    Call<User> call = service.getJSON("https://username:[email protected]/"); 

    call.enqueue(new Callback<User>() { 
     @Override 
     public void onResponse(Call<User> call, retrofit2.Response<User> response) { 
      System.out.println("Response status code: " + response.code()); 

Я уверен, адрес верен, как он работает в браузере &, но я получаю сообщение об ошибке в Неправильное имя пользователя &?

I/System.out: Response status code: 401 

Кроме того, насколько я могу сказать, что я могу использовать только @GET, а не @post, потому что всякий раз, когда я пытаюсь @POST код отклика:

I/System.out: Response status code: 405 

Сначала я пытался следовать что-то аналогично this post с использованием закодированного флага, потому что это пример использования @PATH & @URL с Retrofit2, но не имел никакого успеха. Вот почему я попробовал имя пользователя: password @ prepend к URL. Большинство других примеров используют метод @POST.

Любая обратная связь или идеи о том, как я могу пройти аутентификацию? Благодаря

ответ

1

Не знаю, как это сделать в модернизации, но вы можете добавить его через OkHttp перехватчика -

OkHttpClient client = new OkHttpClient().newBuilder().addNetworkInterceptor(
    new Interceptor() { 
     @Override 
     public Response intercept(Interceptor.Chain chain) throws IOException { 
     Request request = chain.request(); 
     HttpUrl url = request.url(); 
     url = url.newBuilder().username("username").password("password").build(); 
     Request newRequest = request.newBuilder().url(url).build(); 
     return chain.proceed(newRequest); 
     } 
    } 
).build(); 

быть уверено, чтобы добавить этот клиент к вашему дооснащению, например -

Retrofit retrofit = new Retrofit.Builder() 
     .client(client) 
     .baseUrl(API_URL) 
     .addConverterFactory(GsonConverterFactory.create()) 
     .build(); 
+0

Спасибо @iagreen за вашу помощь, теперь я могу успешно пройти аутентификацию – JC23

0

Другим способом использования базовой проверки подлинности с Retrofit2 было бы передать строку аутентификации в качестве аргумента для вашего метода интерфейса.

Таким образом, вы бы изменить метод подписи:

@GET 
public Call<User> getJSON(@Url String string, @Header("Authorization") String myAuthString); 

А потом называют это так:

Call<User> call = service.getJSON("https://api.url.com/", "Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ=="); 

Где вы заменяете QWxhZGRpbjpvcGVuIHNlc2FtZQ== для Base64 закодированные username:password строки.

Если вам необходимо передать имя пользователя и пароль для каждого вызова API и сохранить чистоту сигнатур метода, лучше использовать вместо этого метод OkHttpInterceptor.

+0

Я попробую @Frakur. Всегда приятно иметь более одного способа сделать это. – JC23