如何在不使用GSON或android中的任何其他库的情况下使用改造获得响应为String

参见英文答案 > Unable to create call adapter for class example.Simple                                    12个
我想从以下Api得到回应:

https://api.github.com/users/username

但我不知道如何获得String的响应,以便我可以使用String来解析并获取JSONObject.

使用的改装版本:

retrofit:2.0.0-beta1

我一直试过这个:

public interface GitHubService {
        @GET("/users/{user}")
        public String listRepos(@Path("user") String user,Callback<String> callback);
    }

检索:

GitHubService service = retrofit.create(GitHubService.class);
        service.listRepos("username", new Callback<String>() {
            @Override
            public void onResponse(Response response) {
                System.out.println(response.toString());
            }

            @Override
            public void onFailure(Throwable t) {

            }
        });

例外:

Caused by: java.lang.IllegalArgumentException: Could not locate call adapter for class java.lang.String. Tried:
    * retrofit.ExecutorCallAdapterFactory
            at retrofit.Utils.resolveCallAdapter(Utils.java:67)
            at retrofit.MethodHandler.createCallAdapter(MethodHandler.java:49)

任何帮助将非常感激.

解决方法:

**更新**已添加一个标量转换器进行改造,允许使用比我下面的原始答案更少的仪式的字符串响应.

示例界面 –

public interface GitHubService {
    @GET("/users/{user}")
    Call<String> listRepos(@Path("user") String user);
}

将ScalarsConverterFactory添加到您的改造构建器中.注意:如果使用ScalarsConverterFactory和其他工厂,请先添加标量工厂.

Retrofit retrofit = new Retrofit.Builder()
    .baseUrl(BASE_URL)
    .addConverterFactory(ScalarsConverterFactory.create())
    // add other factories here, if needed.
    .build();

您还需要在gradle文件中包含标量转换器 –

implementation 'com.squareup.retrofit2:converter-scalars:2.1.0'

—原始答案(仍然有效,只需更多代码)—

我同意@CommonsWare,你想拦截自己处理JSON的请求似乎有点奇怪.大多数情况下,POJO拥有您需要的所有数据,因此无需在JSONObject域中乱七八糟.我怀疑如果你需要操纵JSON,使用自定义gson TypeAdapter或改进Converter可以更好地解决你的具体问题.但是,改造通过Gson提供了更多的JSON解析.它还管理REST请求中涉及的许多其他繁琐任务.仅仅因为你不想使用其中一个功能,并不意味着你必须把整个事情扔掉.有时你只想获得原始流,所以这里是如何做到的 –

首先,如果您使用的是Retrofit 2,则应该开始使用Call API.而不是发送一个对象作为类型参数转换,使用来自okhttp的ResponseBody –

public interface GitHubService {
    @GET("/users/{user}")
    Call<ResponseBody> listRepos(@Path("user") String user);
}

然后你可以创建和执行你的电话 –

GitHubService service = retrofit.create(GitHubService.class);
Call<ResponseBody> result = service.listRepos(username);
result.enqueue(new Callback<ResponseBody>() {
    @Override
    public void onResponse(Response<ResponseBody> response) {
        try {
            System.out.println(response.body().string());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onFailure(Throwable t) {
        e.printStackTrace();
    }
});

注意上面的代码在响应对象上调用string(),它将整个响应读入String.如果您将正文传递给可以摄取流的内容,则可以调用charStream().请参阅ResponseBody文档.

上一篇:javax.net.ssl.SSLHandshakeException:java.security.cert.CertPathValidatorException:找不到证书路径的信任锚


下一篇:android – 了解数据流和多个订阅者(使用改进)