由于项目比较老,刚接手这个项目,看接口文档,说明的让咱们规定header和body格式传递,格式如下:
JSON对象”中的名称定义为header,header的值是一个JSON对象,称之为“消息头JSON对象”,“消息头JSON对象”包含了若干名称/值对;消息体在“消息JSON对象”中的名称定义为body,body的值是一个JSON对象,称之为“消息体JSON对象”,“消息体JSON对象”包含了若干名称/值对。例如,{"header":{"a":"1","b":"2","c":"3"},"body":{"d":"4","e":"5"}}。
起初我以为是添加个请求头,这还不容易吗,结果一下午没调通,报错http:406
后台跟我说应该是要我传json,我才理解他的意思,
方法:
package com.yblt.hct.network.api;
import com.yblt.hct.bean.HomeBanner;
import com.yblt.hct.bean.ResultBean;
import java.util.List;
import okhttp3.RequestBody;
import retrofit2.http.Body;
import retrofit2.http.Headers;
import retrofit2.http.POST;
import rx.Observable;
/**
* Created by yangfan on 17/04/24.
*/
public interface AppApi {
/**
* 首页banner
*
* @param route
* @return
*/
@Headers({"Content-Type: application/json","Accept: application/json"})//需要添加头
@POST("other")
Observable>> getBanner(@Body RequestBody route);
}
然后按照他们定的格式封装数据传json
public class NetApi {
// {
// "header":{
// "a":"1",
// "b":"2",
// "c":"3"
// },
// "body":{
// "d":"4",
// "e":"5"
// }
// }
public static void getBanner(Context context, String fromType,String isNewUser,String timeId,String transactionType,Observer observer) {
Map map = new HashMap<>();//body map
map.put("fromType", fromType);
map.put("isNewUser", isNewUser);
map.put("timeId", timeId);
String json= new Gson().toJson(CommonUtil.getServiceParamsMap(CommonUtil.getHeaderParamsMap(transactionType),map));//要传递的json
RequestBody requestBody=RequestBody.create(okhttp3.MediaType.parse("application/json; charset=utf-8"),json);
NetClient.getInstance().getPost("", true, context,transactionType).getBanner(requestBody).subscribeOn(Schedulers.io()).
observeOn(AndroidSchedulers.mainThread())
.subscribe(observer);
}
}
下边是commenutils方法的 json map
public class CommonUtil {
/**
* 接口头参数
* String 类型 否则报错
*/
public static Map getHeaderParamsMap(String transactionType) {
Map map = new HashMap<>();
map.put("messageID", Constant.MESSAGEID);//messageId
map.put("sign", Constant.SIGN);//sign
map.put("betPlat", "1");//平台
map.put("imei", getPhoneSign());//识别码
map.put("channel", getAppChannel());// 渠道
map.put("terminal", "2");
map.put("timeStamp", String.valueOf(System.currentTimeMillis()));// 时间戳
map.put("transactionType", transactionType);
map.put("ua", getPhoneBrand());
map.put("version", getVersionName(ContextHelper.getApplication()));
return map;
}
/**
* 接口传json map 里面存放header + body
* String 类型 否则报错
*/
public static Map getServiceParamsMap(Map header,Map body) {
Map map = new HashMap<>();
map.put("header",header);//指定key 为header
map.put("body",body);//指定key为body
return map;
}
}
这样就请求成功了