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
这是怎么回事?
1条答案
按热度按时间8tntrjer1#
问题是您没有为请求发送正确的Content-Type,而这在Jetty中被损坏了(或Solr应用程序),然后再转发到日志
/update
端点接受多种格式,比如JSON和XML,并且应该适当地设置内容类型。实际上,是
User-Agent
字符串改变了行为。这是设计好的--curl
已经被特殊化了以覆盖默认的Content-Type
处理程序。如果你没有使用curl
,您必须显式地提供要提交的Content-Type
。这样做可能是为了更容易在命令行上使用curl
进行手动请求。该实现可在www.example.com的第782行中找到SolrRequestParsers.java