参见英文答案 > 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
文档.