如何从Powershell将JSON发布到PHP脚本

时间:2018-03-09 21:04:21

标签: php json powershell

我正在尝试使用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回显一个静态字符串,这很好用,但是你能看到我在这里发布/接受/响应有什么问题吗?我很难过

1 个答案:

答案 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都是我原始问题中的自定义对象数组,而$jsonHashtable,通过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