我正在尝试使用Powershell将JSON对象发送到PHP脚本,并让PHP脚本只返回它作为JSON获取的内容...
在Powershell中,我这样做:
$a = New-Object System.Collections.ArrayList;
$a.Add(@{
'prop1' = 'something'
'prop2' = 'something else'
});
$a.Add(@{
'prop1' = 'green'
'prop2' = 'blue'
});
$b = New-Object System.Collections.ArrayList;
$b.Add(@{
'prop1' = 'another'
'prop2' = 'yet another'
});
$b.Add(@{
'prop1' = 'red'
'prop2' = 'black'
});
$json = @{
'first' = $a
'second' = $b
} | ConvertTo-Json;
$json
此时$json
是这样的字符串:
{
"second": [
{
"prop2": "yet another",
"prop1": "another"
},
{
"prop2": "black",
"prop1": "red"
}
],
"first": [
{
"prop2": "something else",
"prop1": "something"
},
{
"prop2": "blue",
"prop1": "green"
}
]
}
然后我以Invoke-WebRequest
作为正文张贴$json
:
(Invoke-WebRequest -Uri $url -ContentType 'application/json' -Method Post -Body $json).Content;
目标是这个PHP5脚本:
<?php
header('Content-Type:application/json');
echo json_encode(array("POST" => $_POST, "GET" => $_GET));
?>
但响应只是空洞:
{"POST":[],"GET":[]}
我已经尝试让PHP回显一个静态字符串,这很好用,但是你能看到我在这里发布/接受/响应有什么问题吗?我很难过
答案 0 :(得分:1)
我回答了自己的问题。
Powershell方面最终:
$json = @{
'a' = $a
'b' = $b
} | ConvertTo-Json -Compress
$web = Invoke-WebRequest -Uri $url -Method Post -Body $json -ContentType 'application/json; charset=UTF-8'
所以$a
和$b
都是我原始问题中的自定义对象数组,而$json
是Hashtable
,通过ConvertTo-Json
成为字符串
将Invoke-Webrequest
与-ContentType 'application/json'
一起使用时PHP不会收到填充的$_POST
数组。我必须在我的php脚本中读取原始输入,如下所示:
<?php
header('Content-Type:application/json; charset=UTF-8');
$json = json_decode(file_get_contents("php://input"));
echo json_encode($json, JSON_FORCE_OBJECT);
?>
然后Invoke-WebRequest
,$web
的结果将JSON字符串作为其Content属性。或者我可以改为使用Invoke-RestMethod
,返回类型为PSCustomObject
我克服的另一个问题是我真正的JSON字符串有特殊字符,要求我添加charset=UTF-8