• 网赌被黑找腾龙D哥出黑【微信:JLYL78999 QQ:840093333】

    Android Retrofit2 Post请求添加Json类型参数笔记

    一.添加Header

    1.添加单独Header

    对于某个API所需要添加Header时,可以直接在Service接口上添加@Headers注解:

    @Headers({
                "Content-Type: application/json;charset=UTF-8",
                "User-Agent: Retrofit-your-App"})
    @GET(ConstantsApi.douban_in_theaters)
    Observable<MovieTheatersModel> requestTheatersMovies(@Query("city")String city,
                                                             @Query("count")Integer count,
                                                             @Query("start")Integer start);

    2.添加共同Header

    如上,我们可以发现,大部分API「”Content-Type: application/json;charset=UTF-8”」都是Header中必须的,那么我们可以直接添加在拦截器中:

    new Retrofit.Builder()
               .addConverterFactory(GsonConverterFactory.create())
    
               .client(new OkHttpClient.Builder()
                       .addInterceptor(new Interceptor() {
                           @Override
                           public Response intercept(Chain chain) throws IOException {
                               Request request = chain.request()
                                       .newBuilder()
                                       .addHeader("Content-Type", "application/json;charset=UTF-8")
                                       .addHeader("header2", "123456")
                                       .addHeader("header3", "123456")
                                       .addHeader("header4", "123456")
                                       .build();
                               return chain.proceed(request);
                           }
                       }).build();

    然后你说直接这样每次都add一个匿名的intercept,令人头大的缩进,也太不软件工程了,那就直接封装一个:

    public class MyInterceptor implements Interceptor {
    
        @Override
        public Response intercept(Chain chain) throws IOException {
            Request request = chain.request()
                    .newBuilder()
                    .addHeader("Content-Type", "application/json;charset=UTF-8")
                    .addHeader("header2", "123456")
                    .addHeader("header3", "123456")
                    .addHeader("header4", "123456")
                    .build();
            return chain.proceed(request);
        }
    
    }

    每次请求需要这些header的时候只需要:

    HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor();
    httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
    MyInterceptor myInterceptor = new MyInterceptor();
    
    OkHttpClient client = new OkHttpClient()
            .newBuilder()
            .addInterceptor(httpLoggingInterceptor)
            .addInterceptor(myInterceptor)
            .build();//添加自定义Interceptor
    movieService = new Retrofit.Builder()   //配合Retrofit
              .baseUrl(ConstantsApi.BASE_DOUBAN)
              .addConverterFactory(GsonConverterFactory.create())
              .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
              .client(client)
              .build()
              .create(DoubanMovieService.class);

    二.添加Json类型Body

    假定需求Json格式如下:

    {
        "param1": "111",
        "param2": "222",
        "data": {
            "param3": "string",
            "param4": "string2"
        }
    }

    1.创建JsonObject对象

     JSONObject root = new JSONObject();
     JSONObject requestData = new JSONObject();
     try {
         requestData.put("param3", "string");
         requestData.put("param4", "string2");
         root.put("param1", "111");
         root.put("param2", "222");
         root.put("data", requestData);
     } catch (JSONException e) {
         e.printStackTrace();
     }

    2.API 接口设置

    @POST("api/data?")
    Observable<PromotionModel> getResult(@Body RequestBody requestBody);

    3.联网请求(包含上述1中代码)

    JSONObject root = new JSONObject();
    JSONObject requestData = new JSONObject();
    try {
        requestData.put("param3", "string");
        requestData.put("param4", "string2");
        root.put("param1", "111");
        root.put("param2", "222");
        root.put("data", requestData);
    } catch (JSONException e) {
        e.printStackTrace();
    }
    
    RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"),root.toString());
    
    OkHttpClient client = new OkHttpClient.Builder()
            .addInterceptor(new Interceptor())
            .addInterceptor(logging)
            .build();
    service = new Retrofit.Builder()
            .client(client)
            .baseUrl(Constants.BASE_URL)
            .addConverterFactory(GsonConverterFactory.create())
            .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
            .build()
            .create(Service.class);
    return service.getResult(requestBody);
    网赌被黑找腾龙D哥出黑【微信:JLYL78999 QQ:840093333】

    发布评论

    分享到:

    专业出黑网赌被黑追款

    我的微信号:18488351249 (左侧二维码扫一扫)欢迎添加!

    Android RxJava+Retrofit网络异常、状态码统一处理
    你是第一个吃螃蟹的人
    发表评论

    ◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。