Retrofit 2.0 beta1:如何发布原始String body

时间:2015-09-18 15:59:04

标签: java android retrofit

我正在寻找一些方法来使用新的Retrofit 2.0b1发布带有原始主体的请求。像这样:

@POST("/token")
Observable<TokenResponse> getToken(@Body String body);

据我所知,应该有某种类型的“to-string”转换器,但我还不清楚它是如何工作的。

有很多方法可以在1.9版本中使用TypedInput实现它,但它在2.0中没有帮助。

PS是的,后端是愚蠢的,据我所知,没有人会为我改变它:(

感谢您的帮助。

2 个答案:

答案 0 :(得分:34)

在Retrofit 2.0.0-beta2中,您可以使用RequestBodyResponseBody使用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)注册转换器。

2.0中的

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());
    }
}

注意:

  1. ByteString来自Okio图书馆。
  2. 注意Charset
  3. 中的MediaType