2016-12-21 13 views
0

Retrofit2で動的URLを使用する方法を熟知していますが、リクエストにパスワードを送信するのに問題が発生しています(&)。 webAPIはURLを入力することで動作し、認証後にJSON応答が表示された後、ユーザー名&のパスワードプロンプトが画面に表示されます。インターフェイスは、動的URLのために定義されていますRetrofit2 - 動的URLを使用したWebAPIの基本認証を取得できません

@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()); 

私はそれがブラウザ&で動作しますが、私はエラーを取得しておくとURLが正しいことを確信していますユーザー名&パスワードが正しくありませんか?

限り、私は@POSTをしようとするたびに応答コードがあるので、私は唯一のむしろ@POSTよりも@GET使用することができます言うことができるようにまた
I/System.out: Response status code: 401 

、:

I/System.out: Response status code: 405 

最初に私が何かを追跡しようとしましたthis postに似ていますが、これは@PATH & @URLをRetrofit2で使用する方法の例ですが、成功しませんでした。だからこそ私はusername:password @を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で基本認証を使用するもう1つの方法は、認証文字列をインターフェイスメソッドに引数として渡すことです。

ですからにメソッドのシグネチャを変更します

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

そして、このようにそれを呼び出す:あなたはBase64でエンコードされたusername:password文字列をQWxhZGRpbjpvcGVuIHNlc2FtZQ==を代用

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

すべてのAPI呼び出しでユーザー名とパスワードを渡す必要があり、メソッドのシグネチャをきれいに保つ必要がある場合は、代わりにカスタムOkHttpInterceptorメソッドを使用する方がよい場合があります。

+0

私は試してみましょう@Frakur。それを達成するための複数の方法を持つことは常に素晴らしいです。 – JC23

関連する問題