通过Retrofit2获得401未经授权的错误

时间:2019-10-22 18:55:37

标签: android authorization rx-java retrofit2

我尝试通过Retrofit2从api包含Authorization中获取数据。 api与postmanAuthorization正确使用是正确的。

我正在@header中通过授权。

这是我要呼叫的路线,这在我的resquests服务中已实现:

 @GET("wc-api/v3/products")
Single<ProductModel> getProduct(@Header("Authorization") String Authorization, @Query("page") int page);

使用这些经过身份验证的标头,一切似乎都可以正常工作,直到收到特定请求,然后出现401错误:

Response{protocol=http/1.1, code=401, message=Unauthorized, url=https://*******.com/wc-api/v3/products?page=1}

我的改造客户端:

        OkHttpClient httpClient =
                new OkHttpClient.Builder()
                        .connectTimeout(10, TimeUnit.SECONDS)
                        .writeTimeout(10, TimeUnit.SECONDS)
                        .readTimeout(10, TimeUnit.SECONDS)
                        .build();

        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(App.getInstance().getAddress())
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .client(httpClient)
                .build();

        apiService = retrofit.create(ApiService.class);

然后在活动中出现401错误,这是我实现其调用的方式:(使用Rxjava

dataSource.getProduct(Credentials.basic("ck_*********************",
                            "cs_***************************"), 1)
                            .subscribeOn(Schedulers.newThread())
                            .observeOn(AndroidSchedulers.mainThread())
                            .subscribe(new SingleObserver<ProductModel>() {
                                @Override
                                public void onSubscribe(Disposable d) {
                                    compositeDisposable.add(d);
                                }

                                @Override
                                public void onSuccess(ProductModel productModel) {

                                    if (productModel.getProducts() != null)
                                        setModel(productModel.getProducts());
                                    else
                                        Toast.makeText(context, context.getResources().getString(R.string.dialog_ReceiveError), Toast.LENGTH_SHORT).show();
                                }

                                @Override
                                public void onError(Throwable e) {
                                    setModel(new ArrayList<>());
                                    Toast.makeText(context, context.getResources().getString(R.string.dialog_serverError), Toast.LENGTH_SHORT).show();
                                }
                            });

这是Android Studio项目分析器的快照: enter image description here enter image description here

这是postman的快照: enter image description here

编辑:

public class ProductModel {

@SerializedName("products")
@Expose
private List<Products> products;

@SerializedName("errors")
@Expose
private ErrorShopModel errors;
}

   public List<Products> getProducts() {
    return products;
}

productModel:

public class Products  {

@SerializedName("id")
@Expose
private int id;

@SerializedName("title")
@Expose
private String title;

@SerializedName("description")
@Expose
private String description;

@SerializedName("images")
@Expose
private List<ImagesModel> images;

,.....

Getter & Setter

}

0 个答案:

没有答案