【问题标题】:Bad Request when POSTing GeoJSON Data using php使用 php 发布 GeoJSON 数据时出现错误请求
【发布时间】:2018-07-11 08:21:33
【问题描述】:

我有这个 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";
?>

每当我执行此代码时,页面都会显示

“错误请求”

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."}]}}

我试图理解这意味着什么,但我目前处于死胡同。文档(和错误代码)说“几何”部分是必需的,所以这就是我添加它的原因。文档位于https://developers.airmap.com/docs/rulesets,我已经通过 GeoJSON linter 运行了 GeoJSON,它通过了。

【问题讨论】:

  • 您是否尝试过联系他们的客户支持?
  • 另一个建议是不要手动编写json字符串,只需创建一个类似于他们要求的结构化数组并使用json_encode代替
  • 谢谢,我正打算这样做。这只是我打算这样做之前的第一步,但我一定会尝试的。
  • 另外,我尝试过$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


【解决方案1】:

我觉得令人困惑的是这部分:

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 的终结。
  • @rhw55 我看到你和我一样患上了脑震荡。如果我们提供帮助,请考虑对我们的答案进行投票并选择您的答案作为正确答案。这将对其他人有所帮助。
【解决方案2】:

我联系了 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 ] ] ] }}';

【讨论】:

  • 是的,总是联系支持,就像我在 cmets 中所说的那样,与 SO 上的人相比,他们会知道他们的 API 中的所有内容
  • 感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-02
  • 1970-01-01
  • 2020-06-30
  • 2020-03-06
  • 2019-05-03
  • 2019-06-22
  • 2016-09-15
相关资源
最近更新 更多