Retrofit Parsing中的url没有响应

Posted

技术标签:

【中文标题】Retrofit Parsing中的url没有响应【英文标题】:No response from url in Retrofit Parsing 【发布时间】:2018-08-23 10:27:55 【问题描述】:

我正在使用改造实现 json 解析,但我没有从 url 得到任何响应。 Json 数据是数组的形式,里面有对象。我试图在 TextView 中设置来自 Url 的响应。我已经实现如下:

我的JSON结构如下:

[
    "id": "2",
    "name": "Nbn",
    "code": "001",
    "ecozone": "ter",
    "devregion": "east"
,

    "id": "3",
    "name": "hari",
    "code": "002",
    "ecozone": "hill",
    "devregion": "west"

]

API 服务

public interface ApiService 
@GET("/data_new.php?q=district")
Call<District> getMyJSON();

改造客户端

public class RetrofitClient 
private static final String url = "url/";

private static Retrofit getRetrofitInstance() 
    OkHttpClient client=new OkHttpClient();
    return new Retrofit.Builder()
            .baseUrl(url)
            .client(client)
            .addConverterFactory(GsonConverterFactory.create())
            .build();

public static ApiService getApiService()
    return getRetrofitInstance().create(ApiService.class);


我的 ModelDto 类

public class DistrictDTO 
@SerializedName("id")
@Expose
String id;

public String getId() 
    return id;


public void setId(String id) 
    this.id = id;


@SerializedName("name")
@Expose
String name;

public String getName() 
    return name;


public void setName(String name) 
    this.name = name;


@SerializedName("code")
@Expose
String code;

public String getCode() 
    return code;


public void setCode(String code) 
    this.code = code;


@SerializedName("ecozone")
@Expose
String ecozone;

public String getEcozone() 
    return ecozone;


public void setEcozone(String ecozone) 
    this.ecozone = ecozone;


@SerializedName("devregion")
@Expose
String devregion;

public String getDevregion() 
    return devregion;


public void setDevregion(String devregion) 
    this.devregion = devregion;




区DTO

public class District 
public ArrayList<DistrictDTO> districtDTOS;

public ArrayList<DistrictDTO> getDistrictDTOS() 
    return districtDTOS;


public void setDistrictDTOS(ArrayList<DistrictDTO> districtDTOS) 
    this.districtDTOS = districtDTOS;


和活动

public class DistrictActivity extends AppCompatActivity 
private ArrayList<DistrictDTO> district;
private TextView textView;

@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_district);
    district = new ArrayList<>();
    textView = (TextView) findViewById(R.id.textVi);
    ApiService api = RetrofitClient.getApiService();
    retrofit2.Call<District> call = api.getMyJSON();
    call.enqueue(new Callback<District>() 
        @Override
        public void onResponse(retrofit2.Call<District> call, Response<District> response) 

            if (response.isSuccessful()) 
                //got successfully
                district = response.body().getDistrictDTOS();
                Log.e("Respose", "" + district);
                textView.setText(response.body().getDistrictDTOS().toString());
            
        
        @Override
        public void onFailure(retrofit2.Call<District> call, Throwable t) 

            t.fillInStackTrace();
        
    );



【问题讨论】:

它应该是数组,您将对象作为响应...调用数组或列表 你能解释一下怎么做吗? @SantanuSur 在您的 District 类中将您的 ArrayList&lt;DistrictDTO&gt; 更改为 List&lt;DistrictDTO&gt; 附加提示:如果类字段被准确命名为键,则不需要@SerializedName ;) @Nbn 尝试从您的端点获取数组而不是对象,请参阅下面的答案 【参考方案1】:

试试

public interface ApiService 
@GET("/data_new.php?q=district")
Call<District[]> getMyJSON();

你调用的是一个数组,而不是一个对象

编辑:

实际上,我认为您应该将类​​ DistrictDTO 重命名为 District,并删除另一个。并且,将您想要该数组的所有部分更改为District[]

【讨论】:

【参考方案2】:

只需进行这些更改它应该可以工作(返回数组而不是对象

 public class DistrictActivity extends AppCompatActivity 
private ArrayList<DistrictDTO> district;
private TextView textView;

@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_district);
    district = new ArrayList<>();
    textView = (TextView) findViewById(R.id.textVi);
    ApiService api = RetrofitClient.getApiService();
    retrofit2.Call<List<DistrictDTO>> call = api.getMyJSON();
    call.enqueue(new Callback<List<DistrictDTO>>() 
        @Override
        public void onResponse(retrofit2.Call<List<DistrictDTO>> call, Response<List<DistrictDTO>> response) 

            if (response.isSuccessful()) 
                //got successfully
                district = response.body().toString();
                Log.e("Respose", "" + district);
                textView.setText(response.body().toString());
            
        
        @Override
        public void onFailure(retrofit2.Call<List<DistrictDTO>> call, Throwable t) 
Toast.makeText(DistrictActivity.this,t.toString(),Toast.LENGTH_SHORT).show();
            t.fillInStackTrace();
        
    );



你的界面应该是这样的

    public interface ApiService 
@GET("/data_new.php?q=district")
Call<List<DistrictDTO>> getMyJSON();

事实上你应该期望一个数组而不是一个像上面这样的对象,只返回一个DistrictDTO 的列表,District 不需要类

仅供参考:当来自服务器的响应是 .. 的形式时,您应该期待一个对象(就像您所做的那样)但是当它像 [..] 它是一个 json 数组时,因此您应该期待一个数组(这是您的情况,就像我在回答中所做的那样)

【讨论】:

您能解释一下如何返回 DistrictDTO 的列表吗? 只需将改造的call 返回类型更改为&lt;List&lt;DistrictDTO&gt;&gt;,如上所述,同时更改Api Service 和您的活动 @Nbn 我在我的回答中的fyi 部分添加了关于如何解析 json 的说明 我已经按照你的指示实施了,但问题还是一样@fix @Nbn 在onFailure callabck 添加祝酒词,就像我在答案中更新并检查错误是什么

以上是关于Retrofit Parsing中的url没有响应的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Retrofit 2 处理空响应体?

当我们有 OkHttp 时为啥要使用 Retrofit

从retrofit2和rxjava中的错误获取url

通过 Retrofit 中的 Model 类在 GET 请求 URL 中传递 ID

如何使用Retrofit 2和Gson来模拟JSON响应“密钥”频繁更改的数据

Dagger2+Retrofit 使用 Subcomponent 更改 URL:如果没有 @Provides- 或 @Produces-annotated 方法,则无法提供