我正在寻找一些方法来使用新的Retrofit 2.0b1发布带有原始主体的请求。像这样:
@POST("/token")
Observable<TokenResponse> getToken(@Body String body);
据我所知,应该有某种类型的“to-string”转换器,但我还不清楚它是如何工作的。
有很多方法可以在1.9版本中使用TypedInput实现它,但它在2.0中没有帮助。
PS是的,后端是愚蠢的,据我所知,没有人会为我改变它:(
感谢您的帮助。
答案 0 :(得分:34)
在Retrofit 2.0.0-beta2中,您可以使用RequestBody
和ResponseBody
使用String
数据将正文发布到服务器,并从服务器的响应正文中读取{{ 1}}。
首先,您需要在RetrofitService中声明一个方法:
String
接下来,您需要创建一个interface RetrofitService {
@POST("path")
Call<ResponseBody> update(@Body RequestBody requestBody);
}
和RequestBody
对象:
Call
最后发出请求并将响应正文读作Retrofit retrofit = new Retrofit.Builder().baseUrl("http://somedomain.com").build();
RetrofitService retrofitService = retrofit.create(RetrofitService.class);
String strRequestBody = "body";
RequestBody requestBody = RequestBody.create(MediaType.parse("text/plain"),strRequestBody);
Call<ResponseBody> call = retrofitService.update(requestBody);
:
String
答案 1 :(得分:6)
当您使用Type
构建Retrofit
时,您应该为addConverter(type, converter)
注册转换器。
Converter<T>
使用类似的方法在1.x版本中使用旧的转换器。
您的StringConverter
应该是这样的:
public class StringConverter implements Converter<Object>{
@Override
public String fromBody(ResponseBody body) throws IOException {
return ByteString.read(body.byteStream(), (int) body.contentLength()).utf8();
}
@Override
public RequestBody toBody(Object value) {
return RequestBody.create(MediaType.parse("text/plain"), value.toString());
}
}
注意:
ByteString
来自Okio图书馆。 Charset
MediaType
醇>