Эквивалентный код Python для следующих запросов HTTP http Java

Я пытаюсь преобразовать следующий код Java в Python. Не уверен, что я делаю неправильно, но я получаю внутреннюю ошибку сервера 500 с python.

Является ли "тело" в httplib.httpConnection метод, эквивалентный Java httpentity? Есть еще мысли о том, что может быть не так? Входная информация, которую я собираю, верна.

Любая помощь будет по достоинству оценена. Я пробовал несколько вещей, но в конечном итоге с той же внутренней ошибкой сервера.

Java-код:

HttpEntity reqEntitiy = new StringEntity("loginTicket="+ticket);
HttpRequestBase request = reMethod.getRequest(uri, reqEntitiy);
request.addHeader("ticket", ticket);
HttpResponse response = httpclient.execute(request);
HttpEntity responseEntity = response.getEntity();
StatusLine responseStatus = response.getStatusLine();

Код Python:

 url = serverURL + "resources/slmservices/templates/"+templateId+"/options"
#Create the request
ticket = ticket.replace("'",'"')
headers = {"ticket":ticket}
print "ticket",ticket

reqEntity = "loginTicket="+ticket
body = "loginTicket="+ticket


url2 = urlparse.urlparse(serverURL)
h1 = httplib.HTTPConnection(url2.hostname,8580)
print "h1",h1

url3 = urlparse.urlparse(url)
print "url path",url3.path
ubody = {"loginTicket":ticket}
data = urllib.urlencode(ubody)
conn = h1.request("GET",url3.path,data,headers)
#conn = h1.request("GET",url3.path)
response = h1.getresponse()
lines = response.read()
print "response.status",response.status
print "response.reason",response.reason

1 ответ

Вам не нужно идти на этот низкий уровень. С помощью urllib2 вместо:

import urllib2
from urllib import urlencode

url = "{}resources/slmservices/templates/{}/options".format(
    serverURL, templateId)
headers = {"ticket": ticket}
params = {"loginTicket": ticket}
url = '{}?{}'.format(url, urlencode(params))

request = urllib2.Request(url, headers=headers)
response = urllib2.urlopen(request)
print 'Status', response.getcode()
print 'Response data', response.read()

Обратите внимание, что параметры добавляются в URL для формирования параметров запроса URL.

Вы можете сделать это еще проще, установив requests библиотека:

import requests

url = "{}resources/slmservices/templates/{}/options".format(
    serverURL, templateId)
headers = {"ticket": ticket}
params = {"loginTicket": ticket}

response = requests.get(url, params=params, headers=headers)
print 'Status', response.status
print 'Response data', response.content  # or response.text for Unicode

Вот requests заботится о кодировании URL-адреса параметров строки запроса URL-адреса и добавлении его в URL-адрес, как это делает Java.

Другие вопросы по тегам