gpt4 book ai didi

android - 如何捕捉对 get 方法 android 改造的响应?

转载 作者:行者123 更新时间:2023-11-29 23:26:42 25 4
gpt4 key购买 nike

我是 android 开发的新手,正在尝试学习它。我最近遇到了一个问题,当我使用 get 方法时,我得到如下响应:

Image

由于后端的status 为“0”,我无法捕获“response_data”数组。谁能指导我如何才能收到回复。谢谢。

API 客户端:

 public class ApiClient {
private final static String BASE_URL = "http://api.xxxxxx.com/app/";
public static ApiClient apiClient;
private Retrofit retrofit = null;

public static ApiClient getInstance() {
if (apiClient == null) {
apiClient = new ApiClient();
}
return apiClient;
}
public Retrofit getClient() {
return getClient(null);
}



private Retrofit getClient(final Context context) {

HttpLoggingInterceptor interceptor = new
HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient.Builder client = new OkHttpClient.Builder();
client.readTimeout(60, TimeUnit.SECONDS);
client.writeTimeout(60, TimeUnit.SECONDS);
client.connectTimeout(60, TimeUnit.SECONDS);
client.addInterceptor(interceptor);
client.addInterceptor(new Interceptor() {
@Override
public okhttp3.Response intercept(Chain chain) throws
IOException {
Request request = chain.request();

return chain.proceed(request);
}
});

retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.client(client.build())
.addConverterFactory(GsonConverterFactory.create())
.build();


return retrofit;
}

}

主要 Activity :

public class MainActivity extends AppCompatActivity {

TextView tvResponse;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

tvResponse=findViewById(R.id.tvResponse);

ApiInterface apiInterface = ApiClient.getInstance().getClient().create(ApiInterface.class);
Call<ResponseData> responseDataCall=apiInterface.getData();
responseDataCall.enqueue(new Callback<ResponseData>() {
@Override
public void onResponse(Call<ResponseData> call, Response<ResponseData> response) {
if (response.isSuccessful() && response.body()!=null && response!=null){
List<ResponseDataItem> data=response.body().getResponseData();

}
}

@Override
public void onFailure(Call<ResponseData> call, Throwable t) {
t.printStackTrace();
}
});
}

响应数据:

public class ResponseData {
@SerializedName("response_data")
private List<ResponseDataItem> responseData;

@SerializedName("status")
private int status;

public void setResponseData(List<ResponseDataItem> responseData){
this.responseData = responseData;
}

public List<ResponseDataItem> getResponseData(){
return responseData;
}

public void setStatus(int status){
this.status = status;
}

public int getStatus(){
return status;
}

最佳答案

在这种情况下,您需要让 Gson 知道您希望如何解析您的 json。您可以为每个特定的类案例添加许多特定的 TypeAdapter,或者您可以创建一个将用于解析所有 json 的 TypeAdapterFactory。请记住将其添加到您的 Retrofit 构建器中。

此代码示例是一个 TypeAdapterFactory,它将忽略 status 并仅解析 response_data 到您的对象。

class ResponseDataTypeAdapterFactory implements TypeAdapterFactory {

public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {
TypeAdapter<T> delegate = gson.getDelegateAdapter(this, type);
TypeAdapter<JsonElement> elementTypeAdapter = gson.getAdapter(JsonElement.class);

return new TypeAdapter<T>() {
public void write(JsonWriter out, T value) throws IOException {
delegate.write(out, value);
}

public T read(JsonReader reader) throws IOException {

JsonElement jsonElement = elementTypeAdapter.read(reader);

if (jsonElement.isJsonObject()) {
JsonObject jsonObject = jsonElement.getAsJsonObject();
if (jsonObject.has("response_data")) {
jsonElement = jsonObject.get("response_data");
}
}

return delegate.fromJsonTree(jsonElement);
}
};
}
}

在你的 Retrofit 构建器上

Gson gson = new GsonBuilder()
.registerTypeAdapterFactory(ResponseDataTypeAdapterFactory())
.create();

new Retrofit.Builder()
.baseUrl(BASE_URL)
.client(client.build())
.addConverterFactory(new GsonConverterFactory.create(gson))
.build();

而在Retrofit接口(interface),只需要调用response_data映射对应的类即可。

public interface ApiInterface {

@GET("/product-data")
Call<List<ResponseDataItem>> fetchData();
}

通过此实现,您可以删除 ResponseData 类并只关心重要的模型。

关于android - 如何捕捉对 get 方法 android 改造的响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53444336/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com