我正在尝试对api进行逆向工程,因为我们的软件提供商缺少文档,我需要在php中重新创建curl命令。有问题的命令是:
curl -v -X POST -H Accept-Encoding:"gzip" -H deviceId:"someID" -H appBuildDate:"2014-12-11 15:56:52 +0000" -H systemName:"iPhone OS" -H appBuildNumber:"44" -H platform:"iPhone5,2" -H Content-Type:"application/xml" -H model:"iPhone" -H name:"iphone" -H systemVersion:"8.1.2" -H Authorization:"Token someToken" -H appVersion:"6.8" https://soemsub.somedomain.com/ws/orders/search -d "<orderSearch><consigneeSearch /><customerSearch /><shipperSearch scheduledArrivalEarly=\"12/17/2014\" /></orderSearch>"
我遇到的唯一问题是我不确定为-d
命令设置的选项。
我已将CURLOPT_POST
设置为true
和CURLOPT_POSTFIELDS
使用:
$query = "<orderSearch><consigneeSearch /><customerSearch /><shipperSearch scheduledArrivalEarly=\"$date\" /></orderSearch>";
curl_setopt($this->curl, CURLOPT_POSTFIELDS, $query);
我也尝试过:
curl_setopt($this->curl, CURLOPT_POSTFIELDS, array($query));
我没有得到有效回复。是否有一个技巧让这个正确发布?我在顶部概述的命令按原样写入日志文件中(除了deviceId和Authorization),但我不确定是否可以指定没有帖子的帖子&#34; name&#34;就像我在HTML表单中所做的那样。据我所知,我需要key=>value
对。
我错过了什么吗?提前谢谢!
答案 0 :(得分:1)
在键值周围没有任何引号设置标题:
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Authorization:Token someToken',
'deviceId:someID',
// ... all the other headers
));
而不是:
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Authorization:"Token someToken"',
'deviceId:"someID"',
// ... all the other headers
));
如果将POSTFIELDS与字符串体一起使用,则需要对其进行urlencode:
$query = "<orderSearch><consigneeSearch /><customerSearch /><shipperSearch scheduledArrivalEarly=\"$date\" /></orderSearch>";
curl_setopt($this->curl, CURLOPT_POSTFIELDS, urlencode($query));
请参阅另一个问题:Should I URL-encode POST data?
要在HTTP“POST”操作中发布的完整数据。要发布文件, 使用@预先添加文件名并使用完整路径。文件类型可以是 通过跟随文件名中的类型明确指定 format'; type = mimetype'。此参数可以作为a传递 urlencoded字符串,如'para1 = val1&amp; para2 = val2&amp; ...'或作为数组 字段名称为键,字段数据为值。如果value是一个数组, Content-Type标头将设置为multipart / form-data