首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从retrofit2获取String响应正文

从retrofit2获取String响应正文
EN

Stack Overflow用户
提问于 2016-02-20 14:33:24
回答 3查看 14.5K关注 0票数 3

我使用的是retrofit1的旧风格

代码语言:javascript
运行
复制
@GET("/loginUser")
    public Call<Response> login(
            @Query("email") String email,
            @Query("password") String password,
            Callback<Response> callback);

现在我不想获取"User“类,但是我想获取一个字符串响应。

之前我们使用的是" Response“,但是在retrofit2中没有响应,

如何在不使用任何json解析的情况下从服务器获取字符串响应或正文响应?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-02-20 14:39:23

创建此类

代码语言:javascript
运行
复制
import java.io.IOException;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;

import okhttp3.MediaType;
import okhttp3.RequestBody;
import okhttp3.ResponseBody;
import retrofit2.Converter;
import retrofit2.Retrofit;

public class ToStringConverterFactory extends Converter.Factory {
    private static final MediaType MEDIA_TYPE = MediaType.parse("text/plain");


    @Override
    public Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations, Retrofit retrofit) {
        if (String.class.equals(type)) {
            return new Converter<ResponseBody, String>() {
                @Override
                public String convert(ResponseBody value) throws IOException {
                    return value.string();
                }
            };
        }
        return null;
    }

    @Override
    public Converter<?, RequestBody> requestBodyConverter(Type type, Annotation[] annotations, Retrofit retrofit) {

        if (String.class.equals(type)) {
            return new Converter<String, RequestBody>() {
                @Override
                public RequestBody convert(String value) throws IOException {
                    return RequestBody.create(MEDIA_TYPE, value);
                }
            };
        }
        return null;
    }
}

将其与

代码语言:javascript
运行
复制
Retrofit retrofit = new Retrofit.Builder()
                        .addConverterFactory(new ToStringConverterFactory())
                        .build();

EDIT:您必须将其定义为

代码语言:javascript
运行
复制
@GET("/loginUser")
    public Call<String> login(
            @Query("email") String email,
            @Query("password") String password);

在retrofit2中不支持回调,所以你必须删除它。要使其异步,您必须执行以下操作

代码语言:javascript
运行
复制
Call<String> call = service.login(username, password);
call.enqueue(new Callback<String>() {}

编辑上面的代码是为retrofit2 beta 3编写的。对于2.1.0版本,你必须创建如下的ToStringConverterFactory -

代码语言:javascript
运行
复制
import java.io.IOException;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;

import okhttp3.MediaType;
import okhttp3.RequestBody;
import okhttp3.ResponseBody;
import retrofit2.Converter;
import retrofit2.Retrofit;

public class ToStringConverterFactory extends Converter.Factory {
    private static final MediaType MEDIA_TYPE = MediaType.parse("text/plain");


    @Override
    public Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations, Retrofit retrofit) {
        if (String.class.equals(type)) {
            return new Converter<ResponseBody, String>() {
                @Override
                public String convert(ResponseBody value) throws IOException {
                    return value.string();
                }
            };
        }
        return null;
    }

    @Override
    public Converter<?, RequestBody> requestBodyConverter(Type type, Annotation[] parameterAnnotations,
                                                          Annotation[] methodAnnotations, Retrofit retrofit) {

        if (String.class.equals(type)) {
            return new Converter<String, RequestBody>() {
                @Override
                public RequestBody convert(String value) throws IOException {
                    return RequestBody.create(MEDIA_TYPE, value);
                }
            };
        }
        return null;
    }
}

很高兴知道:如果你想有多个转换器(例如,如上所示的字符串转换器和GSON转换器):

确保先指定特殊用途的转换器(例如字符串转换器),最后指定通用转换器(如Gson)!

转换器将按照它们被添加的顺序调用,如果转换器使用了响应,则不会调用后面的转换器。

票数 17
EN

Stack Overflow用户

发布于 2016-04-05 19:03:05

改进的2.0.0-beta3添加了一个转换器-标量模块,提供了一个Converter.Factory,用于将字符串、8个原始类型和8个盒装原始类型转换为文本/普通正文。在您的常规转换器之前安装它,以避免通过JSON转换器传递这些简单的标量。

票数 1
EN

Stack Overflow用户

发布于 2018-07-27 15:53:29

代码语言:javascript
运行
复制
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(API_BASE_URL)
                .client(getClient())
                .addConverterFactory(ScalarsConverterFactory.create())
                .addConverterFactory(GsonConverterFactory.create())
                .build();

GsonConverterFactory之上的ScalarsConverterFactory

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35520012

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档