我正在尝试从以下 Api 获得响应:
https://api.github.com/users/username
但我不知道如何以 String
的形式获取响应,以便我可以使用 String
解析并获取 JSONObject
。
使用的 retrofit 版本:
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) {
}
});
异常(exception):
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)
任何帮助将不胜感激。
最佳答案
** 更新 ** 一个标量转换器已添加到改造中,它允许 String
响应比我下面的原始答案更简洁。
示例界面--
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
领域乱搞。我怀疑使用自定义 gson TypeAdapter
可能会更好地解决您的具体问题或改造 Converter
如果您需要操作 JSON。但是,改造提供了更多通过 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()
,它将整个响应读入一个字符串。如果您将主体传递给可以摄取流的东西,则可以改为调用 charStream()
。见 ResponseBody
文档。
关于android - 如何在不使用 GSON 或 android 中的任何其他库的情况下使用改造以字符串形式获得响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32617770/