如何验证来自python模块的传出HTTP请求?

时间:2018-10-11 07:32:22

标签: python django python-3.x curl multipartform-data

我需要为以下提到的工作curl编写Python等效代码(出于明显的原因,我替换了凭据,但它会返回200状态。)

curl -X POST \
  'https://api.lever.co/v1/candidates?dedupe=true&perform_as=user_123' \
  -H 'Authorization: Basic token_123' \
  -H 'Cache-Control: no-cache' \
  -H 'Content-Type: multipart/form-data' \
  -H 'Postman-Token: 58cafa90-7ae4-47db-a144-4e9d430ffc94' \
  -H 'content-type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW' \
  -F 'files[]=@/Users/gaurav/lever_resume.pdf' \
  -F 'emails[]=a@b.com'

所以,我最终写了这段代码。

user_email = 'user@domain.com'
admin_id = '20f3975a-543f-4ca8-b215-2f851232a0ad'
client_id = '893728937298'
client_secret = '32032'
file_path = '/Users/ttn/Desktop/a.txt'
file_name = 'a.txt'

logging.basicConfig(level=logging.DEBUG)
url = "https://api.lever.co/v1/candidates"
files = {
            'files[]': (file_name, open(file_path,'rb')),
    }
auth = HTTPBasicAuth(client_id, client_secret)
querystring = {
    "perform_as": admin_id, 
    "dedupe": 'true'
}
payload = {
    'emails[]': user_email
}
headers = {
    'Content-Type': "multipart/form-data",
    "Cache-Control": "no-cache",
    "content-type": "multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW"
}

response = requests.post(url, 
                            headers=headers, 
                            params=querystring, 
                            data=payload,
                            auth=auth, 
                            files=files)
req = response.request
# print(curlify.to_curl(req))

print('\n==== Headers', req.headers)
print('\n==== Body', req.body)
print('\n==== form-data', str(req))

print(response.text)

问题

  • 由于Curl的Python版本无法正常运行(给出502错误而不是200错误),因此该如何比较两者?我可以根据Python的请求生成Curl吗?`?

  • 有人可以在我的Python版本中发现错误吗?我怀疑正在传递表单数据时出现了一些问题(为了收集证据,我需要回答上述问题)

编辑

似乎有一个curlify软件包。但是看来它不支持-d-F参数之间的区别。

1 个答案:

答案 0 :(得分:0)

尝试一下:

import requests

headers = {
    'Authorization': 'Basic token_123',
    'Cache-Control': 'no-cache',
    'Content-Type': 'multipart/form-data',
    'Postman-Token': '58cafa90-7ae4-47db-a144-4e9d430ffc94',
    'content-type': 'multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW',
}

params = (
    ('dedupe', 'true'),
    ('perform_as', 'user_123'),
)

files = {
    'files[]': ('/Users/gaurav/lever_resume.pdf', open('/Users/gaurav/lever_resume.pdf', 'rb')),
    'emails[]': (None, 'a@b.com'),
}

response = requests.post('https://api.lever.co/v1/candidates', headers=headers, params=params, files=files)

#NB. Original query string below. It seems impossible to parse and
#reproduce query strings 100% accurately so the one below is given
#in case the reproduced version is not "correct".
# response = requests.post('https://api.lever.co/v1/candidates?dedupe=true&perform_as=user_123', headers=headers, files=files)oduced version is not "correct".
# response = requests.post('https://api.lever.co/v1/candidates?dedupe=true&perform_as=user_123', headers=headers, files=files)
  

参考:https://curl.trillworks.com/#python