【问题标题】:Request header and JSON parsing in Android RetrofitAndroid Retrofit 中的请求标头和 JSON 解析
【发布时间】:2017-08-30 20:58:35
【问题描述】:

我正在尝试学习 Retrofit 并在我现在的项目中使用它。我已经成功实现了一些基本的 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);
}

这是我的类别类:

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”界面上方使用它。有什么方法可以从我的 Activity 中添加此标头?

【问题讨论】:

  • 你试过使用拦截器吗?
  • 感谢您的回复!我如何使用拦截器来做到这一点?

标签: android http-headers retrofit2


【解决方案1】:

在您的界面中使用@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());
        }
    });

【讨论】:

  • 您好,感谢您的回答。如果我想在标头中添加一个密钥,即“授权”并且在令牌之后,我该怎么办?
  • 我不确定,但您可以尝试使用 @Header 添加额外的周长
【解决方案2】:

我正在处理相同的场景,我必须每天更改令牌,当然对于每个新用户,拦截器将帮助您创建标头请求,您可以在构建时将其添加到 http 客户端。

由于您的场景与我的非常相似,因此我在此处添加了我使用的场景,并且非常适合我。

如果您想了解更多信息refer here

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

【讨论】:

  • 感谢您的回复。所以我必须将拦截器放在我的活动中,还是应该为它创建另一个类?另外,如何调用这个拦截器并从 CategoryService 接口中定义的“getGetProjectCategories”获取响应?
  • 你可以在任何地方创建拦截器,我建议在你构建你的 http 客户端的地方创建它,并且只在需要的头文件中添加它..
  • 感谢您的回答,但我如何访问电话的回复?在您发布的代码中,我只有“retrofit.create(CategoryService.class)”。我该怎么做才能在此类中调用方法“getProjectCategories”并获取结果?
  • 这为您提供了带有标头和其他参数要求的改造实例,在您获得此实例后,您可以调用您的方法来获得响应..
  • 什么是“yourHttpClientBuilder”和“yourRetrofitBuilder”?我在试图理解我必须做什么时遇到了困难。
猜你喜欢
  • 2018-12-27
  • 1970-01-01
  • 2016-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-12
  • 2021-04-24
  • 1970-01-01
相关资源
最近更新 更多