python-3.x - 将我的代码从 python 2 更改为 3 并尝试运行这个 Unix
问题描述
我能够在 Windows 中的 python 2.7 中正确运行以下代码。但是当我将代码从 2.7 转换并更改为 Python 3.6 时,然后尝试在 Unix 中运行代码。我收到以下错误。'TypeError: POST 数据应该是字节、字节的可迭代或文件对象。它不能是 str 类型。我对这个 URLLIB 很陌生。如果您能告诉我我的代码有什么问题,那将是非常有帮助的。
蟒蛇2.7,Windows 10:
import json
import win32com.client as WC
def extractFromParFiles_SingleComponent (HCP_ID,ListOfTestnumbers,ListOfPartSequenceNumbers):
InputObject = {"HCP_ID":HCP_ID,"ListOfTestnumbers":ListOfTestnumbers,"ListOfPartSequenceNumbers":ListOfPartSequenceNumbers,"KeepNullValues":True}
return callWebservice(InputObject)
def callWebservice(InputObject):
URL = ""
h = WC.Dispatch('WinHTTP.WinHTTPRequest.5.1')
h.SetAutoLogonPolicy(0)
h.SetTimeouts(0,0,0,0)
h.Open('POST', URL, False)
h.SetRequestHeader('Content-Type', 'application/json')
JSON_In = json.dumps(InputObject)
h.Send(JSON_In)
JSON_Out = h.responseText
try:
OutputData = json.loads(JSON_Out)
except:
print JSON_Out
if "d" in OutputData:
return OutputData["d"]
else:
print "Length of JSON_In: %s\n" % len(JSON_In)
print "JSON_In: %s\n" % JSON_In
print "Length of JSON_Out: %s\n" % len(JSON_Out)
print "JSON_Out: %s\n" % JSON_Out
raise RuntimeError, "Error from Webservice"
Python 3.6,Unix:
import json
import urllib.request, urllib.error, urllib.parse
from ntlm3 import HTTPNtlmAuthHandler
def extractFromParFiles_SingleComponent(HCP_ID,ListOfTestnumbers,ListOfPartSequenceNumbers):
InputObject = {"HCP_ID":HCP_ID,"ListOfTestnumbers":ListOfTestnumbers,"ListOfPartSequenceNumbers":ListOfPartSequenceNumbers,"KeepNullValues":True}
return callWebservice(InputObject)
def callWebservice(InputObject):
URL = ""
User = ""
Password = ""
pass_item = urllib.request.HTTPPasswordMgrWithDefaultRealm()
pass_item.add_password(None, URL, User, Password)
auth_NTLM = HTTPNtlmAuthHandler.HTTPNtlmAuthHandler(pass_item)
opener = urllib.request.build_opener(auth_NTLM)
urllib.request.install_opener(opener)
JSON_In = json.dumps(InputObject)
req = urllib.request.Request(URL, JSON_In, {'Content-Type': 'application/json'})
f = urllib.request.urlopen(req)
JSON_Out = f.read()
f.close()
OutputData = json.loads(JSON_Out)
return OutputData["d"]
解决方案
urllib.request.Request
data 参数需要一个类似字节的对象,您正在传递一个字符串。调用encode()
将JSON_In
其转换为字节数组。
从文档(https://docs.python.org/3/library/urllib.request.html#urllib.request.Request):
data必须是一个对象,指定要发送到服务器的附加数据,或者None
如果不需要此类数据。目前,HTTP 请求是唯一使用数据的请求。支持的对象类型包括字节、类文件对象和可迭代对象。如果没有提供Content-Length
norTransfer-Encoding
头字段,HTTPHandler 将根据数据类型设置这些头。Content-Length
将用于发送字节对象,而Transfer-Encoding: chunked
在 RFC 7230 中指定,第 3.3.1 节将用于发送文件和其他可迭代对象。
您的代码应如下所示:
req = urllib.request.Request(URL, JSON_In.encode(), {'Content-Type': 'application/json'})
推荐阅读
- angular - NgbDatePicker :专注于输入框
- c# - 控制如何、何时以及是否绘制子控件 (.NET)
- r - 获取每个元素的平均值
- mysql - 为什么我的 AND 语句在 MySQL/PHPMyAdmin 中不起作用
- java - 如何将属性文件加载到 Java 中?
- javascript - 数据未添加到数据库中(firebase)
- jquery - 有没有办法使用元素 innerHTML 作为 keyCode 编号?
- oracle - Oracle Apex,是否可以从远程服务器连接 excel 文件或 csv?
- c# - 如何使用 TFS 2015 上的 devops api 检索所有“项目集合”的列表
- java - 根据子字符串对字符串进行排序