Retrofit @body的使用

retrofit中有什么注解 ,但是对于@body网上讲解不是很多,现在我们来分析下@body
首先我们要明白的是后台传参数的方式最常用的分为了get与post,get的参数是跟在url后面的,但是post的参数是放在请求体里面传给后台的,但是两种方式传表单数据的话,传给后台的参数字符串是一样的,只是get跟在url后,post放在请求体里面的,参数的形式都是以

 String=" key=xxx&key=xxx&key=xxx "

这样的方式传参的,但是还有一种就是传json数据,get跟post都是把json放在body中传送给后台的。

retrofit一般传表单的数据是这样的:

 @FormUrlEncoded
 @POST("xxxxxxx")
 Call login( @Field("参数1") String reason,@Field("参数2") String reason);
 
 

底层自动封装成一个请求体,并通过这个注解来把这些参数封装成一个参数字符串传给后台!

如果是传json的话是这样的:

@POST("xxxxxxx")   
Call login( @Body JSONObject parmas );  
 
 

与上边的区别就是没得了@FormUrlEncoded来标志是表单数据,并且用的@body 里面的参数就是java中的bean对象!

这是最常用的两种方式,但是对于参数过多的表单数据按照第一种方式来写的话工程量有点大,有没得一种像post提交json这样的方式来提交表单数据呢?
别急,方法是这样的,也是使用@body:

@POST("xxxxxxx") 
Observable login( @Body RequestBody requestBody);
 
 

注意这里照样没有@FormUrlEncoded,而且@body后面跟的是请求体,相当于我们直接给后端传一个我们自定义的请求体,而不用retrofit注解来用底层封装,但是这个传的RequestBody要进行自己封装,加上参数必须的=,&符号,像下边这样:

封装数据这样封装:

public HashMap login(String xxx...) {
HashMap hashMap = new HashMap<>();
  hashMap.put("参数1", xxx);
  hashMap.put("参数2", xxx);
  hashMap.put("参数3", xxx);
  hashMap.put("参数4", xxx);
  hashMap.put("参数5", xxx);
  hashMap.put("参数6", xxx);
  return hashMap;
}

封装RequestBody这样封装,把上边的HashMap包装的参数传进来:

public RequestBody getRequestBody(HashMap hashMap) {
StringBuffer data = new StringBuffer();
if (hashMap != null && hashMap.size() > 0) {
  Iterator iter = hashMap.entrySet().iterator();
  while (iter.hasNext()) {
    Map.Entry entry = (Map.Entry) iter.next();
    Object key = entry.getKey();
    Object val = entry.getValue();
    data.append(key).append("=").append(val).append("&");
  }
}
    String jso = data.substring(0, data.length() - 1);
    RequestBody requestBody =
    RequestBody.create(MediaType.parse("application/x-www-form-urlencoded; charset=utf-8"),jso);
    
    return requestBody;
 }

再把返回的这个RequestBody传入到上边的方法中,这样就实现了传递post表单的方法!

其实get中的有 @GET("weather/index")

Call login(@Query("参数1") String xxx,@Query("参数2") String xxx);
 
 

也可以通过@QueryMap 来提交大量数据,这里就不过多说了

你可能感兴趣的:(Retrofit @body的使用)