如何获得响应字符串使用改造不使用 GSON 或任何其他库在 android

我正试图得到以下阿皮的回应:

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

但是我不知道如何获得作为 String的响应,这样我就可以使用 String来解析和获得 JSONObject

翻新版本使用:

翻新: 2.0.0-beta 1

直到现在,我一直在尝试这样做:

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)

如果你能帮忙,我将不胜感激。

124449 次浏览

更新 * * 一个标量转换器已被添加到改造,允许 String响应比我原来的答案更少的仪式下面。

接口示例——

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

如果使用 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 请求中涉及的许多其他乏味的任务。仅仅因为您不想使用其中的一个特性,并不意味着您必须抛弃整个特性。有时你只是想得到原始的流,所以这里是如何做到这一点-

首先,如果您正在使用卢克菲特2,您应该开始使用 Call API。使用 okhttp ——中的 ResponseBody代替发送要转换为 type 参数的对象

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

注意 上面的代码在 response 对象上调用 string(),它将整个响应读入一个 String。如果要将主体传递给某个可以摄取流的东西,则可以调用 charStream()。查看 ResponseBody文档。