J'essaie d'appuyer sur l'API Bitbucket pour mon compte, et une tentative réussie ressemble à:
curl --user screename:mypassword
https://api.bitbucket.org/1.0/user/repositories
dans la ligne de commande. En python, j'essaye:
import requests
url = 'https://api.bitbucket.org/1.0/user/repositories'
ensuite
r = requests.post(url, data={'username': myscreename, 'password':mypassword})
et
r = requests.post(url, data="myscreename:mypassword")
et
r = requests.post(url, data={"user": "myscreename:mypassword"})
tous obtiennent une erreur 405. L'API est https://confluence.atlassian.com/bitbucket/rest-apis-222724129.html .
Je me demande:
Que fais-je de mal dans la version des requêtes, elles ressemblent toutes à ma tentative de bouclage
Quelle est la différence entre demander avec curl et python module de requêtes? Quel modèle général puis-je reconnaître lors de la lecture d'une API avec un exemple curl et l'écriture en python?
Je vous remercie
RÉPONDRE:
il fallait les bons en-têtes
https://answers.atlassian.com/questions/18451025/answers/18451117?flashId=-982194107
MISE À JOUR:
# ===============
# 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)
Voici un moyen de faire l'authentification HTTP de base avec le module de requêtes de Python:
requests.post('https://api.bitbucket.org/1.0/user/repositories', auth=('user', 'pass'))
Avec l'autre façon, vous passez l'utilisateur/passez à travers la charge utile de la demande, ce qui n'est pas souhaité car l'authentification de base HTTP a sa propre place dans le protocole HTTP.
Si vous voulez "voir" ce qui se passe sous le capot avec votre demande, je vous recommande d'utiliser 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"
}
Et avec boucle:
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"
}
Remarquez la ressemblance entre le dernier exemple python et celui cURL.
Maintenant, obtenir le bon format d'API est une autre histoire, consultez ce lien: https://answers.atlassian.com/questions/94245/can-i-create-a-bitbucket-repository-using-rest- api
La méthode python devrait ressembler à ceci:
requests.post('https://api.bitbucket.org/1.0/repositories', auth=('user', 'pass'), data = "name=repo_name")