0

我已经获得了一个如何连接到某个网络服务器的示例。

这是一个带有两个输入的简单表单:

网络服务表单

它在提交带有令牌和 json 的表单后返回 true。

这是代码:

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8" />
        <title>Webservice JSON</title>
    </head>
    <body>
        <form action="http://foowebservice.com/post.wd" method="post">
            <p>
                <label for="from">token: </label>
                <input type="text" id="token" name="token"><br>
                <label for="json">json: </label>
                <input type="text" id="json" name="json"><br>
                <input type="submit" value="send">
                <input type="reset">
            </p>
        </form>
    </body>
</html>

为了使其动态化,我尝试使用 PHP 复制它。

$url = "http://foowebservice.com/post.wd";

$data = array(
  'token' => 'fooToken',
  'json' => '{"foo":"test"}',
);

$content = json_encode($data);
$curl = curl_init($url);
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HTTPHEADER,
  array("Content-type: application/json"));
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $content);

$json_response = curl_exec($curl);

$status = curl_getinfo($curl, CURLINFO_HTTP_CODE);

curl_close($curl);

$response = json_decode($json_response, true);

但我一定做错了什么,因为 $response 它被赋予了一个错误的值。

我不介意以任何其他方式执行此操作,而不是使用 Curl。

有什么建议么?

更新

正如第一个答案中所建议的,我尝试以这种方式设置 $data 数组:

$data = array(
  'token' => 'fooToken',
  'json' => array('foo'=>'test'),
);

然而,回应也是错误的。

我已经尝试过Postman REST - Chrome 客户端插件,并使用开发工具/网络,标题中的 url 是:

Request URL:http://foowebservice.com/post.wd?token=fooToken&json={%22foo%22:%22test%22}

我认为应该使用 CURL 发送相同的 url。

4

2 回答 2

5

您正在以 JSON 格式传递 POST 数据,请尝试以 k1=v1&k2=v2 的形式传递它。例如,在$data数组定义后添加以下内容:

foreach($data as $key=>$value) { $content .= $key.'='.$value.'&'; }

然后删除以下行:

$content = json_encode($data);

curl_setopt($curl, CURLOPT_HTTPHEADER,
   array("Content-type: application/json"));

完整代码(已测试):

测试.php

<?
$url = "http://localhost/testaction.php";

$data = array(
  'token' => 'fooToken',
  'json' => '{"foo":"test"}',
);

foreach($data as $key=>$value) { $content .= $key.'='.$value.'&'; }

$curl = curl_init($url);
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $content);

$json_response = curl_exec($curl);

$status = curl_getinfo($curl, CURLINFO_HTTP_CODE);

curl_close($curl);

$response = json_decode($json_response, true);
var_dump($response);
?>

测试动作.php

<?
echo json_encode($_POST);
?>

输出:

array(2) {
  'token' =>
  string(8) "fooToken"
  'json' =>
  string(14) "{"foo":"test"}"
}
于 2013-04-05T12:50:00.883 回答
1

部分$data已经 json 编码。尝试制作$data纯php。IE$data['json']=array('foo'=>'test');

于 2013-04-05T12:39:52.900 回答