add_header期望 3 个参数而不仅仅是键/值



我遇到以下错误消息:

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)

相关内容