Почему Python urllib.request.urlopen отправляет POST-данные в виде строки запроса? - PullRequest
0 голосов
/ 06 марта 2020

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

Что здесь происходит?

Ответы [ 2 ]

1 голос
/ 08 марта 2020

Проблема заключается в том, что вы не отправляете правильный Content-Type для вашего запроса, и это передается в Jetty (или в приложении Solr) перед отправкой в ​​журнал (любые POST-данные, которые не являются составными, могут быть вставлены как часть строки запроса - 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)
0 голосов
/ 06 марта 2020

После создания Python проблемы и отладки с помощью wireshark , я считаю, что я нашел проблему. Похоже, что urllib добавляет заголовок Connection: close , чего нет в curl. Solr, похоже, не нравится.

Curl message:

POST /solr/my_coll/update?commit=true HTTP/1.1
Host: solr.example.no:12699
User-Agent: curl/7.64.1
Accept: */*
Content-Length: 138
Content-Type: application/x-www-form-urlencoded

<add><doc><field name="key">KEY__9927.1</field><field name="value">{"result":0,"jobId":"9459695","jobNumber":"9927.1"}</field></doc></add>

Python message:

POST /solr/my_coll/update?commit=true HTTP/1.1
Accept-Encoding: identity
Content-Type: application/x-www-form-urlencoded
Content-Length: 138
Host: solr.example.no:12699
User-Agent: Python-urllib/3.7
Connection: close

<add><doc><field name="key">KEY__9927.1</field><field name="value">{"result":0,"jobId":"9459695","jobNumber":"9927.1"}</field></doc></add>

Так что я думаю, что следующим шагом будет создание проблема с Solr.

...