【问题标题】:Retrofit 2.0 beta1: how to post raw String bodyRetrofit 2.0 beta1:如何发布原始字符串正文
【发布时间】:2015-12-15 20:37:14
【问题描述】:

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

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

据我了解,应该有某种海峡“转字符串”转换器,但我还不清楚它是如何工作的。

在 1.9 中可以使用 TypedInput 实现它,但在 2.0 中它不再有帮助。

【问题讨论】:

    标签: java android retrofit


    【解决方案1】:

    在 Retrofit 2 中,您可以使用 RequestBodyResponseBody 使用 String 数据将正文发布到服务器,并从服务器的响应正文中读取为 String

    首先你需要在你的 RetrofitService 中声明一个方法:

    interface RetrofitService {
        @POST("path")
        Call<ResponseBody> update(@Body RequestBody requestBody);
    }
    

    接下来你需要创建一个RequestBodyCall对象:

    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

    try {
        Response<ResponseBody> response = call.execute();
        if (response.isSuccess()) {
            String strResponseBody = response.body().string();
        }
    } catch (IOException e) {
        // ...
    }
    

    【讨论】:

    • 非常感谢。不错的解决方案
    • 这应该是有效的答案。
    【解决方案2】:

    在使用addConverter(type, converter) 构建Retrofit 时,您应该为Type 注册转换器。

    Converter&lt;T&gt; 在 2.0 中使用了类似的方法,在 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 中的MediaType

    【讨论】:

    • 我刚刚也找到了方法。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-11
    • 2023-04-10
    • 1970-01-01
    • 2011-03-31
    • 1970-01-01
    • 2019-11-27
    相关资源
    最近更新 更多