我有这个底栖管道:
input:
http_server:
address: ""
path: /post
ws_path: /post/ws
allowed_verbs:
- POST
timeout: 120s
rate_limit: ""
pipeline:
processors:
# Parse POST input query to get bounding box from body, ie {"tile": a line from all.json}
- bloblang: |
root.bbox.x_min = this.tile.split("&").index(0).split("=").index(1)
root.bbox.x_max = this.tile.split("&").index(1).split("=").index(1)
root.bbox.y_min = this.tile.split("&").index(2).split("=").index(1)
root.bbox.y_max = this.tile.split("&").index(3).split("=").index(1)
- bloblang: |
root.url = "https://overpass-api.de/api/interpreter?data=[out:json];(node['amenity'](" +
this.bbox.y_min + "," +
this.bbox.x_min + "," +
this.bbox.y_max + "," +
this.bbox.x_max + ");" +
"way['amenity'](" +
this.bbox.y_min + "," +
this.bbox.x_min + "," +
this.bbox.y_max + "," +
this.bbox.x_max + ");" +
"relation['amenity'](" +
this.bbox.y_min + "," +
this.bbox.x_min + "," +
this.bbox.y_max + "," +
this.bbox.x_max + "););out 10 center;"
# DEBUGGING
- log:
level: info
message: URL test
fields_mapping:
root.url = this.url
# Make a request to the Overpass API to fetch data
- http:
url: "${!this.url}"
verb: GET
timeout: 60s
# Parse the JSON response and extract relevant fields (array of elements)
- bloblang: |
root.batch = this.response.elements.map_each(e -> if e.tags.amenity != null && e.lat != null && e.lon != null {
{
"amenity": e.tags.amenity,
"lat": e.lat,
"lon": e.lon
}
}).filter(e -> e != null)
output:
cypher:
uri: "neo4j://localhost:7687"
cypher: |
UNWIND $batch AS row
MERGE (p:POI {amenity: row.amenity, lat: row.lat, lon: row.lon})
# Treat array's rows as batches
args_mapping: |
root.batch = this.batch
basic_auth:
enabled: true
username: "neo4j"
password: "neotest"
batching:
count: 100
max_in_flight: 64
网址格式正确(日志输出此内容,如果将其复制粘贴到浏览器中,它就可以工作):
INFO URL test @service=redpanda-connect label="" path=root.pipeline.processors.2 url="https://overpass-api.de/api/interpreter?data=[out:json];(node['amenity'](49.90146355262061,5.875795590895844,49.905976047309935,5.882782232769095);way['amenity'](49.90146355262061,5.875795590895844,49.905976047309935,5.882782232769095);relation['amenity'](49.90146355262061,5.875795590895844,49.905976047309935,5.882782232769095););out 10 center;"
但是我有这个错误:
ERRO HTTP request to '${!this.url}' failed: https://overpass-api.de/api/interpreter?data=[out:json];(node['amenity'](49.90146355262061,5.875795590895844,49.905976047309935,5.882782232769095);way['amenity'](49.90146355262061,5.875795590895844,49.905976047309935,5.882782232769095);relation['amenity'](49.90146355262061,5.875795590895844,49.905976047309935,5.882782232769095););out 10 center;: HTTP request returned unexpected response code (400): 400 Bad Request, Error: <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"><html><head><title>400 Bad Request</title></head><body><h1>Bad Request</h1><p>Your browser sent a request that this server could not understand.<br /></p><hr><address>Apache/2.4.62 (Debian) Server at overpass-api.de Port 443</address></body></html>
你知道它来自哪里吗?
我还尝试在 root.url = ... 之后执行 root.url = root.url.escape_url_query() 但它也不起作用,因为我的 URL 在转义后看起来像这样:
https%3A%2F%2Foverpass-api.de%2Fapi%2Finterpreter%3Fdata%3D%5Bout%3Ajson%5D%3B%28node%5B%27amenity%27%5D%2849.90146355262061%2C5.875795590895844%2C49.905976047309935%2C5.882782232769095%29%3Bway%5B%27amenity%27%5D%2849.90146355262061%2C5.875795590895844%2C49.905976047309935%2C5.882782232769095%29%3Brelation%5B%27amenity%27%5D%2849.90146355262061%2C5.875795590895844%2C49.905976047309935%2C5.882782232769095%29%3B%29%3Bout+10+center%3B
PS:对于测试,输入是这样的请求:
curl -X POST http://0.0.0.0:4195/post -H "Content-Type: application/json" -d '{"tile": "x_min=5.875795590895844&x_max=5.882782232769095&y_min=49.90146355262061&y_max=49.905976047309935"}'
问题在于 URL 查询中的某些字符需要使用 百分比编码 进行转义。在示例的 URL 中,您必须转义单引号和空格,如下所示:
https://overpass-api.de/api/interpreter?data=[out:json];(node[%27amenity%27](49.90146355262061,5.875795590895844,49.905976047309935,5.882782232769095);way[%27amenity%27](49.90146355262061,5.875795590895844,49.905976047309935,5.882782232769095);relation[%27amenity%27](49.90146355262061,5.875795590895844,49.905976047309935,5.882782232769095););out%2010%20center;