【问题标题】:Retrofit2 - Can't get basic authentication for webAPI with dynamic URLRetrofit2 - 无法使用动态 URL 获得 webAPI 的基本身份验证
【发布时间】:2016-12-21 02:02:02
【问题描述】:

我熟悉如何在 Retrofit2 中使用动态 URL,但在请求中发送用户名和密码时遇到问题。 webAPI 通过输入 URL 来工作,屏幕上会出现登录提示,输入用户名和密码,验证后会显示 JSON 响应。该接口是为动态 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:password@api.url.com/");

    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 是正确的,因为它在浏览器中有效,但我不断收到错误,用户名和密码不正确?

I/System.out: Response status code: 401

此外,据我所知,我只能使用@GET 而不是@POST,因为每当我尝试@POST 时,响应代码都是:

I/System.out: Response status code: 405

起初我尝试使用编码标志遵循类似于this post 的内容,因为它是如何将@PATH 和@URL 与Retrofit2 一起使用但没有任何成功的示例。这就是为什么我尝试在 URL 前加上 username:password@ 的原因。大多数其他示例都使用@POST 方法。

关于如何进行身份验证的任何反馈或想法?谢谢

【问题讨论】:

    标签: android json basic-authentication retrofit2


    【解决方案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();
    

    【讨论】:

    • 感谢@iagreen 的帮助,现在我可以成功进行身份验证了
    【解决方案2】:

    在 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 方法。

    【讨论】:

    • 我会试试@Frakur。有不止一种方法来完成它总是很高兴。
    猜你喜欢
    • 1970-01-01
    • 2013-05-30
    • 2014-12-29
    • 2015-10-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-23
    • 2014-09-15
    • 1970-01-01
    相关资源
    最近更新 更多