Использование JSON в заголовке запроса - PullRequest
0 голосов
/ 09 апреля 2020

Попытка вызвать API с Python, где часть заголовков содержит "{}".

С Curl это работает напрямую:

curl -X POST --header 'Content-Type: application/json' --header 'Accept: application/json' --header 'token: {"uid": "email@domain.com","timestamp": 0,"token": "","client": "web","version": "","language": "zh-CN" }' -d '{ \ 
   "account": "email@domain.com", \ 
   "pwd": "mypassword", \ 
   "is_local": true, \ 
   "agreement_agreement": 0 \ 
 }' 'http://globalapi.sems.com.cn:82/api/v1/Common/CrossLogin'

Но с Python Я не могу заставить его работать, API выдает ошибку. Я подозреваю, что это связано с форматом токена в заголовке, так как это строка, содержащая {}. Смотрите различные варианты, закомментированные ниже - API не принимает ни один из них. Он отлично подходит для использования {} в диктовке с Python, просто используя обычный код:

sems_headers = {
    'Content-Type':'application/json',
    'Accept':'text/json',
    'token': '{"uid": "email@domain.com","timestamp": 0,"token": "","client": "web","version": "","language": "en-GB"}' 
}
for c, d in sems_headers.items():
    print(c, d)

Как я могу вызвать API с форматом, необходимым для токена в Python?

sems_headers = {
    'Content-Type':'application/json',
    'Accept':'text/json',
    #'token': "'uid':'email@domain.com', 'timestamp':'0', 'token':'', 'client':'web', 'version':'', 'language':'en-GB'" 
    #'token': '{"uid": "email@domain.com","timestamp": 0,"token": "","client": "web","version": "","language": "en-GB"}' 
    #'token': ''{{"uid": "email@domain.com","timestamp": 0,"token": "","client": "web","version": "","language": "en-GB"}}' 
    #'token': "{""uid"": ""email@domain.com"", ""timestamp"": 0, ""token"": "" "", ""client"": ""web"", ""version"": "" "", ""language"": ""en-GB"" }"
}

sems_post_data = {
    'account':'email@domain.com',
    'pwd':'mypassword',
    'is_local':True,
    'agreement_agreement':0
}

post = requests.post("https://globalapi.sems.com.cn/api/v1/Common/CrossLogin", headers=sems_headers, data=sems_post_data)

print(post.text)

1 Ответ

1 голос
/ 09 апреля 2020

Из документов запросов здесь похоже, что ваша проблема может быть связана с тем, как вы отправляете свою полезную нагрузку JSON, поскольку аргумент ключевого слова данных отправляет данные в кодовой форме, а не JSON - закодирован. Попробуйте либо явно JSON -кодировать вашу полезную нагрузку, либо использовать вместо него аргумент ключевого слова json:

post = requests.post("https://globalapi.sems.com.cn/api/v1/Common/CrossLogin", headers=sems_headers, json=sems_post_data)

или

import json
post = requests.post("https://globalapi.sems.com.cn/api/v1/Common/CrossLogin", headers=sems_headers, data=json.dumps(sems_post_data))

Также ваш Accept заголовок должен быть изменен на application/json, и для анализа содержимого ответа JSON следует использовать post.json() вместо post.text

В целом это будет:

sems_headers = {
    'Content-Type':'application/json',
    'Accept':'application/json',
    'token': '{"uid": "email@domain.com","timestamp": 0,"token": "","client": "web","version": "","language": "en-GB"}' 
}

sems_post_data = {
    'account':'email@domain.com',
    'pwd':'mypassword',
    'is_local':True,
    'agreement_agreement':0
}

post = requests.post("https://globalapi.sems.com.cn/api/v1/Common/CrossLogin", headers=sems_headers, json=sems_post_data)

print(post.json())
...