是否可以使用 $http.post 来 post 一个数组?

Is it possible to post an array with $http.post?

我正在尝试通过 $http.post 保存 json 数组以在 back-end 中提供服务,但我总是得到 400 Bad Request。我用谷歌搜索了一下,没有找到明确的答案。

我的问题如下:
1. 是否可以通过 $http.post?
post json 数组 2.如果有,是怎么做到的?
3. 如果没有,还有什么其他选择可以保存 json 数组?

为了使这一点更加清楚,我将在下面添加一些必要的代码。

在Front-end

储蓄服务

createBatchSavings: function(savingsBatch){
        return $http.post('/finance/savings/create/batchsavings', savingsBatch).success(function(data){
            return data;
        });
    }

以上函数正确获取了它的 savingsBatch 参数。 savingsBatch 是 json 数组。

在Back-end

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!");
    }
}
}

我还检查了 header 值。请求 headers 具有正确的值,但响应 headers content-length 始终为零。

是的,它绝对有可能 post 数组数据,并且您在客户端为 post 数据编写的代码是正确的。

您收到的状态代码 400 一定是由于您的服务器端代码出现问题。我在您的服务器端代码中看到一个方法 createBatchSavings 但您在客户端的 URL 是小写的,batchsavings.

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

问题如下:

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

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

  3. 如果没有,还有什么其他选择可以保存 json 数组?

    有可能。

这个问题终于解决了。这个实现有两个问题。 front-end 中的第一个和 back-end 中的第二个。

Front-end

第一个问题是我试图将 post json 数组直接转换为 Java 服务 class,但这行不通,因为它必须转换成正确的字符串 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 数组,header 中的 content-type 是 application/json。这必须被字符串化,因此上面的方法必须像下面这样写,以便将正确的 json 数组传递给 back-end 服务:

$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 = [];
    });
}

Back-end

其次,这个字符串化数组必须在 back-end 中反序列化。以前 front-end 服务和 back-end 服务之间的连接甚至因为传递了不合适的 json 数组而无法正常工作。因此,通过将 json 数组转换为正确的数组来修复连接。

为了让 back-end 服务正常工作,我必须将参数类型从 List<FinanceEntity> 更改为 String。我还必须选择反序列化 "machine"。就我而言,我选择了 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 问题