android - 发送 POST 方法时未授权
问题描述
我对改造和发布方法有疑问。我GET
的身份验证方法有效,但POST
不起作用。我登录没有任何问题,并且做任何GET
方法。
当我尝试将一些数据发送到 REST API (Spring) 时,我收到此错误:
响应{protocol=http/1.1, code=401, message=, url= http://10.101.12.31:8080/add }
我的代码:
数据API.java:
public class DataAPI {
private static final String BASE_URL = "http://10.101.12.31:8080/";
static OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
private static Retrofit.Builder builder =
new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create());
private static Retrofit retrofit = builder.build();
public static <S> S createService(Class<S> serviceClass) {
return createService(serviceClass, null, null);
}
public static <S> S createService(
Class<S> serviceClass, String username, String password) {
if (!TextUtils.isEmpty(username)
&& !TextUtils.isEmpty(password)) {
String authToken = Credentials.basic(username, password);
return createService(serviceClass, authToken);
}
return createService(serviceClass, null);
}
public static <S> S createService(
Class<S> serviceClass, final String authToken) {
if (!TextUtils.isEmpty(authToken)) {
AuthenticationInterceptor interceptor =
new AuthenticationInterceptor(authToken);
if (!httpClient.interceptors().contains(interceptor)) {
httpClient.addInterceptor(interceptor);
builder.client(httpClient.build());
retrofit = builder.build();
}
}
return retrofit.create(serviceClass);
}
public static DepartmentService getDepartmentService() {
return retrofit.create(DepartmentService.class);
}
}
AuthenticationInterceptor.java:
public class AuthenticationInterceptor implements Interceptor {
private String authToken;
public AuthenticationInterceptor(String token) {
this.authToken = token;
}
@Override
public Response intercept(Chain chain) throws IOException {
Request original = chain.request();
Request.Builder builder = original.newBuilder()
.addHeader("Authorization", authToken);
Request request = builder.build();
return chain.proceed(request);
}
}
网页界面:
public interface Service {
@POST("/add")
Call<Void> addUser(@Body User user);
}
方法:
public void buttonOne(View v) {
DataAPI.createService(Service.class, getIntent().getStringExtra("authToken"))
.addUser(user)).enqueue(new Callback<User>() {
@Override
public void onResponse(Call<User> call, Response<User> response) {
System.out.println(response);
}
@Override
public void onFailure(Call<User> call, Throwable t) {
Toast.makeText(getApplicationContext(),t.toString(),Toast.LENGTH_SHORT).show();
}
});
}
解决方案
推荐阅读
- ios - UITableView:如何从底部滚动(如对话列表)?
- terraform - Terraform 同时使用 required_providers 和 provider 块
- javascript - 为什么在这个程序中忽略了 setTimeout?
- python - 如何在toplevel()Tkinter中使用画布制作按钮
- vue.js - VueJS 3组合API随机更新反应变量
- python - pyLDAvis .show 函数要求 Jupyter 笔记本中缺少 .css 文件
- dji-sdk - DJI OSDK - 如何串流到远程服务器
- javascript - 为什么 pdfjs-dist 不适用于 Internet Explorer?
- c++ - 在派生类中重载虚方法,以便在 C++ 中采用更多参数
- php - Laravel 8.x 在哪里 Json 在数组中搜索