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

时间:2015-01-01 14:38:21

标签: javascript json angularjs http-post angularjs-service

我试图通过$ 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!");
    }
}
}

我还检查了标题值。请求标头具有适当的值,但响应标头内容长度始终为零。

3 个答案:

答案 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)

问题如下:

  1. 是否可以通过$ http.post发布json数组?的
  2. 如果是,怎么做?

    $ http({method:'POST',url:'api / data',data:item array})

  3. 如果不是,还有什么其他选择来保存这样的目标的json数组?

    有可能。