【问题标题】:400 from Overpass API with c# (RestSharp) but not from Python (urllib)400 来自 Overpass API 与 c# (RestSharp) 但不是来自 Python (urllib)
【发布时间】:2016-12-11 21:10:40
【问题描述】:

我正在查询本地服务器上运行的 Overpass API。我正在从 C# 执行以下查询:

/api/interpreter?[out:json];way(around:1000,-33.933,18.4347)[amenity][name];(._;>;);out;

它返回一个 400。

我使用 python 执行相同的调用,它返回我期望的结果(即所有具有“amenity”和“name”标签的方式,以及所有关联的节点)。

我可以确认,当从 C#(使用 RestSharp 库)完成调用时,API“看到”转义字符“%3E”代替“>”,而在调用时“看到”“>”是从 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 还是其他原因?

【问题讨论】:

  • "是角色导致了 400 还是其他原因?"如果你更正这个字符,你会看到它。

标签: c# escaping openstreetmap restsharp overpass-api


【解决方案1】:

您在第一个示例中忘记了data= 参数,该参数是您的查询所必需的。这是适用于公共实例的更正 URL:

http://overpass-api.de//api/interpreter?data=[out:json];way(around:1000,-33.933,18.4347)[amenity][name];(._;%3E;);out;

如果没有这个参数,您会得到以下 HTML 格式的错误文本,并且 - 您可能已经猜到了 - HTTP 400 返回码:

错误:第 1 行:解析错误:未知类型“%”

错误:第 1 行:解析错误:不允许空查询

错误:第 1 行:解析错误:';'或 ')' 预期 - '3' 找到。

【讨论】:

  • 成功了。没有解释为什么调用可以从 python urllib 工作?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-03
  • 2017-12-06
  • 1970-01-01
  • 2017-05-06
  • 2013-09-10
相关资源
最近更新 更多