Проблема передачи XML в HTTP Post API, используя urllib в Python - PullRequest
1 голос
/ 11 августа 2011

Я пытаюсь получить доступ к API REST и мне нужно вызвать его с помощью строки XML для условия фильтра.Мои извинения за предоставление кода, к которому другие не могут получить доступ.Когда я выполняю этот код, я получаю сообщение об ошибке, перечисленное ниже.

import urllib2
import urllib
import hashlib
import hmac
import time
import random
import base64

def MakeRequest():
  url = 'https://api01.marketingstudio.com/API/Gateway/9'
  publickey = ''
  privatekey = ''
  method = 'Query'
  nonce = random.randrange(123400, 9999999)
  age = int(time.time())
  final = str(age) + '&' + str(nonce) + '&' + method.lower() + '&' + url.lower()  

  converted = hmac.new(privatekey, final, hashlib.sha1).digest()
  authorization = 'AMS ' + publickey + ':' + base64.b64encode(converted)

  xml_string = "<list><FilterItems><FilterItem attribute='pageNumber' value='1'/></FilterItems></list>"
  form = {'XML':xml_string}
  data = urllib.urlencode(form)
  headers = {'Content-Type': 'application/xml'}
  req = urllib2.Request(url,data,headers)
  req.add_header('ams-method', method)
  req.add_header('ams-nonce', nonce)
  req.add_header('ams-age', age)
  req.add_header('Authorization', authorization)  
  r = urllib2.urlopen(req)

  print r.read()

MakeRequest();  

Вот сообщение об ошибке.

Data at the root level is invalid. Line 1, position 1.
   at Aprimo.REST.Core.RESTService.GetRequest(String URI, HttpRequest req)
   at Aprimo.REST.RESTHandler.GetRequest(String apiUrl, HttpContext context)
   at Aprimo.REST.RESTHandler.ProcessRequest(HttpContext context)

Я думаю, что это имеет правильную логику и условия фильтра, что я должен посмотреть, чтобы заставить это работать.Благодарю.

По предложению @ Марка я удалил urlencode для строки XML и получил следующий TraceBack:

Traceback (most recent call last):
  File "file.py", line 36, in <module>
    MakeRequest(); 
  File "file.py", line 32, in MakeRequest
    r = urllib2.urlopen(req)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 126, in urlopen
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 392, in open
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 410, in _open
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 370, in _call_chain
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 1194, in https_open
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 1155, in do_open
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/httplib.py", line 941, in request
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/httplib.py", line 975, in _send_request
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/httplib.py", line 937, in endheaders
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/httplib.py", line 801, in _send_output
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/httplib.py", line 773, in send
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ssl.py", line 207, in sendall
TypeError: unhashable type

1 Ответ

3 голосов
/ 25 августа 2011

Итак, проблема была в форматировании переменной формы и кодировке, которую я пытался сделать.Пересмотр следующих строк заставляет работать.Мне не нужно указывать заголовки.

 xml_string = "<list><FilterItems><FilterItem attribute='pageNumber' value='1'/></FilterItems></list>"
 data = (xml_string)
 req = urllib2.Request(url,data)
...