改造持票人令牌

时间:2018-03-15 10:05:41

标签: android post retrofit2 restful-authentication

我尝试通过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代码中接收和保存令牌?

3 个答案:

答案 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);
 }

tokenBearer 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

现在,当您传递GETPOST或任何其他方法的任何网络服务请求时。您必须将其传递给标头请求。

@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();