我遇到以下错误消息:
TypeError: add_header() takes exactly 3 arguments (2 given)
使用这些参数时:
testService("SomeServiceName", "POST", "[redacted valid url]", ('Content-type','application/json'), [redacted valid json])
通常此错误意味着我没有将"self"作为参数传递,但是看到此方法未在类中调用,我不确定该怎么办。我尝试在参数和方法内部将 self 作为参数传入。我尝试将标题包装在括号和括号中。当我传递"self"时,我收到错误消息,即 self 未定义,当我使用括号而不是括号时,我得到与上面相同的错误。
有没有一个有神奇的Python调试技能的人?非常感谢您抽出宝贵时间查看此内容!
def testService(name, verb, url, header="", requestBody=""):
#Log out the name of the request we're testing
if (name is not None) or (name.strip() is not ""):
print "Checking " + name + "nn"
# Make URL with StoreNumber
if (url is not None) or (url is not ""):
testUrl = url
# If specified verb is GET
if verb.strip().upper() == "GET":
# Create request
req = urllib2.Request(testUrl)
print "Making request with URL: " + testUrl + "nn"
# Send request
try:
response = urllib2.urlopen(req)
# If service returns 200 Okay
print "Connection to " + name + " Service successful. Returned with code " + str(response.code) + "nn"
# Log response
print "Response: " + response.read() + "nn"
# Handle exceptions
# If HTTP Error
except HTTPError as e:
if hasattr(e, 'reason'):
print name + ' failed to reach a server.'
print 'Reason: ', e.reason
elif hasattr(e, 'code'):
print e.code
elif hasattr(e, 'message'):
print e.message
pass
# If URL was the problem
except URLError as e:
if hasattr(e, 'reason'):
print name + ' failed to reach a server.'
if str(e.reason) == "[Errno 11004] getaddrinfo failed":
print "[Errno 11004] getaddrinfo failed with bad url: " + testUrl + "nn"
else:
print 'Reason: ', e.reason
elif hasattr(e, 'code'):
print 'Error code: ', e.code
elif hasattr(e, 'message'):
print e.message
pass
# If specified verb was POST
elif verb.strip().upper() == "POST":
# Check for None requestBody
if (requestBody is not None) or (requestBody.strip() is not ""):
data = urllib.urlencode(requestBody)
# Create request
req = urllib2.Request(testUrl, data)
# Check for header
if (header is not None) or (header.strip() is not ""):
req.add_header(header)
# YO YO THE BELOW CODE IS INCOMPLETE PLEASE FINISH
# Log request with URL and Data
print "Making request with URL: " + testUrl + " and data: THIS PART IS UNFINISHED PLEASE FINISH ME nn"
try:
response = urllib2.urlopen(req)
# If service returns 200 Okay
print "Connection to " + name + " Service successful. Returned with code " + str(response.code) + "nn"
# Log response
print "Response: " + response.read() + "nn"
# Handle exceptions
# If HTTP Error
except HTTPError as e:
if hasattr(e, 'code'):
print e.code
elif hasattr(e, 'message'):
print e.message
elif hasattr(e, 'reason'):
print name + ' failed to reach a server.'
print 'Reason: ', e.reason
pass
except URLError as e:
if hasattr(e, 'reason'):
print name + ' failed to reach a server.'
if str(e.reason) == "[Errno 11004] getaddrinfo failed":
print "[Errno 11004] getaddrinfo failed with bad url: " + url + "nn"
else:
print 'Reason: ', e.reason
elif hasattr(e, 'code'):
print 'Error code: ', e.code
elif hasattr(e, 'message'):
print e.message
pass
# Header non-existent in testService call
else:
print "Service header not provided. Exiting program"
sys.exit()
# Requesty Body not present in testService call
else:
print "Service request body not provided in code. Exiting program"
sys.exit()
# If specified verb is not supported (Currently only GET and POST are supported)
else:
print name + " Service written with HTTP verb other than GET or POST. Exiting program"
sys.exit()
else:
print "Service url not provided in code. Exiting program"
sys.exit()
else:
print "Service name not provided in code. Exiting program"
sys.exit()
> 从文档中,add_header
采用两个参数。你用一个参数调用它,一个有两个值的元组。
你应该做什么:
req.add_header(key, value)
您当前正在做什么,因为您将标头作为元组获取:
req.add_header((key, value,)) # aka passing a tuple with both arguments to the key parameter
您需要解压缩元组:
req.add_header(header[0], header[1])
或者更好的是,使用 splat 运算符 ( *
):
req.add_header(*header) # Does the same thing as above
此外,您使用空字符串作为header
的默认参数,当它被提供时它是一个元组。您可能应该将默认值更改为元组或None
。
您的header
是一个 2 元组:
('Content-Type', 'application/json')
您正在尝试执行此操作:
req.add_header('Content-Type', 'application/json')
但实际上你正在这样做:
req.add_header(('Content-Type', 'application/json'))
请注意,您只传递一个参数(一个元组),而不是两个参数、一个键和一个值。
要解决此问题,请在使用 *
(非正式地称为"splat")运算符传递header
时解压缩:
req.add_header(*header)
看看文档:http://docs.python.org/2/library/urllib2.html#urllib2.Request.add_header。
虽然该函数需要一个键和一个值,但你只传递一个对象。由于你在 req 对象上调用它,所以这也是被传递的隐式"自我"。
可以通过两种方式调用此函数:
req.add_header(key, value)
urllib2.Request.add_header(req, key, value) # explicitly passing the reference instead of self
我不确定您是否希望将传递的字符串视为键或值,但是添加另一个参数(或使标头参数采用字典,然后在 for 循环中适当拆分)应该可以解决问题。例如(删除了不相关的代码):
def testService(name, verb, url, header=None, requestBody=""):
if header is None:
header = {}
for key, value in header.iteritems():
req.add_header(key, value)