原文鏈接:https://futurestud.io/blog/retrofit-send-objects-in-request-body
本篇介紹了在 Retrofit 里如何設置自定義 JSON 轉(zhuǎn)換器役纹。下面的列表顯示了該系列的所有文章:
在 Retrofit 2里實現(xiàn)自定義響應轉(zhuǎn)換器是一個復雜的過程. 我們一定會寫一篇關(guān)于如何在 Retrofit 2中創(chuàng)建和集成自己的響應轉(zhuǎn)換器的另一篇博客. 一旦發(fā)布忌怎,我們將在此處鏈接和更新本說明竣况。(原文評論里提到 Retrofit 2的自定義轉(zhuǎn)換器教程不會公開發(fā)布了, 有讀者自己做了實現(xiàn), 可以參考, 譯者注)
Retrofit 系列目錄
- 開始創(chuàng)建android客戶端[已翻譯]
- Android上的基本認證[已翻譯]
- Android上的令牌認證[已翻譯]
- Android上的OAuth
- 多個 Query 參數(shù)使用同一名字[已翻譯]
- 同步與異步請求[已翻譯]
- 在請求體里發(fā)送對象[已翻譯]
- 自定義一個響應轉(zhuǎn)換器
- 添加自定義請求頭
- 可選的 Query 參數(shù)
- 如何集成 XML 轉(zhuǎn)換器
- 使用 Log Level 調(diào)試請求
- 如何上傳文件
- Series Round-Up
- Retrofit 2 — 1.9 升級指南
- Retrofit 2 — 如何上傳文件
- Retrofit 2 — Log 請求與響應
- Retrofit 2 — Android 上的 Hawk 認證
- Retrofit 2 — 簡單錯誤處理
- 如何在 Retrofit 1 里使用 OkHttp 3
- Retrofit 2 — 圖書更新發(fā)布慶典
- 提交表單數(shù)據(jù) — Urlencoded
- 提交表單數(shù)據(jù) — Urlencoded 使用FieldMap
- Retrofit 2 — 在 OkHttp 攔截器里管理請求頭部
- Retrofit 2 — 如何給每一個請求添加 Query 參數(shù)
- Retrofit 2 — 使用QueryMap 添加多個 Query 參數(shù)
- Retrofit 2 — 如何在請求時使用動態(tài) Url
- Retrofit 2 — Url 處理团驱,分辨和解析
- Retrofit 2 — POST 和PUT 請求里的常量, 默認值和邏輯值
- Retrofit 2 — 如何下載文件
- Retrofit 2 — 取消請求
- Retrofit 2 — 重用分析請求
- Retrofit 2 — 如何在運行時修改 API Base Url
- 可選Path參數(shù)
- 如何刷新 Access Token
- Retrofit 2 — 如何提交文本請求體
- Retrofit 2 — 使用 Query 參數(shù)來分頁
- Retrofit 2 — 使用 鏈接頭和動態(tài) Url 來分頁(比如GitHub)
- Retrofit 2 — 使用范圍頭字段來分頁 (比如 Heroku)
- Retrofit 2 — 轉(zhuǎn)換器介紹
- Retrofit 2 — 添加并自定義 Gson 轉(zhuǎn)換器
- Retrofit 2 — 實現(xiàn)自定義轉(zhuǎn)換器
- Retrofit 2 — 只在開發(fā)環(huán)境里啟用日志
- Retrofit 2 — 如何上傳多個文件
- Retrofit 2 — Passing Multiple Parts Along a File with @PartMap
- Retrofit 2 — 模仿服務端響應基本概念
- Retrofit 2 — 模仿服務端響應自定義網(wǎng)絡行為
- Retrofit 2 — 使用 @HeaderMap 定義動態(tài)請求頭
基礎
Retrofit 默認附帶了 Google's JSON. 每個JSON映射都在GSON的幫助下完成. 有時候叁丧,你的框架或?qū)傩孕枰淖兗傻腏SON轉(zhuǎn)換器. 一個著名的轉(zhuǎn)換器是 Jackson. 我們將使用 Jackson 做為代碼示例.
現(xiàn)有的 Retrofit 轉(zhuǎn)換器
除了 GSON, Retrofit 可被配置成各種內(nèi)容格式. retrofit-converters 目錄列出了現(xiàn)有的響應轉(zhuǎn)換器:
與gradle的整合可以用以下命令來完成:
compile 'com.squareup.retrofit:converter-<converter-name>:1.9.0'
# e.g. Jackson
compile 'com.squareup.retrofit:converter-jackson:1.9.0'
# e.g. XML
compile 'com.squareup.retrofit:converter-simplexml:1.9.0'
你應該知道如何整合 protocol buffers :)
創(chuàng)建你自己的轉(zhuǎn)換器
一旦你需要或想要創(chuàng)建自己的 Retrofit 響應轉(zhuǎn)換器咳蔚,你可以按照下面的步驟. 我們將使用 Jackson 庫來說明具體的定義和處理.
記住: 目前已有的 Retrofit 轉(zhuǎn)換器 你可以通過集成各自的gradle依賴直接使用它們.
Jackson Gradle 依賴
首先, 定義 Jackson 依賴. 本例使用的是 Jackson 2.x ,與以前的 Jackson 1.x 有很大的不同. 添加需要的 Maven 庫和編譯依賴.
repositories {
maven { url "http://repository.codehaus.org/org/codehaus" }
}
dependencies {
compile 'com.fasterxml.jackson.core:jackson-databind:2.4.3'
}
實現(xiàn)自定義的 JSON 轉(zhuǎn)換器
替換 Retrofit 的 JSON 轉(zhuǎn)換器最重要的部分是實現(xiàn) Converter
接口并覆蓋兩個方法: fromBody
and toBody
.
public class JacksonConverter implements Converter {
private ObjectMapper mapper = new ObjectMapper();
@Override
public Object fromBody(TypedInput body, Type type) throws ConversionException {
JavaType javaType = mapper.getTypeFactory().constructType(type);
try {
return mapper.readValue(body.in(), javaType);
} catch (IOException e) {
throw new ConversionException(e);
}
}
@Override
public TypedOutput toBody(Object object) {
try {
String charset = "UTF-8";
String json = mapper.writeValueAsString(object);
return new JsonTypedOutput(json.getBytes(charset));
} catch (IOException e) {
throw new AssertionError(e);
}
}
private static class JsonTypedOutput implements TypedOutput {
private final byte[] jsonBytes;
JsonTypedOutput(byte[] jsonBytes) { this.jsonBytes = jsonBytes; }
@Override public String fileName() { return null; }
@Override public String mimeType() { return "application/json; charset=UTF-8"; }
@Override public long length() { return jsonBytes.length; }
@Override public void writeTo(OutputStream out) throws IOException { out.write(jsonBytes); }
}
}
JsonTypedOutput
類被用來設置正確的 mimeType. 由于輸出類型是JSON, mime 類型也應該是 application/json
.
設置自定義JSON轉(zhuǎn)換器
Retrofit 的 JSON轉(zhuǎn)換器被集成在RestAdapter
里. 通過調(diào)用RestAdapter
對象的setConverter()
方法可以改變轉(zhuǎn)換器. 此外, 當創(chuàng)建 rest 客戶端時, 你可以在RestAdapter
的構(gòu)建過程里直接設置轉(zhuǎn)換器來集成 jackson 轉(zhuǎn)換器.
// Create our Converter
JacksonConverter jacksonConverter = new JacksonConverter();
// Build the Retrofit REST adaptor pointing to the URL specified, with the Converter.
// Note: The Converter must be set before the .build() command
RestAdapter restAdapter = new RestAdapter.Builder()
.setConverter(jacksonConverter)
.setEndpoint("https://api.example.com/")
.build();
干得漂亮! 以后你創(chuàng)建的所有RestAdapter
都將使用 JacksonConverter 來處理 JSON.
如果你遇到任何問題或困難, 請 Twitter @futurestud_io.