开发者

Problem passing XML to HTTP Post api using urllib in Python

开发者 https://www.devze.com 2023-03-28 00:45 出处:网络
I am trying to access a REST api and need to call it with a line of XML for a filter condition. My apologies for providing code that others cannot access. When I execute this code, I get the error mes

I am trying to access a REST api and need to call it with a line of XML for a filter condition. My apologies for providing code that others cannot access. When I execute this code, I get the error message listed below.

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();  

Here is the error message.

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)

I think this has the correct logic and filter conditions, what should I look at to get this to work. Thanks.

Per @Mark's 开发者_如何学Csuggestion I removed the urlencode for the XML string and got the following 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


So the problem was with the formatting of the form variable and the encoding I was trying to do. Revising the following lines gets the call to work. I did not need to specify the headers.

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

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号