繁体   English   中英

Android Retrofit中的请求标头和JSON解析

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM