在Postman下面的Softlayer rest url下面遇到错误:
“内部错误”
当使用spring restTemplate从java代码中访问相同的rest url时,错误为
无法反序列化java.util.ArrayList的实例 START_OBJECT令牌。
https://api.softlayer.com/rest/v3/SoftLayer_Account/<Account-ID>/getInvoices?objectFilter={"invoices":{"createDate":{"operation":"betweenDate","options":[{"name":"startDate","value":["03/25/2017 00:00:00"]},{"name":"endDate","value": ["04/24/2017 23:59:59"]}]},"typeCode":{"operation":"RECURRING"}}}&objectMask=mask[id,items[id,recurringFee,recurringTaxAmount,oneTimeFee,oneTimeTaxAmount,description,hostName,domainName,hourlyRecurringFee,laborFee,laborTaxAmount,setupFee,setupTaxAmount,category[name],location[longName],billingItem[id,activeFlag,hourlyFlag,allowCancellationFlag,cancellationDate,orderItem[id,order[id,userRecord[username]]]]]]
答案 0 :(得分:0)
当发票没有很多商品时,您发布的REST URL正在运行。您收到 “内部错误” ,因为内部某些发票正在返回错误 “允许的内存大小为402653184字节耗尽(尝试分配131072字节) “ ,此时添加
orderItem[id,order[id,userRecord[username]]]
我只用一张发票就得到了同样的错误,在我的情况下,发票上有超过1500件物品,这是很多物品。
你的面具非常大,需要检索很多数据,因此Ruber建议Softlayer rest call giving multiple entries for invoice in json response when object filter is applied to relational properties使用一些编程语言来检索你需要的所有数据:
基本上您需要执行以下操作:
第1步: 使用SoftLayer_Account::getInvoices获取所有发票,根据您的要求,它应该是这样的:
https://api.softlayer.com/rest/v3/SoftLayer_Account/getInvoices?objectFilter={"invoices":{"createDate":{"operation":"betweenDate","options":[{"name":"startDate","value":["03/25/2017 00:00:00"]},{"name":"endDate","value": ["04/24/2017 23:59:59"]}]},"typeCode":{"operation":"RECURRING"}}}&objectMask=mask[id,createDate]
这将返回所有发票的ID,您将需要执行以下步骤
第2步: 对于每个检索到的发票,请使用方法SoftLayer_Billing_Invoice::getItems,使用resultLimits和您的掩码如下。
https://api.softlayer.com/rest/v3/SoftLayer_Billing_Invoice/[invoiceId]/getItems?resultLimit=100,0&objectMask=mask[id,recurringFee,recurringTaxAmount,oneTimeFee,oneTimeTaxAmount,description,hostName,domainName,hourlyRecurringFee,laborFee,laborTaxAmount,setupFee,setupTaxAmount,category[name],location[longName],billingItem[id,activeFlag,hourlyFlag,allowCancellationFlag,cancellationDate,orderItem[id,order[id,userRecord[id,username]]]]]
根据您在步骤1中检索到的每个ID更改 [invoiceId] 。
在这种情况下,你需要使用循环,第一个循环为每个发票调用SoftLayer_Billing_Invoice::getItems,第二个循环用100个100来检索项目。(而不是100,你可以在resultLimit参数中设置另一个值)< / p>
如果您设置 resultLimit = 100,1 ,则会返回101到200之间的所有项目。我建议您查看https://sldn.softlayer.com/article/using-result-limits-softlayer-api
我建议使用Python,Java,Go,Ruby等语言。您可以在此处查看列表https://sldn.softlayer.com/article/softlayer-api-overview。
注意:不幸的是,SoftLayer Java API不支持对象过滤器功能。
我希望这对你有所帮助。
此致