我尝试通过Retrofit2从api包含Authorization
中获取数据。
api与postman
和Authorization
正确使用是正确的。
我正在@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();
}
});
编辑:
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
}