Javascript 是否可以使用$http.post发布一个数组?

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

我试图通过$http.post将json数组保存到后端服务中,但我总是收到
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

这只是一个暗示。您需要添加有关服务器端代码的更多信息。

问题如下:

  • 是否可以通过$http.post发布json数组
  • 如果是,如何进行

    $http({方法:'POST',url:'api/data',数据:项数组})

  • 如果没有,那么还有什么其他的替代方案可以达到这样的目的来保存json数组呢

    这是可能的


  • 这个问题终于解决了。在这个实施过程中有两个问题。第一个在前端,第二个在后端

    前端

    第一个问题是,我试图将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)