json - 使用 CURL-Post 方法和 json 调用端点已损坏
问题描述
我正在使用以下命令使用 CURL 调用我的端点:
curl -H "Content-Type: application/json" -X POST -d '{"TransmissionID":"SO000001","CustomerSO":"SO000001","EndUserName":"Roi_Test","Hold":"","RequestedDate":"2019-02-24 15:00","Currency":"EUR","Address1":"Calle del Maestro Bagant","Address2":"","BuildingName":"","BuildingNumber":"1","Floor":"1","ContactPerson":"roi","City":"Valencia","CountryAbbriviation":"ES","Email":"aaa@joomi.co.il","Phone":"050-7680249","Zip":"46015","Remark":"","Incoterm":"DDP","Status":"","Item":["OrderLine":1,"ItemName":"cl111","ItemDescription":"Description","Quantity":"1.","PriceCurrency":"EUR","Price":"219.9","HSCode":"9900000003463","AWBNumber":"","CarrierName":"PostNL","CountryOfManufacturer":"CN","Base64String":""],"NumberOfSku":1,"NumberOfUnits":1}' "http://server.com/Magicxpi4.6/MgWebRequester.dll?appname=IFSCarolina_Prod&prgname=HTTP&arguments=-AREST_Incoming%%23IncomingFile"
收到的 JSON 如下:
{TransmissionID:SO000001,CustomerSO:SO000001,EndUserName:Roi_Test,Hold:,RequestedDate:2019-02-24 15:00,Currency:EUR,Address1:Calle del Maestro Bagant,Address2:,BuildingName:,BuildingNumber:1,Floor:1,ContactPerson:roi,City:Valencia,CountryAbbriviation:ES,Email:aaa@joomi.co.il,Phone:050-7680249,Zip:46015,Remark:,Incoterm:DDP,Status:,Item:[OrderLine:1,ItemName:cl111,ItemDescription:Description,Quantity:1.,PriceCurrency:EUR,Price:219.9,HSCode:9900000003463,AWBNumber:,CarrierName:PostNL,CountryOfManufacturer:CN,Base64String:],NumberOfSku:1,NumberOfUnits:1}
接收到的数据看起来像一个字符串,不像 JSON,字段和值缺少 " 符号......
我已经尝试在单引号/双引号之间进行更改,但没有成功。
关于如何解决这个问题的任何想法?
解决方案
你正在发送一个损坏的 json,特别是
"Item": [
"OrderLine": 1,
"ItemName": "cl111",
"ItemDescription": "Description",
"Quantity": "1.",
"PriceCurrency": "EUR",
"Price": "219.9",
"HSCode": "9900000003463",
"AWBNumber": "",
"CarrierName": "PostNL",
"CountryOfManufacturer": "CN",
"Base64String": ""
],
不是有效的 JSON。在 PHP 中,这将是一个合法的数组,因为 PHP 允许在数组中使用字符串键,但 JSON(和 JavaScript)不允许。但是在 JSON 中,对象可以有字符串键,所以最接近合法 json 的方法是创建"Item"
一个对象而不是数组,例如这将是合法的 JSON:
{
"TransmissionID": "SO000001",
"CustomerSO": "SO000001",
"EndUserName": "Roi_Test",
"Hold": "",
"RequestedDate": "2019-02-24 15:00",
"Currency": "EUR",
"Address1": "Calle del Maestro Bagant",
"Address2": "",
"BuildingName": "",
"BuildingNumber": "1",
"Floor": "1",
"ContactPerson": "roi",
"City": "Valencia",
"CountryAbbriviation": "ES",
"Email": "aaa@joomi.co.il",
"Phone": "050-7680249",
"Zip": "46015",
"Remark": "",
"Incoterm": "DDP",
"Status": "",
"Item": {
"OrderLine": 1,
"ItemName": "cl111",
"ItemDescription": "Description",
"Quantity": "1.",
"PriceCurrency": "EUR",
"Price": "219.9",
"HSCode": "9900000003463",
"AWBNumber": "",
"CarrierName": "PostNL",
"CountryOfManufacturer": "CN",
"Base64String": ""
},
"NumberOfSku": 1,
"NumberOfUnits": 1
}
顺便说一句,你是手工制作这么大的 jsons 复杂的 jsons 吗?我认为您应该改用脚本语言以使其更具可读性和可维护性,...例如,这是使用 PHP-cli 的方法:
#!/usr/bin/env php
<?php
$ch = curl_init();
curl_setopt_array($ch, array(
CURLOPT_URL => 'http://server.com/Magicxpi4.6/MgWebRequester.dll?appname=IFSCarolina_Prod&prgname=HTTP&arguments=-AREST_Incoming%%23IncomingFile',
CURLOPT_HTTPHEADER => array(
'Content-Type: application/json'
) ,
CURLOPT_POST => 1,
CURLOPT_POSTFIELDS => json_encode(array(
'TransmissionID' => 'SO000001',
'CustomerSO' => 'SO000001',
'EndUserName' => 'Roi_Test',
'Hold' => '',
'RequestedDate' => '2019-02-24 15:00',
'Currency' => 'EUR',
'Address1' => 'Calle del Maestro Bagant',
'Address2' => '',
'BuildingName' => '',
'BuildingNumber' => 1,
'Floor' => 1,
'ContactPerson' => 'roi',
'City' => 'Valencia',
'CountryAbbriviation' => 'ES',
'Email' => 'aaa@joomi.co.il',
'Phone' => '050-7680249',
'Zip' => '46015',
'Remark' => '',
'Incoterm' => 'DDP',
'Status' => '',
'Item' => array(
'OrderLine' => 1,
'ItemName' => 'cl111',
'ItemDescription' => 'Description',
'Quantity' => '1.',
'PriceCurrency' => 'EUR',
'Price' => 219.9,
'HSCode' => '9900000003463',
'AWBNumber' => '',
'CarrierName' => 'PostNL',
'CountryOfManufacturer' => 'CN',
'Base64String' => '',
) ,
'NumberOfSku' => 1,
'NumberOfUnits' => 1,
)) ,
));
curl_exec($ch);
curl_close($ch);
- 最后两件事,您的 JSON 中项目的“数量”是
1.
- 点应该在那里,还是错字? - 我很久没有接触过 PayPal REST api,但这让我想起了 PayPal REST api,在那个 API 中,我相信 Item 应该是一个对象数组,而不仅仅是一个对象,如果那是你想要的是
"Item":[{...}]
(在 JSON 中)或'Item' => array(array(...))
(在 PHP 中)
推荐阅读
- python - Python:使用python代码的google云存储的`Request exception`问题
- typescript - TypeScript:定义一个表示实现抽象类的类型的参数
- javascript - 将表格添加到预定义的图像模板并将其下载为图像文件
- amazon-web-services - 通过直接 HTTP 链接提供小图像时使用 Amazon S3 (>300ms) 的高 TTFB
- node.js - 表示无法识别请求正文
- jupyter-notebook - 导出 Jupyter 笔记本时出现错误 500
- asp.net-core - Asp.Net Core 3.1 如何在一个 Identity 实例下设置 3 个 .net core webapps(站点)。(单点登录)SSO - 角色跨越所有 3 个站点
- c++ - std::sort 和 priority_queue (C++) 的比较顺序之间的区别
- ios - 用于 iPhone 的可更新文本分类模型
- sql - 在 Azure Databricks 中加载到 SQL 表的最快方法