使用 php 发布 GeoJSON 数据时出现错误请求
Bad Request when POSTing GeoJSON Data using php
我有这个 php 代码,可以将 GeoJSON 数据发布到名为 AirMap 的服务,以检索飞行 UAS 的相关规则集。
index.php
<?
$ch = curl_init();
$json_data = '"geometry":' + '{ "type": "Polygon",
"coordinates": [
[ [100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0] ]
]
}';
curl_setopt($ch, CURLOPT_URL, "https://api.airmap.com/rules/v1");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "$'{");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $json_data);
$headers = array();
$headers[] = "X-Api-Key: (removed)";
$headers[] = "Content-Type: application/json; charset=utf-8";
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$result = curl_exec($ch);
if (curl_errno($ch)) {
echo 'Error:' . curl_error($ch);
}
curl_close ($ch);
echo "$result";
?>
每当我执行这段代码时,页面显示
"Bad Request"
index.php 2
<?
$ch = curl_init();
$json_data = '{ "type": "Polygon",
"coordinates": [
[ [100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0] ]
]
}';
curl_setopt($ch, CURLOPT_URL, "https://api.airmap.com/rules/v1");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "$'{");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $json_data);
$headers = array();
$headers[] = "X-Api-Key: (removed)";
$headers[] = "Content-Type: application/json; charset=utf-8";
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$result = curl_exec($ch);
if (curl_errno($ch)) {
echo 'Error:' . curl_error($ch);
}
curl_close ($ch);
echo "$result";
?>
每当我执行该代码时,它都会显示
{"status":"fail","data":{"message":"parameter validation failed","data":[{"name":"geometry","message":"Invalid param"},{"name":"geometry","message":"A valid geometry must be included."},{"name":"type","message":"Parameter not allowed."},{"name":"coordinates","message":"Parameter not allowed."}]}}
我试图理解这意味着什么,但我目前正处于死胡同。文档(和错误代码)说 "geometry" 部分是必需的,所以这就是我添加它的原因。文档位于 https://developers.airmap.com/docs/rulesets,我已经通过 GeoJSON linter 运行 GeoJSON,它通过了。
让我感到困惑的是这部分:
curl_setopt($ch, CURLOPT_POSTFIELDS, "$'{");
[...]
curl_setopt($ch, CURLOPT_POSTFIELDS, $json_data);
你确定这两者结合了?也许第一部分只是被覆盖了?
更新
查看您的代码后,我发现其规则集示例中的示例存在以下差异:
$json_data = '"geometry":' + '{ "type": "Polygon",
"coordinates": [
[ [100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0] ]
]
}';
这是错误的,因为 +
不是用于连接字符串 .
是。我也尝试用撇号更正其他部分,结果是:
$json_data = '{"geometry": "{ \"type\": \"Polygon\",
\"coordinates\": [
[ [100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0] ]
]}"
}';
我联系了 AirMap 支持,他们帮助了我。由于它们需要一个额外的标志(几何)与 cURL 请求一起传递,因此它们还需要一个左花括号和一个右花括号。所以几何部分看起来像这样:
$json_data2 = '{"geometry": { "type": "Polygon", "coordinates": [ [ [ -118.37099075317383, 33.85505651142062 ], [ -118.37305068969727, 33.85502978214579 ], [ -118.37347984313963, 33.854673391015496 ], [ -118.37306141853333, 33.85231226221667 ], [ -118.37193489074707, 33.85174201755203 ], [ -118.36997151374815, 33.85176874785573 ], [ -118.36995005607605, 33.8528112231754 ], [ -118.37099075317383, 33.85505651142062 ] ] ] }}';
我有这个 php 代码,可以将 GeoJSON 数据发布到名为 AirMap 的服务,以检索飞行 UAS 的相关规则集。
index.php
<?
$ch = curl_init();
$json_data = '"geometry":' + '{ "type": "Polygon",
"coordinates": [
[ [100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0] ]
]
}';
curl_setopt($ch, CURLOPT_URL, "https://api.airmap.com/rules/v1");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "$'{");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $json_data);
$headers = array();
$headers[] = "X-Api-Key: (removed)";
$headers[] = "Content-Type: application/json; charset=utf-8";
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$result = curl_exec($ch);
if (curl_errno($ch)) {
echo 'Error:' . curl_error($ch);
}
curl_close ($ch);
echo "$result";
?>
每当我执行这段代码时,页面显示
"Bad Request"
index.php 2
<?
$ch = curl_init();
$json_data = '{ "type": "Polygon",
"coordinates": [
[ [100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0] ]
]
}';
curl_setopt($ch, CURLOPT_URL, "https://api.airmap.com/rules/v1");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "$'{");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $json_data);
$headers = array();
$headers[] = "X-Api-Key: (removed)";
$headers[] = "Content-Type: application/json; charset=utf-8";
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$result = curl_exec($ch);
if (curl_errno($ch)) {
echo 'Error:' . curl_error($ch);
}
curl_close ($ch);
echo "$result";
?>
每当我执行该代码时,它都会显示
{"status":"fail","data":{"message":"parameter validation failed","data":[{"name":"geometry","message":"Invalid param"},{"name":"geometry","message":"A valid geometry must be included."},{"name":"type","message":"Parameter not allowed."},{"name":"coordinates","message":"Parameter not allowed."}]}}
我试图理解这意味着什么,但我目前正处于死胡同。文档(和错误代码)说 "geometry" 部分是必需的,所以这就是我添加它的原因。文档位于 https://developers.airmap.com/docs/rulesets,我已经通过 GeoJSON linter 运行 GeoJSON,它通过了。
让我感到困惑的是这部分:
curl_setopt($ch, CURLOPT_POSTFIELDS, "$'{");
[...]
curl_setopt($ch, CURLOPT_POSTFIELDS, $json_data);
你确定这两者结合了?也许第一部分只是被覆盖了?
更新
查看您的代码后,我发现其规则集示例中的示例存在以下差异:
$json_data = '"geometry":' + '{ "type": "Polygon",
"coordinates": [
[ [100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0] ]
]
}';
这是错误的,因为 +
不是用于连接字符串 .
是。我也尝试用撇号更正其他部分,结果是:
$json_data = '{"geometry": "{ \"type\": \"Polygon\",
\"coordinates\": [
[ [100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0] ]
]}"
}';
我联系了 AirMap 支持,他们帮助了我。由于它们需要一个额外的标志(几何)与 cURL 请求一起传递,因此它们还需要一个左花括号和一个右花括号。所以几何部分看起来像这样:
$json_data2 = '{"geometry": { "type": "Polygon", "coordinates": [ [ [ -118.37099075317383, 33.85505651142062 ], [ -118.37305068969727, 33.85502978214579 ], [ -118.37347984313963, 33.854673391015496 ], [ -118.37306141853333, 33.85231226221667 ], [ -118.37193489074707, 33.85174201755203 ], [ -118.36997151374815, 33.85176874785573 ], [ -118.36995005607605, 33.8528112231754 ], [ -118.37099075317383, 33.85505651142062 ] ] ] }}';