python不可破坏类型-发布xml数据

python不可破坏类型-发布xml数据,python,typeerror,httplib,Python,Typeerror,Httplib,首先,我不是python程序员。我是一个老C狗,学会了新的Java和PHP技巧,但python看起来是一种非常酷的语言 我犯了一个我不能完全理解的错误。错误发生在下面的代码之后 import httplib, urllib url = "pdb-services-beta.nipr.com" xml = '<?xml version="1.0"?><!DOCTYPE SCB_Request SYSTEM "http://www.nipr.com/html/SCB_XML_Req

首先,我不是python程序员。我是一个老C狗,学会了新的Java和PHP技巧,但python看起来是一种非常酷的语言

我犯了一个我不能完全理解的错误。错误发生在下面的代码之后

import httplib, urllib
url = "pdb-services-beta.nipr.com"
xml = '<?xml version="1.0"?><!DOCTYPE SCB_Request SYSTEM "http://www.nipr.com/html/SCB_XML_Request.dtd"><SCB_Request Request_Type="Create_Report"><SCB_Login_Data CustomerID="someuser" Passwd="somepass" /><SCB_Create_Report_Request Title=""><Producer_List><NIPR_Num_List_XML><NIPR_Num NIPR_Num="8980608" /><NIPR_Num NIPR_Num="7597855" /><NIPR_Num NIPR_Num="10166016" /></NIPR_Num_List_XML></Producer_List></SCB_Create_Report_Request></SCB_Request>'

params = {}
params['xmldata'] = xml

headers = {}
headers['Content-type'] = 'text/xml'
headers['Accept'] = '*/*'
headers['Content-Length'] = "%d" % len(xml)

connection = httplib.HTTPSConnection(url)
connection.set_debuglevel(1)
connection.request("POST", "/pdb-xml-reports/scb_xmlclient.cgi", params, headers)

response = connection.getresponse()
print response.status, response.reason
data = response.read()
print data
connection.close
导入httplib、urllib
url=“pdb services beta.nipr.com”
xml=“”
参数={}
参数['xmldata']=xml
标题={}
标题['Content-type']=“text/xml”
标题['Accept']='*/*'
标题['Content-Length']=%d”%len(xml)
connection=httplib.HTTPSConnection(url)
连接。设置调试级别(1)
请求(“POST”,“/pdb xml reports/scb_xmlclient.cgi”,参数,标题)
response=connection.getresponse()
打印response.status、response.reason
data=response.read()
打印数据
连接。关闭
以下是错误:

Traceback (most recent call last): File "C:\Python27\tutorial.py", line 14, in connection.request("POST", "/pdb-xml-reports/scb_xmlclient.cgi", params, headers) File "C:\Python27\lib\httplib.py", line 958, in request self._send_request(method, url, body, headers) File "C:\Python27\lib\httplib.py", line 992, in _send_request self.endheaders(body) File "C:\Python27\lib\httplib.py", line 954, in endheaders self._send_output(message_body) File "C:\Python27\lib\httplib.py", line 818, in _send_output self.send(message_body) File "C:\Python27\lib\httplib.py", line 790, in send self.sock.sendall(data) File "C:\Python27\lib\ssl.py", line 229, in sendall v = self.send(data[count:]) TypeError: unhashable type 回溯(最近一次呼叫最后一次): 文件“C:\Python27\tutorial.py”,第14行,in connection.request(“POST”,“/pdb xml reports/scb_xmlclient.cgi”,参数,标题) 文件“C:\Python27\lib\httplib.py”,第958行,在请求self.\u发送\u请求(方法、url、正文、标题)中 文件“C:\Python27\lib\httplib.py”,第992行,在_send_request self.endheaders(body)中 文件“C:\Python27\lib\httplib.py”,第954行,在endheaders self.\u send\u输出(消息体)中 文件“C:\Python27\lib\httplib.py”,第818行,在发送输出self.send(消息体)中 文件“C:\Python27\lib\httplib.py”,第790行,在send self.sock.sendall(数据)中 sendall v=self.send中的文件“C:\Python27\lib\ssl.py”,第229行(数据[count:]) TypeError:不可损坏的类型 我的日志文件显示xmldata参数为空


有什么想法吗?

我想在传递给.request时,params必须是一个字符串,这可以解释这个错误,因为散列是不可散列的

尝试先用

params = urllib.urlencode(params)
您也可以在下面的底部找到另一个代码示例:


谢谢您的反馈

我想我把这件事弄得太难了。我走了另一条路,它似乎奏效了

import urllib2
URL = "https://pdb-services-beta.nipr.com/pdb-xml-reports/scb_xmlclient.cgi"
DATA = 'xmldata=<?xml version="1.0"?><!DOCTYPE SCB_Request SYSTEM "http://www.nipr.com/html/SCB_XML_Request.dtd"><SCB_Request Request_Type="Create_Report"><SCB_Login_Data CustomerID="someuser" Passwd="somepass" /><SCB_Create_Report_Request Title=""><Producer_List><NIPR_Num_List_XML><NIPR_Num NIPR_Num="8980608" /></NIPR_Num_List_XML></Producer_List></SCB_Create_Report_Request></SCB_Request>'
req = urllib2.Request(url=URL, data=DATA)
f = urllib2.urlopen(req)
print f.read()
导入urllib2
URL=”https://pdb-services-beta.nipr.com/pdb-xml-reports/scb_xmlclient.cgi"
数据='xmldata='
请求(url=url,数据=data)
f=urllib2.urlopen(请求)
打印f.read()

文档之后:如果存在
body
参数,则它应该是一个数据字符串,在标题完成后发送。因此,我的params参数应该是一个字符串?…我将尝试一下。谢谢,谢谢克里斯托夫。我来看看。