我尝试通过POST json接收令牌{"电子邮件":" test@example.com","密码":"测试&#34 ;}。在邮递员工作: Postman request。 我尝试在Android Studio中执行相同的操作。 我创建了类令牌:
public class Token {
@SerializedName("token")
@Expose
public String token;
}
和类APIclient
class APIClient {
private static Retrofit retrofit = null;
static Retrofit getClient() {
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient client = new OkHttpClient.Builder().addInterceptor(interceptor).build();
retrofit = new Retrofit.Builder()
.baseUrl("http://mybaseurl.com/")
.addConverterFactory(GsonConverterFactory.create())
.client(client)
.build();
return retrofit;
}
}
和接口APIInterface:
interface APIInterface {
@POST("/authenticate")
Call<Token> getLoginResponse(@Body AuthenticationRequest request);
}
和类AuthenticationRequest:
public class AuthenticationRequest {
String email;
String password;
}
在MainActivity中的onCreate:
apiInterface = APIClient.getClient().create(APIInterface.class);
authenticationRequest.email="test@example.com";
authenticationRequest.password="test";
getTokenResponse();
这是我的getTokenResponse方法:
private void getTokenResponse() {
Call<Token> call2 = apiInterface.getLoginResponse(authenticationRequest);
call2.enqueue(new Callback<Token>() {
@Override
public void onResponse(Call<Token> call, Response<Token> response) {
Token token = response.body();
}
@Override
public void onFailure(Call<Token> call, Throwable t) {
call.cancel();
}
});
}
这就是我在Logcat中看到的:
03-15 10:53:56.579 20734-20756/com.retrofi2test D/OkHttp: --> POST http://mybaseurl.com/authenticate http/1.1
03-15 10:53:56.579 20734-20756/com.retrofi2test D/OkHttp: Content-Type: application/json; charset=UTF-8
03-15 10:53:56.579 20734-20756/com.retrofi2test D/OkHttp: Content-Length: 46
03-15 10:53:56.579 20734-20756/com.retrofi2test D/OkHttp: {"email":"test@example.com","password":"test"}
03-15 10:53:56.579 20734-20756/com.retrofi2test D/OkHttp: --> END POST (46-byte body)
你能告诉我我做错了什么吗?每当我想通过GET方法从服务器获取信息时,我都需要提供令牌。 如何在Android代码中接收和保存令牌?
答案 0 :(得分:2)
您应该将application/json
添加到标题
interface APIInterface {
@Headers({"Content-Type: application/json", "Accept: application/json"})
@POST("/authenticate")
Call<Token> getLoginResponse(@Body AuthenticationRequest request);
}
答案 1 :(得分:1)
试试这个
interface APIInterface {
@POST("/authenticate")
Call<Token> getLoginResponse(@Header("Authorization") String token, @Body AuthenticationRequest request);
}
token
是Bearer token
答案 2 :(得分:0)
要获取访问令牌,您需要从响应中获取标头并从标头中读取值。
Callback<User> user = new Callback<User>() {
@Override
public void success(User user, Response response) {
List<Header> headerList = response.getHeaders();
//iterating list of header and printing key/value.
for(Header header : headerList) {
Log.d(TAG, header.getName() + " " + header.getValue());
}
}
}
从标题AccessToken
获得所需的值后,您可以将该值存储在存储中。例如SharedPreference
因此,下次当您需要该值时,您可以直接从存储中获取该值。例如SharedPreference
现在,当您传递GET
或POST
或任何其他方法的任何网络服务请求时。您必须将其传递给标头请求。
@GET("/tasks")
Call<List<Task>> getTasks(@Header("Content-Range") String contentRange);
或者如果您每次都需要传递它,您可以直接从Retrofit
课程传递它。
Request request = original.newBuilder()
.header("User-Agent", "Your-App-Name")
.header("Accept", "application/vnd.yourapi.v1.full+json")
.method(original.method(), original.body())
.build();