为什么在调用 Web 服务时我的 curl 请求有效而我的 python3 请求无效?
Why does my curl request work and my python3 request not work when calling a webservice?
所以我有两个(我认为是)相同的 Web 服务请求...一个来自有效的 curl,另一个在 Python3 中。
我不明白它们之间的区别,因为 curl 有效并且 returns 预期结果,而 Python3 一个 returns 500 HTTP 状态代码。
我的curl
调用如下:
$ curl -d "{\"Service\": \"Activity\", \"Action\": \"GetDataHistory\",\"Data\": \"{'StartTime':'2019-08-20T13:00:00+00:00', 'EndTime':'2019-08-20T13:10:00+00:00','GameId':'XXXXXXXX-YYYY-ZZZZ-AAAA-BBBBBBBBBBBB'}\"}" -v -H "Content-Type: application/json" -H "cache-control: no-cache" -H "username: someusrname" -H "password: $(echo $vlpasswd)" -X POST -k https://xxx.xxx.xxx.xxx/api/Service/Call | /c/Users/meacct/AppData/Local/Continuum/anaconda3/python -m json.tool
我的 Python3 代码 "should" 做同样的事情在这里:
import json
import requests as req
import urllib3
endpoint = 'https://xxx.xxx.xxx.xxx/api/Service/Call'
h = {'Content-Type': 'application/json',
'cache-control': 'no-cache',
'username': 'someusrname',
'password':'das-passwd'
}
d = {'Service': 'Activity',
'Action': 'GetDataHistory',
'Data':
{
"StartTime":"2019-08-20T13:00:00+00:00",
"EndTime":"2019-08-20T13:10:00+00:00",
"GameId":"XXXXXXXX-YYYY-ZZZZ-AAAA-BBBBBBBBBBBB"
}
}
# Shut up urllib3's warnings about an invaild SSL Certy.
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
session = req.Session()
try:
res = session.post(url=endpoint, headers=h, data=d, verify=False)
except req.exceptions.SSLError:
print("SSL Error")
print(res.status_code)
res.text
输出为:
500
'{"Message":"An error has occurred."}'
为什么看起来是完全相同的调用?
由于 curl 请求成功,这表明您的 Python 请求有问题,而不是服务器配置。
我建议您尝试使用 curlconverter,直接从 curl 请求生成 Python 请求,而不是追查问题。
所以我有两个(我认为是)相同的 Web 服务请求...一个来自有效的 curl,另一个在 Python3 中。
我不明白它们之间的区别,因为 curl 有效并且 returns 预期结果,而 Python3 一个 returns 500 HTTP 状态代码。
我的curl
调用如下:
$ curl -d "{\"Service\": \"Activity\", \"Action\": \"GetDataHistory\",\"Data\": \"{'StartTime':'2019-08-20T13:00:00+00:00', 'EndTime':'2019-08-20T13:10:00+00:00','GameId':'XXXXXXXX-YYYY-ZZZZ-AAAA-BBBBBBBBBBBB'}\"}" -v -H "Content-Type: application/json" -H "cache-control: no-cache" -H "username: someusrname" -H "password: $(echo $vlpasswd)" -X POST -k https://xxx.xxx.xxx.xxx/api/Service/Call | /c/Users/meacct/AppData/Local/Continuum/anaconda3/python -m json.tool
我的 Python3 代码 "should" 做同样的事情在这里:
import json
import requests as req
import urllib3
endpoint = 'https://xxx.xxx.xxx.xxx/api/Service/Call'
h = {'Content-Type': 'application/json',
'cache-control': 'no-cache',
'username': 'someusrname',
'password':'das-passwd'
}
d = {'Service': 'Activity',
'Action': 'GetDataHistory',
'Data':
{
"StartTime":"2019-08-20T13:00:00+00:00",
"EndTime":"2019-08-20T13:10:00+00:00",
"GameId":"XXXXXXXX-YYYY-ZZZZ-AAAA-BBBBBBBBBBBB"
}
}
# Shut up urllib3's warnings about an invaild SSL Certy.
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
session = req.Session()
try:
res = session.post(url=endpoint, headers=h, data=d, verify=False)
except req.exceptions.SSLError:
print("SSL Error")
print(res.status_code)
res.text
输出为:
500
'{"Message":"An error has occurred."}'
为什么看起来是完全相同的调用?
由于 curl 请求成功,这表明您的 Python 请求有问题,而不是服务器配置。
我建议您尝试使用 curlconverter,直接从 curl 请求生成 Python 请求,而不是追查问题。