java - APICall 响应解析数据失败
问题描述
我需要从这个 URL https://newsapi.org/v1/articles?apiKey=6946d0c07a1c4555a4186bfcade76398&sortBy=top&source=bbc-news解析数据,但是当我进行 apicall 时,它永远不会进入 onResponse 函数,但总是 onFailure。总是得到一个 onFailure 中的“错误”吐司。
我尝试将 BASE_URL 和 Query 更改为几个不同的选项,但没有帮助。也许是我的对象有问题,但我找不到错误。
*****更新*****:我像评论中所说的那样更改了我的对象,但仍然获得了 onFailure 功能。
MainActivity.java
public class MainActivity extends AppCompatActivity implements
OnItemClickListener{
public static final String EXTRA_TITLE="Title";
public static final String EXTRA_DESCRIPTION="Description";
public static final String EXTRA_URL="URL";
private RecyclerView recycler;
private RecyclerAdapter adapter;
private ArrayList<NewsCell> newsList;
private Call<List<NewsCell>> apiCall;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
newsList=new ArrayList<>();
setupRecycler();
setUpApiCall();
}
private void setUpApiCall(){
apiCall=NetworkUtils.getApiInterface().getNews(
"6946d0c07a1c4555a4186bfcade76398","top","bbc-news");
apiCall.enqueue(new Callback<List<NewsCell>>() {
@Override
public void onResponse(Call<List<NewsCell>> call,
Response<List<NewsCell>> response) {
if(response.isSuccessful() && response.body().size()!=0){
newsList.addAll(response.body());
adapter=new
RecyclerAdapter(MainActivity.this,newsList,MainActivity.this);
recycler.setAdapter(adapter);
}
else{
Toast.makeText(MainActivity.this, "No results",
Toast.LENGTH_SHORT).show();
}
}
@Override
public void onFailure(Call<List<NewsCell>> call, Throwable t) {
Toast.makeText(MainActivity.this, "Error",
Toast.LENGTH_SHORT).show();
}
});
}
private void setupRecycler() {
recycler=findViewById(R.id.recyclerView);
recycler.setLayoutManager(new LinearLayoutManager(this));
}
@Override
public void onItemClick(int position) {
Intent detailIntent=new Intent(this,NewsSingle.class);
NewsCell clickedItem=newsList.get(position);
detailIntent.putExtra(EXTRA_TITLE,clickedItem.getTitle());
detailIntent.putExtra(EXTRA_DESCRIPTION,clickedItem.getDescription());
detailIntent.putExtra(EXTRA_URL,clickedItem.getUrlToImage());
startActivity(detailIntent);
}
}
NetvorkUtils.java
public class NetworkUtils {
private static final String BASE_API="https://newsapi.org/v1/";
private static APIInterface apiInterface;
public static APIInterface getApiInterface(){
if(apiInterface==null){
Retrofit retrofit =new Retrofit.Builder()
.baseUrl(BASE_API)
.addConverterFactory(GsonConverterFactory.create())
.build();
apiInterface=retrofit.create(APIInterface.class);
}
return apiInterface;
}
}
API接口.java
public interface APIInterface {
@GET("articles")
Call<List<NewsCell>> getNews(@Query("apiKey") String key, @Query("sortBy")
String sort,@Query("source") String source);
}
文章.java
public class Article {
@SerializedName("author")
@Expose
private String author;
@SerializedName("title")
@Expose
private String title;
@SerializedName("description")
@Expose
private String description;
@SerializedName("url")
@Expose
private String url;
@SerializedName("urlToImage")
@Expose
private String urlToImage;
@SerializedName("publishedAt")
@Expose
private String publishedAt;
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getUrlToImage() {
return urlToImage;
}
public void setUrlToImage(String urlToImage) {
this.urlToImage = urlToImage;
}
public String getPublishedAt() {
return publishedAt;
}
public void setPublishedAt(String publishedAt) {
this.publishedAt = publishedAt;
}
}
NewsCell.java
public class NewsCell {
@SerializedName("status")
@Expose
private String status;
@SerializedName("source")
@Expose
private String source;
@SerializedName("sortBy")
@Expose
private String sortBy;
@SerializedName("articles")
@Expose
private List<Article> articles = null;
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String getSource() {
return source;
}
public void setSource(String source) {
this.source = source;
}
public String getSortBy() {
return sortBy;
}
public void setSortBy(String sortBy) {
this.sortBy = sortBy;
}
public List<Article> getArticles() {
return articles;
}
public void setArticles(List<Article> articles) {
this.articles = articles;
}
}
解决方案
但在您的模型类中NewsCell
,您只解析title ,description and urlToImage
.which在 articles
数组内
@SerializedName("title")
@Expose
private String title;
@SerializedName("description")
@Expose
private String description;
@SerializedName("urlToImage")
@Expose
private String urlToImage;
所以我建议你复制整个你的回复。转到此站点并正确生成您的模型类。并粘贴到您的NewsCell
推荐阅读
- wso2 - WSO2 IS 5.5 - 高级身份验证配置未保存
- php - 更改列类型 Laravel 5
- angularjs - 删除多个 MD 菜单容器
- python - Python Django:更改在另一个列表中找到的部分字符串的字体颜色
- python - 数字列表和具有单个数字元组的列表有什么区别?
- machine-learning - 多输入多输出自动编码器
- haskell - 创建自定义 happstack 响应代码
- sql - 查询一个时间窗口中不存在于另一个时间窗口中的结果
- mysql - 在 GROUP BY 语句中获取平均值
- python - BeautifulSoup 中的 findAll() 会跳过多个 id