400 来自 Overpass API 使用 c# (RestSharp) 但不是来自 Python (urllib)
400 from Overpass API with c# (RestSharp) but not from Python (urllib)
我正在对本地服务器上 运行 的立交桥 API 进行查询。我正在从 C# 执行以下查询:
/api/interpreter?[out:json];way(around:1000,-33.933,18.4347)[amenity][name];(._;>;);out;
它 returns 400。
我使用 python 进行相同的调用,它 returns 我所期望的(即具有 "amenity" 和 "name" 标签的所有方式,以及所有相关节点).
我可以确认,当从 C#(使用 RestSharp 库)完成调用时,API "sees" 转义字符“%3E”代替了“>”,而它 "sees" ">" 当调用从 python 完成时。以下是 apache 日志中记录的两个调用:
"GET /api/interpreter?[out:json];way(around:1000,-33.933,18.4347)[amenity][name];(._;>;);out; HTTP/1.1" 200 20878 "-" "Python-urllib/3.5"
"GET /api/interpreter?[out:json];way(around:1000,-33.933,18.4347)[amenity][name];(._;%3E;);out; HTTP/1.1" 400 987 "-" "RestSharp/105.2.3.0"
如您所见,调用除了那个字符外是相同的。估计是这个字符导致的问题。但是,我有一个使用此字符成功调用的不同示例:
GET /api/interpreter?data=[bbox][out:json];way[highway=primary];(._;%3E;);out;&bbox=27.8539696457985,-33.0194661675922,27.9045061954916,-33.0053817324078 HTTP/1.1" 200 6037 "-" "RestSharp/105.2.3.0"
这是怎么回事?是导致 400 的字符还是其他原因?
您忘记了第一个示例中的 data=
参数,该参数是您的查询所必需的。这是适用于 public 实例的更正 URL:
http://overpass-api.de//api/interpreter?data=[out:json];way(around:1000,-33.933,18.4347)[amenity][name];(._;%3E;);out;
如果没有此参数,您会收到以下错误文本 HTML,并且 - 您可能已经猜到了 - HTTP 400 return 代码:
Error: line 1: parse error: Unknown type "%"
Error: line 1: parse error: An empty query is not allowed
Error: line 1: parse error: ';' or ')' expected - '3' found.
我正在对本地服务器上 运行 的立交桥 API 进行查询。我正在从 C# 执行以下查询:
/api/interpreter?[out:json];way(around:1000,-33.933,18.4347)[amenity][name];(._;>;);out;
它 returns 400。
我使用 python 进行相同的调用,它 returns 我所期望的(即具有 "amenity" 和 "name" 标签的所有方式,以及所有相关节点).
我可以确认,当从 C#(使用 RestSharp 库)完成调用时,API "sees" 转义字符“%3E”代替了“>”,而它 "sees" ">" 当调用从 python 完成时。以下是 apache 日志中记录的两个调用:
"GET /api/interpreter?[out:json];way(around:1000,-33.933,18.4347)[amenity][name];(._;>;);out; HTTP/1.1" 200 20878 "-" "Python-urllib/3.5"
"GET /api/interpreter?[out:json];way(around:1000,-33.933,18.4347)[amenity][name];(._;%3E;);out; HTTP/1.1" 400 987 "-" "RestSharp/105.2.3.0"
如您所见,调用除了那个字符外是相同的。估计是这个字符导致的问题。但是,我有一个使用此字符成功调用的不同示例:
GET /api/interpreter?data=[bbox][out:json];way[highway=primary];(._;%3E;);out;&bbox=27.8539696457985,-33.0194661675922,27.9045061954916,-33.0053817324078 HTTP/1.1" 200 6037 "-" "RestSharp/105.2.3.0"
这是怎么回事?是导致 400 的字符还是其他原因?
您忘记了第一个示例中的 data=
参数,该参数是您的查询所必需的。这是适用于 public 实例的更正 URL:
http://overpass-api.de//api/interpreter?data=[out:json];way(around:1000,-33.933,18.4347)[amenity][name];(._;%3E;);out;
如果没有此参数,您会收到以下错误文本 HTML,并且 - 您可能已经猜到了 - HTTP 400 return 代码:
Error: line 1: parse error: Unknown type "%"
Error: line 1: parse error: An empty query is not allowed
Error: line 1: parse error: ';' or ')' expected - '3' found.