Как проверить исходящий HTTP-запрос от модуля python? - PullRequest
0 голосов
/ 11 октября 2018

Мне нужно написать эквивалентный Python-код для упомянутого ниже рабочего curl (я заменил учетные данные по очевидной причине, но он возвращает статус 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), так как я могу сравнить два?Могу ли я сгенерировать Curl из запроса Python `?

  • Может ли кто-нибудь заметить ошибку в моей версии Python?Я подозреваю некоторую проблему при передаче данных формы (для сбора доказательств мне нужен ответ на поставленный выше вопрос)

Редактировать

Кажется, есть свернуть пакет.Но похоже, что он не поддерживает различие между параметрами -d и -F.

1 Ответ

0 голосов
/ 11 октября 2018

Попробуйте:

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

...