retrofit 如何post json給服務端
阿新 • • 發佈:2019-01-10
http://www.jianshu.com/p/54bdb3faa469?utm_campaign=maleskine&utm_content=note&utm_medium=pc_all_hots&utm_source=recommendation 轉
QQ截圖20160722012756.png
- 需求: 開發新專案時,拿到介面文件,需要請求訊息體是json型別的
可能你這麼寫過post:
interface NService {
@FormUrlEncoded
@POST("alarmclock/add.json")
Call<ResponseBody> getResult(@FieldMap Map<String, Object> params);
}
Retrofit retrofit = new Retrofit.Builder().baseUrl(URL).client(client).build(); NService nService = retrofit.create(NService.class); Map<String, Object> params = new HashMap<>();/// params.put("id", "123"); params.put("name", "ksi");// Call<ResponseBody> call = nService.getResult(params); // call.enqueue(new Callback<ResponseBody>() { @Override public void onResponse(Call<ResponseBody> call, retrofit2.Response<ResponseBody> response) { } @Override public void onFailure(Call<ResponseBody> call, Throwable t) { } });
這是表單提交,你提交上去的其實是id=123&name=ksi
這麼個東西。
如果要提交的是json那麼自然要改變請求體了
好,有的同學可能會搜尋以下問題:怎麼檢視/更改/新增請求頭、請求體、響應體?
我的版本是:retrofit2.1.0,2.0以前的做法可能不一樣。
首先,在你的build.gradle下面依賴這玩意compile 'com.squareup.okhttp3:logging-interceptor:3.4.1'
然後配置client,新增攔截器,第一個攔截器是用於新增請求頭的,第二個就是列印日誌了
OkHttpClient client = new OkHttpClient().newBuilder() .addInterceptor(new Interceptor() { @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request().newBuilder() .addHeader("creater_oid", "123411") //這裡就是新增一個請求頭 .build(); // Buffer buffer = new Buffer(); 不依賴logging,用這三行也能打印出請求體 // request.body().writeTo(buffer); // Log.d(getClass().getSimpleName(), "intercept: " + buffer.readUtf8()); return chain.proceed(request); } //下面是關鍵程式碼 }).addInterceptor(new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY)) .build();
好,我們來幹正經事了,json格式的請求,引數註解用@Body
interface ApiService {
@POST("add.json")
Call<ResponseBody> add(@Body RequestBody body);
}
Retrofit retrofit = new Retrofit.Builder().baseUrl(URL).client(client).build(); ApiService apiService = retrofit.create(ApiService.class); //new JSONObject裡的getMap()方法就是返回一個map,裡面包含了你要傳給伺服器的各個鍵值對,然後根據介面文件的請求格式,直接拼接上相應的東西就行了 //比如{"data":{這裡面是引數}},那就在外面拼上大括號和"data"好了 RequestBody requestBody = RequestBody.create(MediaType.parse("Content-Type, application/json"), "{\"data\":"+new JSONObject(getMap()).toString()+"}"); Call<ResponseBody> call = apiService.add(requestBody); call.enqueue(new Callback<ResponseBody>() { @Override public void onResponse(Call<ResponseBody> call, retrofit2.Response<ResponseBody> response) { Log.d(getClass().getSimpleName(), "onResponse: ----" + response.body().string()); } @Override public void onFailure(Call<ResponseBody> call, Throwable t) { Log.d(getClass().getSimpleName(), "onFailure: ------" + t.toString()); } });
OK,大功告成,來看看列印結果吧
QQ截圖20160722012756.png
看到第三行了麼,那就是自定義新增的請求頭,第四行就是json格式的請求體了
<---200 OK下面是響應體。