我如何为 Python 中的 API 制定 POST 请求?
How can I formulate a POST request for an API in Python?
我有一个 MITMproxy 数据捕获导致以下输出。
POST
https://gateway.monster.com/seeker/mobile/jobs/search/solr?since=946677600&options=applymethod,calculatedistance
Accept: application/json
Content-Type: application/json
User-Agent: monster/2.12.0/800/iOS;10;iPhone-5s
Accept-Encoding: gzip, deflate
x-domain: mobileservice.ge.monster.ch
x-brand: 1
x-ver: 2.12.0
x-uid: 64e0a64c-ddb5-489c-ab5f-0dec9fed1066
x-device: 11
x-device-model: iPhone 5s
x-os-ver: 10
Content-Length: 313
Host: gateway.monster.com
JSON
{
"AgentId": 0,
"CompanyName": "",
"CompanyXCode": "",
"Country": "US",
"Filters": {
"CareerLevels": [],
"EducationLevels": [],
"JobBoardIds": [],
"JobTypes": [],
"PostingDuration": -1,
"YearsOfExp": []
},
"JobTitle": "",
"Keywords": "business",
"Latitude": 0.0,
"Longitude": 0.0,
"Page": 1,
"PageSize": 25,
"Radius": 10,
"Sort": "dt.rv.di",
"Where": "Zurich"
}
我试图用 python 复制它,执行以下操作:POST-URL,将 JSON 数据附加到查询并设置 header。
但是,这会导致错误的请求错误:<Response [400]>
我怀疑它在 URL 部分的某个地方:since=946677600&options=applymethod,calculatedistance
谁能告诉我我做错了什么?
这是 python 代码:
import requests
import json
import time
from datetime import datetime
import os
from random import randint
#query
url = 'https://gateway.monster.com/seeker/mobile/jobs/search/solr?
since=946677600&options=applymethod,calculatedistance'
payload = {
"AgentId": 0,
"CompanyName": "",
"CompanyXCode": "",
"Country": "US",
"Filters": {
"CareerLevels": [],
"EducationLevels": [],
"JobBoardIds": [],
"JobTypes": [],
"PostingDuration": -1,
"YearsOfExp": []
},
"JobId": "",
"JobTitle": "",
"Keywords": "software developer",
"Latitude": 0.0,
"LocationDescription": "new york",
"Longitude": 0.0,
"Page": 1,
"PageSize": 25,
"Radius": 20,
"Sort": "dt.rv.di",
"Where": "new york"
}
headers = {'content-type': 'application/json'}
# Get a copy of the default headers that requests would use
headers = requests.utils.default_headers()
# Update the headers with your custom ones
# You don't have to worry about case-sensitivity with
# the dictionary keys, because default_headers uses a custom
# CaseInsensitiveDict implementation within requests' source code.
#userAgents
headers.update(
{
'User-Agent': 'Monster/2.12.0/800/iOS;10.2.1;iPhone-6',
}
)
#get the query result from the url with UA set for a ALL jobs in current location
response = requests.post(url, data=json.dumps(payload), headers=headers)
print(response)
首先尝试运行使用与捕获参数尽可能相同的查询。当 运行 与来自捕获
的全套 headers
headers = requests.utils.default_headers()
headers_str = """Accept: application/json
Content-Type: application/json
User-Agent: monster/2.12.0/800/iOS;10;iPhone-5s
Accept-Encoding: gzip, deflate
x-domain: mobileservice.ge.monster.ch
x-brand: 1
x-ver: 2.12.0
x-uid: 64e0a64c-ddb5-489c-ab5f-0dec9fed1066
x-device: 11
x-device-model: iPhone 5s
x-os-ver: 10
Content-Length: 313
Host: gateway.monster.com"""
for l in txt.splitlines():
k, v = l.split(':')
headers[k] = v.strip()
响应变为 200。
通过反复试验,您可以确定所需的 header 是 x-domain: mobileservice.ge.monster.ch
。
我有一个 MITMproxy 数据捕获导致以下输出。
POST
https://gateway.monster.com/seeker/mobile/jobs/search/solr?since=946677600&options=applymethod,calculatedistance
Accept: application/json
Content-Type: application/json
User-Agent: monster/2.12.0/800/iOS;10;iPhone-5s
Accept-Encoding: gzip, deflate
x-domain: mobileservice.ge.monster.ch
x-brand: 1
x-ver: 2.12.0
x-uid: 64e0a64c-ddb5-489c-ab5f-0dec9fed1066
x-device: 11
x-device-model: iPhone 5s
x-os-ver: 10
Content-Length: 313
Host: gateway.monster.com
JSON
{
"AgentId": 0,
"CompanyName": "",
"CompanyXCode": "",
"Country": "US",
"Filters": {
"CareerLevels": [],
"EducationLevels": [],
"JobBoardIds": [],
"JobTypes": [],
"PostingDuration": -1,
"YearsOfExp": []
},
"JobTitle": "",
"Keywords": "business",
"Latitude": 0.0,
"Longitude": 0.0,
"Page": 1,
"PageSize": 25,
"Radius": 10,
"Sort": "dt.rv.di",
"Where": "Zurich"
}
我试图用 python 复制它,执行以下操作:POST-URL,将 JSON 数据附加到查询并设置 header。
但是,这会导致错误的请求错误:<Response [400]>
我怀疑它在 URL 部分的某个地方:since=946677600&options=applymethod,calculatedistance
谁能告诉我我做错了什么?
这是 python 代码:
import requests
import json
import time
from datetime import datetime
import os
from random import randint
#query
url = 'https://gateway.monster.com/seeker/mobile/jobs/search/solr?
since=946677600&options=applymethod,calculatedistance'
payload = {
"AgentId": 0,
"CompanyName": "",
"CompanyXCode": "",
"Country": "US",
"Filters": {
"CareerLevels": [],
"EducationLevels": [],
"JobBoardIds": [],
"JobTypes": [],
"PostingDuration": -1,
"YearsOfExp": []
},
"JobId": "",
"JobTitle": "",
"Keywords": "software developer",
"Latitude": 0.0,
"LocationDescription": "new york",
"Longitude": 0.0,
"Page": 1,
"PageSize": 25,
"Radius": 20,
"Sort": "dt.rv.di",
"Where": "new york"
}
headers = {'content-type': 'application/json'}
# Get a copy of the default headers that requests would use
headers = requests.utils.default_headers()
# Update the headers with your custom ones
# You don't have to worry about case-sensitivity with
# the dictionary keys, because default_headers uses a custom
# CaseInsensitiveDict implementation within requests' source code.
#userAgents
headers.update(
{
'User-Agent': 'Monster/2.12.0/800/iOS;10.2.1;iPhone-6',
}
)
#get the query result from the url with UA set for a ALL jobs in current location
response = requests.post(url, data=json.dumps(payload), headers=headers)
print(response)
首先尝试运行使用与捕获参数尽可能相同的查询。当 运行 与来自捕获
的全套 headersheaders = requests.utils.default_headers()
headers_str = """Accept: application/json
Content-Type: application/json
User-Agent: monster/2.12.0/800/iOS;10;iPhone-5s
Accept-Encoding: gzip, deflate
x-domain: mobileservice.ge.monster.ch
x-brand: 1
x-ver: 2.12.0
x-uid: 64e0a64c-ddb5-489c-ab5f-0dec9fed1066
x-device: 11
x-device-model: iPhone 5s
x-os-ver: 10
Content-Length: 313
Host: gateway.monster.com"""
for l in txt.splitlines():
k, v = l.split(':')
headers[k] = v.strip()
响应变为 200。
通过反复试验,您可以确定所需的 header 是 x-domain: mobileservice.ge.monster.ch
。