[英]Request header and JSON parsing in Android Retrofit
我正在尝试学习Retrofit,并将其用于我现在的项目中。 我已经成功实现了一些基本的GET和POST方法,但是现在我一直试图将信息添加到请求的标头中。
这是Client类:
public class CategoryClient {
public static final String BASE_URL = "URL is here";
private static Retrofit retrofit = null;
public static Retrofit getClient() {
if (retrofit==null) {
retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
}
return retrofit;
}
}
这是GET方法的接口:
public interface CategoryService {
@GET("/v3/projects/{projectId}/categories/")
Call<CategoryResponse> getProjectCategories(@Query("projectId") String projectId);
}
这是我的类别课程:
public class Category2 {
@SerializedName("_id")
private String _id;
@SerializedName("name")
private String name;
@SerializedName("tasks")
private int tasks;
public Category2(String _id, String name, int tasks) {
this._id = _id;
this.name = name;
this.tasks = tasks;
}
public String get_id(){
return _id;
}
public void set_id(String _id){
this._id = _id;
}
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
public int getTasks() {
return tasks;
}
public void setTasks(int tasks){
this.tasks = tasks;
}
}
这是我的CategoryResponse类(从请求中获得类别列表):
public class CategoryResponse {
private List<Category2> results;
public List<Category2> getResults() {
return results;
}
public void setResults(List<Category2> results) {
this.results = results;
}
}
这是我从“活动”中调用的名称:
categoryService =
CategoryClient.getClient().create(CategoryService.class);
Call<CategoryResponse> call = categoryService.getProjectCategories(projectId);
call.enqueue(new Callback<CategoryResponse>() {
@Override
public void onResponse(Call<CategoryResponse> call, Response<CategoryResponse> response) {
int statusCode = response.code();
categoriesList2 = new ArrayList<>();
categoriesList2 = response.body().getResults();
}
@Override
public void onFailure(Call<CategoryResponse> call, Throwable t) {
// Log error here since request failed
Log.e(TAG, t.toString());
}
});
我需要在请求的标头中添加一个令牌,但是该令牌会不断变化,因此无法在我的接口上方使用“ @Header”使用它。 有什么办法可以从我的活动中添加此标头?
在您的界面中,使用@Header修改您的方法
@GET("/v3/projects/{projectId}/categories/")
Call<CategoryResponse> getProjectCategories(@Query("projectId") String
projectId, @Header("Token") String token);
稍后,您可以从您的活动中调用此方法:
String token = "someRandomtoken";
categoryService =
CategoryClient.getClient().create(CategoryService.class);
Call<CategoryResponse> call = categoryService.getProjectCategories(projectId, token);
call.enqueue(new Callback<CategoryResponse>() {
@Override
public void onResponse(Call<CategoryResponse> call, Response<CategoryResponse> response) {
int statusCode = response.code();
categoriesList2 = new ArrayList<>();
categoriesList2 = response.body().getResults();
}
@Override
public void onFailure(Call<CategoryResponse> call, Throwable t) {
// Log error here since request failed
Log.e(TAG, t.toString());
}
});
我在同一场景中工作,我每天都必须更改令牌,并且对于课程的每个新用户,Interceptors将帮助您创建标头请求,并且可以在构建它时将其添加到http客户端。
由于您的方案与我的方案非常相似,因此我在这里添加了我使用的方案,并且对我来说非常适合。
如果您想了解更多关于它的信息, 请点击这里 。
Interceptor interceptorSecure = chain -> {
Request original = chain.request();
// Request customization: add request headers
Request.Builder requestBuilder = original.newBuilder()
.method(original.method(), original.body());
requestBuilder.header("Authorization", "Bearer " + token);
requestBuilder.header("Origin", ORIGIN_URL);
Request request = requestBuilder.build();
return chain.proceed(request);
};
//after that use this to http client builder
//add it to your httpClientBuilder
yourHttpClientBuilder.addInterceptor(interceptorSecure);
OkHttpClient client = yourHttpClientBuilder.build();
//this is your retrofit builder, the way you have built with base url and gson convertors..
Retrofit retrofit = yourRetrofitBuilder.client(client).build();
retrofit.create(CategoryService.class);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.