我尝试使用Pythons请求库将数据发布到URL。
如果我尝试通过在我的脚本中设置包含发布数据的多行字符串变量来完成此操作,那么一切正常。
如果我尝试读入具有相同数据的外部文件,请求在我发布的应用程序服务器上失败,因为它认为存在无效的XML。
例如:
有效
starturl="http://myserver.example.com/location/where/I/post"
username=user
password=mypassword
# Set the XML data
xmldata="""<?xml version="1.0" encoding="utf-8"?>
(Lots more xml)
"""
# POST the job data
session = requests.Session()
request = session.post(starturl, auth=(username,password), data=xmldata, headers=post_headers)
服务器端应用程序处理请求就好了。但是,如果我做的唯一更改是从外部文件读取xml数据,则不再有效。
这不起作用
xmlfile="/path/to/my/xmldata.xml"
xmldata = open(xmlfile,'r')
session = requests.Session()
request = session.post(start_url, auth=(username,password), data=xmldata.read(), headers=post_headers)
服务器端应用程序,然后错误:
"Data at the root level is invalid. Line 1, position 1"
使用wireshark进行检查时,我发现POST的请求主体存在差异。从某个地方出现了三个小点
工作时:
Content-Type: application/xml
Authorization: Basic c3BvdGFkbTpQQHNzdzByZA==
<?xml version="1.0" encoding="utf-8"?>
失败时
Content-Type: application/xml
Authorization: Basic c3BvdGFkbTpQQHNzdzByZA==
...<?xml version="1.0" encoding="utf-8"?>
我不确定导致3个前导点出现在请求正文中的原因。我检查了源XML文件,尝试从中删除换行符。似乎没有什么可以做到的?
答案 0 :(得分:1)
如果没有您的xml文件,就无法确定,但您可能在文件的开头有一个BOM。微软因坚持在所有utf-8文件上放置无用的BOM而闻名。
您可以检查文件的前三个字符是否为codecs.BOM_UTF8序列('\ xef \ xbb \ xbf')并将其删除(如果它在那里)。