我对Retrofit有一个问题。我正在开发一个Android应用程序,需要从开放食品事实API获取有关产品的信息。我尝试过Retrofit,我创建了一个类,我想从JSON的信息(我只需要几个字段,我不想做一个类与所有的JSON字段,因为有超过50我认为)
public class Product {
@SerializedName("product_name_en")
private String name;
@SerializedName("brands")
private String company;
@SerializedName("update_key")
private int key;
public String getName() {
return name;
}
public String getCompany() {
return company;
}
public int getKey() {
return key;
}
}
然后我用@GET方法和API端点的相对URL创建了一个接口
public interface OpenFoodFactsAPI {
@Headers("User-Agent: Fooducate - Android - Version 1.0")
@GET("/api/v0/product/01223004")
Call<Product> getProducts();
}
在我的fragment里面我做了这个
TextView text = view.findViewById(R.id.txt);
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://us.openfoodfacts.org")
.addConverterFactory(GsonConverterFactory.create())
.build();
OpenFoodFactsAPI jsonPlaceHolderApi = retrofit.create(OpenFoodFactsAPI.class);
Call<Product> call = jsonPlaceHolderApi.getProducts();
call.enqueue(new Callback<Product>() {
@Override
public void onResponse(Call<Product> call, Response<Product> response) {
if (!response.isSuccessful()) {
text.setText("Code: " + response.code());
return;
}
Product product = response.body();
String content = "";
content += "NAME: " + product.getName() + "n";
content += "COMPANY: " + product.getCompany() + "n";
content += "KEY: " + product.getKey() + "n";
text.append(content);
}
@Override
public void onFailure(Call<Product> call, Throwable t) {
text.setText(t.getMessage());
}
});
我尝试了一个网站上的get请求,它工作。但是,在我的应用程序中返回一个空响应。
你可以在这里从api查看JSON
如果你对这个问题有任何想法,请回答。谢谢你!从API
,您没有得到确切的Product
作为响应。你得到了另一个对象Product
是子对象
您需要创建如下所示的响应,
public class ResponseObject{
@SerializedName("status")
private int status;
@SerializedName("status_verbose")
private String status_verbose;
@SerializedName("product")
private Product product;
//getters and setters goes here
}
那么你的interface
应该像下面一样,因为你期望这里的ResponseObject
。
public interface OpenFoodFactsAPI {
@Headers("User-Agent: Fooducate - Android - Version 1.0")
@GET("/api/v0/product/01223004")
Call<ResponseObject> getProducts();
}
这将解决你的问题。如果你有任何问题,请告诉我。
使用
public class ResponseObject{
@SerializedName("status")
private int status;
@SerializedName("status_verbose")
private String status_verbose;
@SerializedName("product")
private Product product;
}
只改变
public int getKey() {return key;}
public String getKey() {
return key;
}
否则
Error: java.lang.NumberFormatException: For input string: "ecoscore20210127"
因为在json中它像"update_key"; "ecoscore20210127">