Android改造中的请求头和JSON解析
我正在努力学习改造,并将其用于我现在的项目中。我已经成功地实现了一些基本的GET和POST方法,但是现在我一直在尝试向请求的头部添加信息 这是客户端类:Android改造中的请求头和JSON解析,android,http-headers,retrofit2,Android,Http Headers,Retrofit2,我正在努力学习改造,并将其用于我现在的项目中。我已经成功地实现了一些基本的GET和POST方法,但是现在我一直在尝试向请求的头部添加信息 这是客户端类: public class CategoryClient { public static final String BASE_URL = "URL is here"; private static Retrofit retrofit = null; public static Retrofit getClient()
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);
}
这是我的CategoryResponse类(我从请求中获取类别列表):
公共类类别响应{
私人名单结果;
公共列表getResults(){
返回结果;
}
公共void setResults(列出结果){
这个结果=结果;
}
}
这就是我在活动中所说的:
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());
}
});
categoryService=
CategoryClient.getClient().create(CategoryService.class);
Call Call=categoryService.getProjectCategories(projectId);
call.enqueue(新回调(){
@凌驾
公共void onResponse(调用、响应){
int statusCode=response.code();
categoriesList2=新的ArrayList();
categoriesList2=response.body().getResults();
}
@凌驾
失败时公共无效(调用调用,可丢弃的t){
//由于请求失败,此处记录错误
Log.e(TAG,t.toString());
}
});
我需要在请求的标头中添加一个令牌,但该令牌将不断更改,因此我无法在带有“@header”的接口上方使用它。有没有办法从“我的活动”中添加此标题?在界面中使用@header修改方法
@GET("/v3/projects/{projectId}/categories/")
Call<CategoryResponse> getProjectCategories(@Query("projectId") String
projectId, @Header("Token") String token);
@GET(“/v3/projects/{projectd}/categories/”)
调用getProjectCategories(@Query(“projectId”)字符串
projectId,@Header(“Token”)字符串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());
}
});
String-token=“someRandomtoken”;
类别服务=
CategoryClient.getClient().create(CategoryService.class);
Call Call=categoryService.getProjectCategories(projectId,token);
call.enqueue(新回调(){
@凌驾
公共void onResponse(调用、响应){
int statusCode=response.code();
categoriesList2=新的ArrayList();
categoriesList2=response.body().getResults();
}
@凌驾
失败时公共无效(调用调用,可丢弃的t){
//由于请求失败,此处记录错误
Log.e(TAG,t.toString());
}
});
在界面中使用@Header修改方法
@GET("/v3/projects/{projectId}/categories/")
Call<CategoryResponse> getProjectCategories(@Query("projectId") String
projectId, @Header("Token") String token);
@GET(“/v3/projects/{projectd}/categories/”)
调用getProjectCategories(@Query(“projectId”)字符串
projectId,@Header(“Token”)字符串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());
}
});
String-token=“someRandomtoken”;
类别服务=
CategoryClient.getClient().create(CategoryService.class);
Call Call=categoryService.getProjectCategories(projectId,token);
call.enqueue(新回调(){
@凌驾
公共void onResponse(调用、响应){
int statusCode=response.code();
categoriesList2=新的ArrayList();
categoriesList2=response.body().getResults();
}
@凌驾
失败时公共无效(调用调用,可丢弃的t){
//由于请求失败,此处记录错误
Log.e(TAG,t.toString());
}
});
我正在使用相同的场景,每天都必须更改令牌,当然,对于每个新用户,拦截器将帮助您创建标头请求,您可以在构建它的同时将其添加到http客户端
由于您的场景与我的场景非常相似,我在这里添加了我的场景,我使用它,它非常适合我
如果你想了解更多
我正在使用相同的场景,每天都要更改令牌,当然,对于每个新用户,拦截器将帮助您创建标头请求,您可以在构建它的同时将其添加到http客户端 由于您的场景与我的场景非常相似,我在这里添加了我的场景,我使用它,它非常适合我 如果你想了解更多
你试过使用拦截器吗?谢谢你的回复!我如何使用拦截器呢?你试过使用拦截器吗?谢谢你的回复!我如何使用拦截器呢?嗨,谢谢你的回答。如果我想在标题中添加一个密钥,即“授权”,在令牌之后,我该怎么办?我不确定,但您可以尝试使用@HeaderHi添加额外的周长,谢谢您的回答。如果我想在标头中添加一个密钥,即“授权”,在令牌之后,我该怎么办?我不确定,但您可以尝试为回复添加带有@HeaderHanks的额外周长。所以我必须将拦截器放在我的活动中,还是应该为它创建另一个类?另外,我如何调用此拦截器并从CategoryService接口中定义的“GetProjectCategories”获取响应?您可以在任何地方创建拦截器,我建议您在构建http客户端的地方创建拦截器,并仅使用所需的头添加拦截器。谢谢您的回答,但是我如何从调用中访问响应?在你发布的代码中,我只有“reformation.create(CategoryService.class)”。我必须怎么做才能在这个类中调用方法“getProjectCategories”并得到结果?这会给你一个带有标题和etc参数要求的改型实例,在你得到这个实例后,你可以调用你的方法来得到响应。“yourHttpClientBuilder”和“YourRefugmentBuilder”是什么?我在努力理解我要做的事情时遇到了困难。谢谢你的回复。所以我必须将拦截器放在我的活动中,还是应该为它创建另一个类?另外,我如何调用这个拦截器并从“GetProjectCategories”d获取响应
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);