Python 3 urllib.request борьбы за данные - PullRequest
1 голос
/ 20 февраля 2020

Может кто-нибудь объяснить мне, почему «версия 1» моего кода не работает, а «версия 2» работает? Вывод обеих версий ниже. По какой-то причине my_data неправильно вставлен в запрос urllib, но я не могу понять, почему. Я попробовал 20 различных примеров и методов также прямо из Python документации, но это не так. Это не только ключ действия, также когда я хочу вставить имя пользователя и пароль в качестве ключей, это не имеет успеха. Я тут ломаю голову ...

import urllib.request
import urllib.error
import urllib.parse

my_url = 'http://{0}:{1}/?username=myuser&password=mypass'.format('10.10.127.47', 80)
my_headers = { "Content-Type" : "application/x-www-form-urlencoded" }

# ---- begin version 1 / not working ----------------------------------------------
my_data = { "action" : "getmetadata" }       
my_uedata = urllib.parse.urlencode(my_data)
my_edata = my_uedata.encode('utf-8')                
req = urllib.request.Request(url=my_url, data=my_edata, headers=my_headers)
# ---- end version 1 --------------------------------------------------------------

# ---- begin version 2 / works fine -----------------------------------------------
req = urllib.request.Request(url=''.join([my_url, '&action=getmetadata']), data=None, headers=my_headers)
# ---- end version 2 --------------------------------------------------------------

response = urllib.request.urlopen(req)
html = response.read()
print(html)

Вывод версии 1:

b'{"schemaVersion":"3.0.0","action":"Unknown","actionDetail":null,"userName":"myuser","password":"mypass","metadata":[],"configurations":[],"commandItems":[]}'

Вывод версии 2:

b'{"schemaVersion":"3.0.0","action":"GetMetadata","actionDetail":null,"userName":"myuser","password":"mypass","metadata":[{"key":"permissions","value":[]},{"key":"Title","value":"Blabla"},{"key":"Description","value":"fjshkfsdhskjhfsk"},{"key":"Keyword","value":""},{"key":"Learningdescription","value":""},{"key":"Rightsdescription","value":"Creative Commons"},{"key":"SessionId","value":""},{"key":"PauseAndResumeVideoTime","value":""},{"key":"VideoSegments","value":""},{"key":"VideoTrackPosition","value":"0,25:50,75;50,25:100,75"},{"key":"SlideTrackPositionIndex","value":"2"},{"key":"Coverage","value":""},{"key":"Language","value":"en"},{"key":"Structure","value":"linear"},{"key":"Aggregationlevel","value":"3"},{"key":"SubjectAreas","value":"NBC1"},{"key":"Version","value":"1.0"},{"key":"Status","value":"final"},{"key":"EducationalLearningResourceType","value":"informatiebron"},{"key":"intendedenduserrole","value":"learner"},{"key":"EducationalContext","value":"HBO"},{"key":"Typicalagerange","value":"18-24"},{"key":"Difficulty","value":"medium"},{"key":"Typicallearningtime","value":""},{"key":"EducationalLanguage","value":"en"},{"key":"Cost","value":"No"},{"key":"Copyrights","value":"Yes"},{"key":"Showincatalogue","value":"True"},{"key":"PublishDate","value":""},{"key":"ExpirationTime","value":"730"},{"key":"Duration","value":"0"},{"key":"contributors","value":[]}],"configurations":[],"commandItems":[]}'

1 Ответ

0 голосов
/ 20 февраля 2020

Похоже, в первой версии вы указываете полезную нагрузку, которая должна быть отправлена, но в конечном итоге не используется, поскольку urllib.request.Request предполагает GET в качестве метода по умолчанию, который не включает никакого тела. Если вы хотите отправить полезную нагрузку, укажите в качестве аргумента конструктора method='POST', который позволит серверу прочитать тело вашего запроса.

Во втором сценарии вы передаете полезную нагрузку как Параметры URL, которые обычно распознаются методом GET.

Для справки см. документацию .

...