Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/215.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android改造中的请求头和JSON解析_Android_Http Headers_Retrofit2 - Fatal编程技术网

Android改造中的请求头和JSON解析

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

我正在努力学习改造,并将其用于我现在的项目中。我已经成功地实现了一些基本的GET和POST方法,但是现在我一直在尝试向请求的头部添加信息

这是客户端类:

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