可以用@body注解(将数据添加到requestbody中)、设置retrofit requestbody的编码格式为json
一、接口类
public interface IHttpService { /** * * @param params * @return */ @POST("ad/getAds.do") Call<Ads> getAds(@Body Map<String, Object>params);}二、retrofit配置
public class RetrofitHttPRequest { /** * 超时时间60s */ private static final long DEFAULT_TIMEOUT = 60; private volatile static RetrofitHttpRequest mInstance; public Retrofit mRetrofit; public IHttpService mHttpService; private RetrofitHttpRequest() { mRetrofit = new Retrofit.Builder() .baseUrl(UrlConfig.ROOT_URL) .client(genericClient()) .addConverterFactory(GsonConverterFactory.create()) .build(); mHttpService = mRetrofit.create(IHttpService.class); } public static RetrofitHttpRequest getInstance() { if (mInstance == null) { synchronized (RetrofitHttpRequest.class) { if (mInstance == null) mInstance = new RetrofitHttpRequest(); } } return mInstance; } /** * 添加统一header,超时时间,http日志打印 * body采用UTF-8编码 * * @return */ public static OkHttpClient genericClient() { HttpLoggingInterceptor logging = new HttpLoggingInterceptor(); logging.setLevel(HttpLoggingInterceptor.Level.BODY); OkHttpClient httpClient = new OkHttpClient.Builder() .addInterceptor(new Interceptor() { @Override public okhttp3.Response intercept(Chain chain) throws IOException { Request request = chain.request(); Request.Builder requestBuilder = request.newBuilder(); request = requestBuilder .addHeader("Content-Type", "application/json;charset=UTF-8") .post(RequestBody.create(MediaType.parse("application/json;charset=UTF-8"), bodyToString(request.body())))//关键部分,设置requestBody的编码格式为json .build(); return chain.proceed(request); } }) .addInterceptor(logging) .connectTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS) .writeTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS) .readTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS) .build(); return httpClient; } /** * 将call加入队列并实现回调 * * @param call 调入的call * @param retrofitCallBack 回调 * @param method 调用方法标志,回调用 * @param <T> 泛型参数 */ public static <T> void addToEnqueue(Call<T> call, final RetrofitCallBack retrofitCallBack, final int method) { final Context context = MyApplication.getContext(); call.enqueue(new Callback<T>() { @Override public void onResponse(Call<T> call, Response<T> response) { LogUtil.d("retrofit back code ====" + response.code()); if (null != response.body()) { if (response.code() == 200) { LogUtil.d("retrofit back body ====" + new Gson().toJson(response.body())); retrofitCallBack.onResponse(response, method); } else { LogUtil.d("toEnqueue, onResponse Fail:" + response.code()); ToastUtil.makeShortText(context, "网络连接错误" + response.code()); retrofitCallBack.onFailure(response, method); } } else { LogUtil.d("toEnqueue, onResponse Fail m:" + response.message()); ToastUtil.makeShortText(context, "网络连接错误" + response.message()); retrofitCallBack.onFailure(response, method); } } @Override public void onFailure(Call<T> call, Throwable t) { LogUtil.d("toEnqueue, onResponse Fail unKnown:" + t.getMessage()); t.printStackTrace(); ToastUtil.makeShortText(context, "网络连接错误" + t.getMessage()); retrofitCallBack.onFailure(null, method); } }); } private static String bodyToString(final RequestBody request) { try { final RequestBody copy = request; final Buffer buffer = new Buffer(); if (copy != null) copy.writeTo(buffer); else return ""; return buffer.readUtf8(); } catch (final IOException e) { return "did not work"; } }三、使用
private void getAds(){ showWaitDialog(); Map<String, Object> signMap = new HashMap<String, Object>(); signMap.put("channelId", "洪海亮"); signMap.put("position", 1); signMap.put("status", "1"); Map<String, Map<String, Object>> reqMap = SignUtil.jsonmd5(signMap); RetrofitHttpRequest.addToEnqueue(RetrofitHttpRequest.getInstance().mHttpService.getAds(reqMap.get("req")), this, HttpStaticApi.HTTP_GETADS); }请求json串为D/OkHttp: --> POST http://xxx/ad/getAds.do http/1.1D/OkHttp: Content-Type: application/json;charset=UTF-8D/OkHttp: Content-Length: 106D/OkHttp: {"reqData":{"position":1,"status":"1","channelId":"洪海亮"},"token":"e75ec317dc97138af6b20caf614ecc7c"}D/OkHttp: --> END POST (106-byte body)
新闻热点
疑难解答