Javascript 是否可以使用$http.post发布一个数组?
我试图通过$http.post将json数组保存到后端服务中,但我总是收到Javascript 是否可以使用$http.post发布一个数组?,javascript,json,angularjs,http-post,angularjs-service,Javascript,Json,Angularjs,Http Post,Angularjs Service,我试图通过$http.post将json数组保存到后端服务中,但我总是收到400个错误请求。我在谷歌上搜索了所有的地方,没有一个明确的答案 我的问题如下: 1.是否可以通过$http.post发布json数组? 2.如果是,如何完成? 3.如果没有,那么还有什么其他的替代方案可以达到这样的目的来保存json数组呢 为了更清楚地说明这一点,我将在下面添加一些必要的代码 在前端 储蓄服务 createBatchSavings: function(savingsBatch){ retu
400个错误请求
。我在谷歌上搜索了所有的地方,没有一个明确的答案
我的问题如下:1.是否可以通过$http.post发布json数组?
2.如果是,如何完成?
3.如果没有,那么还有什么其他的替代方案可以达到这样的目的来保存json数组呢 为了更清楚地说明这一点,我将在下面添加一些必要的代码 在前端 储蓄服务
createBatchSavings: function(savingsBatch){
return $http.post('/finance/savings/create/batchsavings', savingsBatch).success(function(data){
return data;
});
}
上述函数正确地获取其savingsBatch参数。savingsBatch是json数组
在后端
储蓄服务公司
@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!");
}
}
}
@组件
@路径(“/savings”)
@生成(“应用程序/json”)
公共类savingserviceimpl实现savingservice{
@自动连线
财务实体道财务道;
@职位
@路径(“/create”)
公共金融实体创建储蓄(金融实体金融实体){
financeEntity.setType(FinanceType.SAVING);
financeEntity.setDateAdded(新日期());
返回financeDao.save(financeEntity);
}
@职位
@路径(“/create/batchsavings”)
公共列表CreateBatchSaves(列表保存批次){
如果(savingsBatch.size()>0){
返回财务dao.massave(savingsBatch);
}
否则{
抛出新的NullPointerException(“正在保存的批为null!”);
}
}
}
我还检查了标题值。请求标头具有正确的值,但响应标头内容长度始终为零 是的,发布数组数据是绝对可能的,并且您在客户端编写的发布数据的代码是正确的 您获得的状态代码
400
一定是由于服务器端代码出现问题。我在服务器端代码中看到了一个方法createBatchSavings,但客户端的URL是小写的,batchsavings
这只是一个暗示。您需要添加有关服务器端代码的更多信息。问题如下:
这个问题终于解决了。在这个实施过程中有两个问题。第一个在前端,第二个在后端 前端 第一个问题是,我试图将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
更改为String
。我还必须选择反序列化“机器”。就我而言,我选择了格森。因此,以下方法:
@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
@路径(“/create/batchsavings”)
公共列表CreateBatchSaves(列表保存批次){
如果(savingsBatch.size()>0){
返回财务dao.massave(savingsBatch);
}
否则{
抛出新的NullPointerException(“正在保存的批为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!");
}
}
@POST
@路径(“/create/batchsavings”)
公共列表createBatchSavings(字符串savingsBatch){
Gson Gson=新的Gson();
Type collectionType=new-TypeToken(){}.getType();
List savingsList=gson.fromJson(savingsBatch,collectionType);
如果(savingsList.size()>0){
返回财务dao.massave(savingsList);
}
否则{
抛出新的NullPointerException(“正在保存的批为null!”);
}
}
现在这一切都起作用了
作为通知,如果您有任何日期,您必须将其格式化为正确的格式,否则您将在Java中遇到
不可解析日期
问题。我同意。前端正常,但我怀疑后端未能将JSON反序列化到FinanceEntity对象列表中。对于OP,我建议您尝试使用dict(比如,{'batch':batch}
)发送单个对象(不在列表中)只是想看看后端是否可以处理。@ShashankAgrawal:我不认为这是因为前端有一个名为createSaving的函数,它与createBatchSavings几乎是同一种代码,只是传递给该特定函数的参数是object而不是json数组。@AndrewE:我已经尝试打印输出了在createBatchSavings()方法开头的后端中,savingBatch列表,但它甚至没有到达那里。@Amir:没错。调用函数的服务器代码无法将传入数据与已注册的类型匹配,并返回400,因为请求不正确。你有几个选择。您可以尝试更改我前面提到的类型,作为一个实验。您可以在调试器中运行服务器,在例程中设置一个断点,然后查看如何调用它并找出发生了什么,或者找到一种方法来接收任何对象作为参数(object
?不可能…)。@AndreW:谢谢您的建议。我会按照你建议的方式去找它。如果你仔细看我的CreateBatchSaves方法,根据你的第二个问题答案,这正是所做的。很高兴你能让它工作,但angular不需要你对数组进行字符串化,它会为你做到这一点;春天(I)