[英]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.