我正在尝试从以下Api获得回复:
https://api.github.com/users/username
但我不知道如何以[{1}}获取回复,以便我可以使用String
来解析并获取String
。
使用的改装版本:
改型:2.0.0-β1
我一直试过这个:
JSONObject
检索:
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) {
}
});
任何帮助都会非常感激。
答案 0 :(得分:184)
**更新**已经添加了一个标量转换器,以便进行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
土地上乱七八糟。我怀疑如果你需要操纵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
文档。