我试图通过$ http.post将json数组保存到后端服务但我总是得到400 Bad Request
。我四处搜索了,找不到明确的答案。
我的问题如下:
1.是否可以通过$ http.post发布json数组?
2.如果是,如何完成?
3.如果不是,那么还有什么其他选择来保存json数组?
为了使这一点更加清晰,我将在下面添加一些必要的代码。
在前端
SavingsService
createBatchSavings: function(savingsBatch){
return $http.post('/finance/savings/create/batchsavings', savingsBatch).success(function(data){
return data;
});
}
上面的功能正确地获得了它的savingsBatch参数。 savingsBatch是json数组。
在后端
SavingServiceImpl
@Component
@Path("/savings")
@Produces("application/json")
public class SavingsServiceImpl implements SavingsService {
@Autowired
FinanceEntityDao financeDao;
@POST
@Path("/create")
public FinanceEntity createSaving(FinanceEntity financeEntity) {
financeEntity.setType(FinanceType.SAVING);
financeEntity.setDateAdded(new Date());
return financeDao.save(financeEntity);
}
@POST
@Path("/create/batchsavings")
public List<FinanceEntity> createBatchSavings(List<FinanceEntity> savingsBatch) {
if(savingsBatch.size() > 0){
return financeDao.massSave(savingsBatch);
}
else {
throw new NullPointerException("Saving batch was null!");
}
}
}
我还检查了标题值。请求标头具有适当的值,但响应标头内容长度始终为零。
答案 0 :(得分:0)
是的,它绝对有可能发布一个数组数据,而你在客户端编写的代码发布数据是正确的。
您获得的状态代码400
必须是由于服务器端代码出现问题。我在您的服务器端代码中看到了 createBatchSavings 方法,但客户端的URL是小写的,批量存储。
这只是一个暗示。您需要添加有关服务器端代码的更多信息。
答案 1 :(得分:0)
这个问题终于解决了。这个实现中存在两个问题。第一个在前端,第二个在后端。
<强>前端强>
第一个问题是我试图将json数组直接发布到Java服务类,这将无法工作,因为它必须转换为正确的字符串json数组。将json数组从控制器发送到服务的代码是这样的:
$scope.createBatchSavings = function(batchSavings){
return SavingsService.createBatchSavings(batchSavings).success(function(data){
swal("Saving batch saved!", "Saving batch was saved successfully!", "success");
$scope.savingsBatch = [];
});
}
这里batchSavings是json数组,其中头部的内容类型是application / json。这必须是字符串化的,因此上面的方法必须写成如下所示,以便将适当的json数组传递给后端服务:
$scope.createBatchSavings = function(batchSavings){
return SavingsService.createBatchSavings(JSON.stringify(batchSavings)).success(function(data){
swal("Saving batch saved!", "Saving batch was saved successfully!", "success");
$scope.savingsBatch = [];
});
}
返回端强>
其次,必须在后端对此字符串化数组进行反序列化。以前,由于传递了不合适的json数组,前端服务和后端服务之间的连接甚至无法正常工作。因此,通过将json数组转换为适当的数组来修复连接。
为了使后端服务正常工作,我必须将参数类型从List<FinanceEntity>
更改为String
。我还必须选择反序列化“机器”。就我而言,我选择了Gson。因此,方法如下:
@POST
@Path("/create/batchsavings")
public List<FinanceEntity> createBatchSavings(List<FinanceEntity> savingsBatch) {
if(savingsBatch.size() > 0){
return financeDao.massSave(savingsBatch);
}
else {
throw new NullPointerException("Saving batch was null!");
}
}
变为:
@POST
@Path("/create/batchsavings")
public List<FinanceEntity> createBatchSavings(String savingsBatch) {
Gson gson = new Gson();
Type collectionType = new TypeToken<List<FinanceEntity>>(){}.getType();
List<FinanceEntity> savingsList = gson.fromJson(savingsBatch, collectionType);
if(savingsList.size() > 0){
return financeDao.massSave(savingsList);
}
else {
throw new NullPointerException("Saving batch was null!");
}
}
现在这一切都有效。
正如通知一样,如果您有任何日期,则必须将其格式化为正确的格式,否则您将遇到Java中的Unparsable date
问题。
答案 2 :(得分:-1)
问题如下:
如果是,怎么做?
$ http({method:'POST',url:'api / data',data:item array})
如果不是,还有什么其他选择来保存这样的目标的json数组?
有可能。