点击 API 时卷曲 vs python "requests"
curl vs python "requests" when hitting APIs
我正在尝试为我的帐户访问 Bitbucket API,成功的尝试如下所示:
curl --user screename:mypassword
https://api.bitbucket.org/1.0/user/repositories
在命令行中。在 python 中,我尝试:
import requests
url = 'https://api.bitbucket.org/1.0/user/repositories'
然后
r = requests.post(url, data={'username': myscreename, 'password':mypassword})
和
r = requests.post(url, data="myscreename:mypassword")
和
r = requests.post(url, data={"user": "myscreename:mypassword"})
全部得到 405 错误。 API 是 https://confluence.atlassian.com/bitbucket/rest-apis-222724129.html.
我想知道:
我在请求版本中做错了什么,它们看起来都与我的卷曲尝试相似
使用 curl 请求和 python 请求模块有什么区别?在阅读带有卷曲示例的 API 然后将其写入 python 时,我可以识别出什么一般模式?
谢谢
答案:
它需要正确的 headers
https://answers.atlassian.com/questions/18451025/answers/18451117?flashId=-982194107
更新:
# ===============
# get user
# ===============
import requests
import json
# [BITBUCKET-BASE-URL], i.e.: https://bitbucket.org/
url = '[BITBUCKET-BASE-URL]/api/1.0/user/'
headers = {'Content-Type': 'application/json'}
# get user
# [USERNAME], i.e.: myuser
# [PASSWORD], i.e.: itspassword
r = requests.get(url, auth=('[USERNAME]', '[PASSWORD]'), headers=headers)
print(r.status_code)
print(r.text)
#print(r.content)
这是使用 Python 的请求模块进行基本 HTTP 身份验证的方法:
requests.post('https://api.bitbucket.org/1.0/user/repositories', auth=('user', 'pass'))
通过另一种方式,您通过请求的有效负载传递 user/pass,这是不需要的,因为 HTTP 基本身份验证在 HTTP 协议中有其自己的位置。
如果您想 "see" 您的请求背后发生了什么,我建议您使用 httpbin:
>>> url = "http://httpbin.org/post"
>>> r = requests.post(url, data="myscreename:mypassword")
>>> print r.text
{
"args": {},
"data": "myscreename:mypassword",
"files": {},
"form": {},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Content-Length": "22",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.5.1 CPython/2.7.6 Darwin/14.3.0"
},
"json": null,
"origin": "16.7.5.3",
"url": "http://httpbin.org/post"
}
>>> r = requests.post(url, auth=("myscreename", "mypassword"))
>>> print r.text
{
"args": {},
"data": "",
"files": {},
"form": {},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Authorization": "Basic bXlzY3JlZW5hbWU6bXlwYXNzd29yZA==",
"Content-Length": "0",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.5.1 CPython/2.7.6 Darwin/14.3.0"
},
"json": null,
"origin": "16.7.5.3",
"url": "http://httpbin.org/post"
}
并且卷曲:
curl -X POST --user myscreename:mypassword http://httpbin.org/post
{
"args": {},
"data": "",
"files": {},
"form": {},
"headers": {
"Accept": "*/*",
"Authorization": "Basic bXlzY3JlZW5hbWU6bXlwYXNzd29yZA==",
"Host": "httpbin.org",
"User-Agent": "curl/7.37.1"
},
"json": null,
"origin": "16.7.5.3",
"url": "http://httpbin.org/post"
}
请注意最后一个 python 示例与 cURL 示例之间的相似之处。
现在,正确设置 API 的格式是另一回事,请查看此 link:https://answers.atlassian.com/questions/94245/can-i-create-a-bitbucket-repository-using-rest-api
python 方式应该是这样的:
requests.post('https://api.bitbucket.org/1.0/repositories', auth=('user', 'pass'), data = "name=repo_name")
使用 python3,你可以使用 json={...} 而不是 data={...},它会自动将 header 设置为 application/json:
import requests
url = 'https://api.bitbucket.org/1.0/user/repositories'
data = {
'data1': 'asd',
'data2': 'asd'
}
req = requests.post(url, auth=('user', 'password'), json = data)
data = req.json()
# data['index']
我正在尝试为我的帐户访问 Bitbucket API,成功的尝试如下所示:
curl --user screename:mypassword
https://api.bitbucket.org/1.0/user/repositories
在命令行中。在 python 中,我尝试:
import requests
url = 'https://api.bitbucket.org/1.0/user/repositories'
然后
r = requests.post(url, data={'username': myscreename, 'password':mypassword})
和
r = requests.post(url, data="myscreename:mypassword")
和
r = requests.post(url, data={"user": "myscreename:mypassword"})
全部得到 405 错误。 API 是 https://confluence.atlassian.com/bitbucket/rest-apis-222724129.html.
我想知道:
我在请求版本中做错了什么,它们看起来都与我的卷曲尝试相似
使用 curl 请求和 python 请求模块有什么区别?在阅读带有卷曲示例的 API 然后将其写入 python 时,我可以识别出什么一般模式?
谢谢
答案:
它需要正确的 headers
https://answers.atlassian.com/questions/18451025/answers/18451117?flashId=-982194107
更新:
# ===============
# get user
# ===============
import requests
import json
# [BITBUCKET-BASE-URL], i.e.: https://bitbucket.org/
url = '[BITBUCKET-BASE-URL]/api/1.0/user/'
headers = {'Content-Type': 'application/json'}
# get user
# [USERNAME], i.e.: myuser
# [PASSWORD], i.e.: itspassword
r = requests.get(url, auth=('[USERNAME]', '[PASSWORD]'), headers=headers)
print(r.status_code)
print(r.text)
#print(r.content)
这是使用 Python 的请求模块进行基本 HTTP 身份验证的方法:
requests.post('https://api.bitbucket.org/1.0/user/repositories', auth=('user', 'pass'))
通过另一种方式,您通过请求的有效负载传递 user/pass,这是不需要的,因为 HTTP 基本身份验证在 HTTP 协议中有其自己的位置。
如果您想 "see" 您的请求背后发生了什么,我建议您使用 httpbin:
>>> url = "http://httpbin.org/post"
>>> r = requests.post(url, data="myscreename:mypassword")
>>> print r.text
{
"args": {},
"data": "myscreename:mypassword",
"files": {},
"form": {},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Content-Length": "22",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.5.1 CPython/2.7.6 Darwin/14.3.0"
},
"json": null,
"origin": "16.7.5.3",
"url": "http://httpbin.org/post"
}
>>> r = requests.post(url, auth=("myscreename", "mypassword"))
>>> print r.text
{
"args": {},
"data": "",
"files": {},
"form": {},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Authorization": "Basic bXlzY3JlZW5hbWU6bXlwYXNzd29yZA==",
"Content-Length": "0",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.5.1 CPython/2.7.6 Darwin/14.3.0"
},
"json": null,
"origin": "16.7.5.3",
"url": "http://httpbin.org/post"
}
并且卷曲:
curl -X POST --user myscreename:mypassword http://httpbin.org/post
{
"args": {},
"data": "",
"files": {},
"form": {},
"headers": {
"Accept": "*/*",
"Authorization": "Basic bXlzY3JlZW5hbWU6bXlwYXNzd29yZA==",
"Host": "httpbin.org",
"User-Agent": "curl/7.37.1"
},
"json": null,
"origin": "16.7.5.3",
"url": "http://httpbin.org/post"
}
请注意最后一个 python 示例与 cURL 示例之间的相似之处。
现在,正确设置 API 的格式是另一回事,请查看此 link:https://answers.atlassian.com/questions/94245/can-i-create-a-bitbucket-repository-using-rest-api
python 方式应该是这样的:
requests.post('https://api.bitbucket.org/1.0/repositories', auth=('user', 'pass'), data = "name=repo_name")
使用 python3,你可以使用 json={...} 而不是 data={...},它会自动将 header 设置为 application/json:
import requests
url = 'https://api.bitbucket.org/1.0/user/repositories'
data = {
'data1': 'asd',
'data2': 'asd'
}
req = requests.post(url, auth=('user', 'password'), json = data)
data = req.json()
# data['index']