【Android實戰】----Android Retrofit2.1.0直接傳送Json字串到伺服器
阿新 • • 發佈:2019-01-29
可以用@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); }
jsonMd5實現
/** * 使用md5對字串加密加密 * @param signMap * @return */ public static Map<String, Map<String, Object>> jsonMd5(Map<String, Object> signMap){ String signData = new Gson().toJson(signMap); signData = signData + "&" + UrlConfig.APPKEY; String signDataA = StringUtil.md5(signData); Map<String, Object> datamap = new HashMap<String, Object>(); datamap.put("reqData", signMap); datamap.put("token",signDataA); Map<String, Map<String, Object>> reqMap = new HashMap<String, Map<String, Object>>(); reqMap.put("req", datamap); LogUtil.d("reqMap=====" + reqMap.toString()); return reqMap; }
請求json串為
D/OkHttp: --> POST http://xxx/ad/getAds.do http/1.1
D/OkHttp: Content-Type: application/json;charset=UTF-8
D/OkHttp: Content-Length: 106
D/OkHttp: {"reqData":{"position":1,"status":"1","channelId":"洪海亮"},"token":"e75ec317dc97138af6b20caf614ecc7c"}
D/OkHttp: --> END POST (106-byte body)