solr 为什么Python的urllib.request.urlopen将POST数据作为查询字符串发送?

e5nqia27  于 2022-11-05  发布在  Solr
关注(0)|答案(1)|浏览(167)

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

这是怎么回事?

8tntrjer

8tntrjer1#

问题是您没有为请求发送正确的Content-Type,而这在Jetty中被损坏了(或Solr应用程序),然后再转发到日志/update端点接受多种格式,比如JSON和XML,并且应该适当地设置内容类型。

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进行手动请求。该实现可在www.example.com的第782行中找到SolrRequestParsers.java

相关问题