Android Retrofit 2 - 使用 POST 发送数组 <Object> 时出现问题
Android Retrofit 2 - problem with sending the Array<Object> using POST
我是改造后的新人,现在,当我知道如何在没有任何对象的情况下发送普通数据时,仅使用参数或简单的主体我想知道如何发送对象...
我花了大约 20 小时来调试它,但我很困惑,因为我不知道该怎么做......
有我的代码:
API接口:
@POST("/api/assortment")
Call<PostAssortment> getAssortment(@Body String PostShipmentProgress);
分类后 class:
public class PostAssortment {
private String JSON;
@SerializedName("token")
@Expose
private String token;
@SerializedName("assortment")
@Expose
private Assortment assortment;
@SerializedName("tokens")
@Expose
private List<String> tokens;
@SerializedName("positions")
@Expose
private List<Position> positions;
@SerializedName("deviceId")
@Expose
private String deviceId;
public String getToken() {
return token;
}
public void setToken(String token) {
this.token = token;
}
public Shipment getAssortment() {
return assortment;
}
public void setAssortment(Assortment assortment) {
this.assortment = assortment;
}
public List<String> getTokens() {
return tokens;
}
public void setTokens(List<String> tokens) {
this.tokens = tokens;
}
public List<Position> getPositions() {
return positions;
}
public void setPositions(List<Position> positions) {
this.positions = positions;
}
public String getDeviceId() {
return deviceId;
}
public void setDeviceId(String deviceId) {
this.deviceId = deviceId;
}
public String getJSON() {
return JSON;
}
public void setJSON(String JSON) {
this.JSON = JSON;
}
}
和 mainJava class:
Gson gson = new Gson();
PostAssortment postAssortment= new PostAssortment();
List<String> tokens = new ArrayList<>();
tokens.add("someToken");
postAssortment.setTokens(tokens);
postAssortment.setDeviceId("aaaaa");
List<Position> currentPosition = new ArrayList<>();
Position cp = new Position();
cp.setItemName("Some");
cp.setPlace("POLAND");
cp.setTimestamp("2020-12-09T11:00:00");
currentPosition.add(cp);
postAssortment.setPositions(currentPosition);
String postAssortmentJSON = gson.toJson(postAssortment);
Call<PostAssortment> call = ApiLoginInterface.getAssortment(postAssortmentJSON);
call.enqueue(new Callback<PostAssortment>() {
@Override
public void onResponse(Call<PostAssortment> call, Response<PostAssortment> response) {
PostAssortment assortmentResponse = response.body();
}
@Override
public void onFailure(Call<PostAssortment> call, Throwable t) {
Log.d("FAILURE", "onFailure: " + t.getMessage());
}
});
}
还有我的 onCreate 改造:
Gson gson = new GsonBuilder()
.setLenient()
.create();
String BASE_URL = getString(API_URL);
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create(gson))
.build();
ApiLoginInterface = retrofit.create(ApiLoginInterface.class);
在我尝试调用它之后我没有得到任何调用排队的点只是一个
Android: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.Object.toString()' on a null object reference
错误...
有人可以描述一下并帮助我让它发挥作用吗? :/
您没有提供足够的信息来帮助识别错误。也可能将完整的堆栈跟踪添加到问题中。但是,如果您的 API post 请求需要一个 json 正文,我将从以下修复开始:
删除这个:
String postAssortmentJSON = gson.toJson(postAssortment);
然后像这样将您的对象作为 pojo 传递给您的改装界面:
@POST("/api/assortment")
Call<PostAssortment> getAssortment(@Body PostAssortment postAssortment);
然后在调用时不需要将其转换为字符串 json 字符串。适配器会为您做到这一点:
Call<PostAssortment> call = ApiLoginInterface.getAssortment(postAssortment);
Post 我的问题中的分类将在列表中,因此要使其正常工作,我需要将调用更改为
我是改造后的新人,现在,当我知道如何在没有任何对象的情况下发送普通数据时,仅使用参数或简单的主体我想知道如何发送对象... 我花了大约 20 小时来调试它,但我很困惑,因为我不知道该怎么做...... 有我的代码:
API接口:
@POST("/api/assortment")
Call<PostAssortment> getAssortment(@Body String PostShipmentProgress);
分类后 class:
public class PostAssortment {
private String JSON;
@SerializedName("token")
@Expose
private String token;
@SerializedName("assortment")
@Expose
private Assortment assortment;
@SerializedName("tokens")
@Expose
private List<String> tokens;
@SerializedName("positions")
@Expose
private List<Position> positions;
@SerializedName("deviceId")
@Expose
private String deviceId;
public String getToken() {
return token;
}
public void setToken(String token) {
this.token = token;
}
public Shipment getAssortment() {
return assortment;
}
public void setAssortment(Assortment assortment) {
this.assortment = assortment;
}
public List<String> getTokens() {
return tokens;
}
public void setTokens(List<String> tokens) {
this.tokens = tokens;
}
public List<Position> getPositions() {
return positions;
}
public void setPositions(List<Position> positions) {
this.positions = positions;
}
public String getDeviceId() {
return deviceId;
}
public void setDeviceId(String deviceId) {
this.deviceId = deviceId;
}
public String getJSON() {
return JSON;
}
public void setJSON(String JSON) {
this.JSON = JSON;
}
}
和 mainJava class:
Gson gson = new Gson();
PostAssortment postAssortment= new PostAssortment();
List<String> tokens = new ArrayList<>();
tokens.add("someToken");
postAssortment.setTokens(tokens);
postAssortment.setDeviceId("aaaaa");
List<Position> currentPosition = new ArrayList<>();
Position cp = new Position();
cp.setItemName("Some");
cp.setPlace("POLAND");
cp.setTimestamp("2020-12-09T11:00:00");
currentPosition.add(cp);
postAssortment.setPositions(currentPosition);
String postAssortmentJSON = gson.toJson(postAssortment);
Call<PostAssortment> call = ApiLoginInterface.getAssortment(postAssortmentJSON);
call.enqueue(new Callback<PostAssortment>() {
@Override
public void onResponse(Call<PostAssortment> call, Response<PostAssortment> response) {
PostAssortment assortmentResponse = response.body();
}
@Override
public void onFailure(Call<PostAssortment> call, Throwable t) {
Log.d("FAILURE", "onFailure: " + t.getMessage());
}
});
}
还有我的 onCreate 改造:
Gson gson = new GsonBuilder()
.setLenient()
.create();
String BASE_URL = getString(API_URL);
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create(gson))
.build();
ApiLoginInterface = retrofit.create(ApiLoginInterface.class);
在我尝试调用它之后我没有得到任何调用排队的点只是一个
Android: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.Object.toString()' on a null object reference
错误... 有人可以描述一下并帮助我让它发挥作用吗? :/
您没有提供足够的信息来帮助识别错误。也可能将完整的堆栈跟踪添加到问题中。但是,如果您的 API post 请求需要一个 json 正文,我将从以下修复开始:
删除这个:
String postAssortmentJSON = gson.toJson(postAssortment);
然后像这样将您的对象作为 pojo 传递给您的改装界面:
@POST("/api/assortment")
Call<PostAssortment> getAssortment(@Body PostAssortment postAssortment);
然后在调用时不需要将其转换为字符串 json 字符串。适配器会为您做到这一点:
Call<PostAssortment> call = ApiLoginInterface.getAssortment(postAssortment);
Post 我的问题中的分类将在列表中,因此要使其正常工作,我需要将调用更改为