簡體   English   中英

為什么 Python 的 urllib.request.urlopen 將 POST 數據作為查詢字符串發送?

[英]Why does Python's urllib.request.urlopen send POST data as query string?

curl正確地將數據發布到 Solr:

$ curl -v 'http://solr.example.no:12699/solr/my_coll/update?commit=true' \
--data '<add><doc><field name="key">KEY__9927.1</field><field name="value">\
{"result":0,"jobId":"9459695","jobNumber":"9927.1"}</field></doc></add>'

solr 查詢日志說:

[20200306T111354,131] [my_coll_shard1_replica_n85]  webapp=/solr path=/update params={commit=true} status=0 QTime=96

我正在嘗試用 Python 做同樣的事情:

>>> import urllib.request
>>> data = '<add><doc><field name="key">KEY__9927.1</field><field name="value">{"result":0,"jobId":"9459695","jobNumber":"9927.1"}</field></doc></add>'
>>> url = 'http://solr.example.no:12699/solr/my_coll/update?commit=true'
>>> req = urllib.request.Request(url=url, data=data.encode('utf-8'), method='POST')
>>> res = urllib.request.urlopen(req)

但是現在solr查詢日志顯示POST數據已經添加到查詢參數字符串中:

[20200306T112358,780] [my_coll_shard1_replica_n87]  webapp=/solr path=/update params={commit=true&<add><doc><field+name="key">KEY__9927.1</field><field+name%3D"value">{"result":0,"jobId":"9459695","jobNumber":"9927.1"}</field></doc></add>} status=0 QTime=30

這里發生了什么?

問題是您沒有為您的請求發送正確的 Content-Type,這在轉發到日志之前會在 Jetty(或 Solr 應用程序)中被破壞(任何不是多部分的 POSTed 數據都可以作為一部分插入查詢字符串 - Solr 解析它們都是一樣的)。 /update端點接受多種格式,例如 JSON 和 XML,並且應適當設置 Content-Type。

req = urllib.request.Request(url=url, data=data.encode('utf-8'), method='POST', headers={'Content-Type': 'text/xml'})
res = urllib.request.urlopen(req)

事實上,是User-Agent字符串改變了行為。 這是設計使然 - curl已被特例覆蓋以覆蓋默認的Content-Type處理程序。 如果您不使用curl ,則必須明確提供正在提交的Content-Type 這樣做可能是為了更輕松地在命令行上使用curl進行手動請求。 該實現在SolrRequestParsers.java 的第 782 行中可用

curl正確地將數據發布到Solr:

$ curl -v 'http://solr.example.no:12699/solr/my_coll/update?commit=true' \
--data '<add><doc><field name="key">KEY__9927.1</field><field name="value">\
{"result":0,"jobId":"9459695","jobNumber":"9927.1"}</field></doc></add>'

solr查詢日志顯示:

[20200306T111354,131] [my_coll_shard1_replica_n85]  webapp=/solr path=/update params={commit=true} status=0 QTime=96

我正在嘗試使用Python做同樣的事情:

>>> import urllib.request
>>> data = '<add><doc><field name="key">KEY__9927.1</field><field name="value">{"result":0,"jobId":"9459695","jobNumber":"9927.1"}</field></doc></add>'
>>> url = 'http://solr.example.no:12699/solr/my_coll/update?commit=true'
>>> req = urllib.request.Request(url=url, data=data.encode('utf-8'), method='POST')
>>> res = urllib.request.urlopen(req)

但是現在,solr查詢日志顯示POST數據已添加到查詢參數字符串中:

[20200306T112358,780] [my_coll_shard1_replica_n87]  webapp=/solr path=/update params={commit=true&<add><doc><field+name="key">KEY__9927.1</field><field+name%3D"value">{"result":0,"jobId":"9459695","jobNumber":"9927.1"}</field></doc></add>} status=0 QTime=30

這是怎么回事?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM