2015-06-25 12 views
12

Sto cercando di colpire l'API Bitbucket per il mio account, e un tentativo riuscito assomiglia a:riccio vs Python "richieste" quando colpisce API

curl --user screename:mypasswordhttps://api.bitbucket.org/1.0/user/repositories

nella riga di comando. In Python, cerco:

import requests 
s = requests.session() 
url = 'https://api.bitbucket.org/1.0/user/repositories' 

poi

r = requests.post(url, data={'username': myscreename, 'password':mypassword}) 

e

r = requests.post(url, data="myscreename:mypassword") 

e

r = requests.post(url, data={"user": "myscreename:mypassword"}) 

tutti ottengono 405 errore. L'API è https://confluence.atlassian.com/display/BITBUCKET/Use+the+Bitbucket+REST+APIs

Mi chiedo:

  1. Che cosa sto facendo di sbagliato nella versione richieste, sembrano tutti simili al mio tentativo ricciolo

  2. Qual è la differenza tra la richiesta con l'arricciatura e python richiede il modulo? Quale modello generale posso riconoscere quando leggo una API con un esempio di arricciatura e poi la scrivo in python?

Grazie

RISPOSTA:

ha richiesto le intestazioni giusti

https://answers.atlassian.com/questions/18451025/answers/18451117?flashId=-982194107

UPDATE:

# =============== 
# 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) 
+1

'--user' a ricciolo usa HTTP auth intestazioni. La tua soluzione 'data = {" username "...' li include come dati post. I due non sono la stessa cosa, ed è improbabile che Bitbucket cerchi quelli nei dati del post. –

risposta

11

H ere è un modo per fare autenticazione HTTP di base con modulo richieste di Python:

requests.post('https://api.bitbucket.org/1.0/user/repositories', auth=('user', 'pass')) 

Con l'altro modo si sta passando l'utente/passano attraverso payload della richiesta, che non è desiderato in quanto autenticazione base di HTTP ha il proprio posto in il protocollo HTTP.

Se si desidera "vedere" cosa sta succedendo sotto il cofano con la vostra richiesta vi consiglio di usare 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" 
} 

E con l'arricciatura:

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" 
} 

Avviso la somiglianza tra l'ultimo esempio di pitone e il cURL.

Ora, sempre a destra il formato del API è un'altra storia, controlla questo link: https://answers.atlassian.com/questions/94245/can-i-create-a-bitbucket-repository-using-rest-api

Il modo pitone dovrebbe essere qualcosa di simile:

requests.post('https://api.bitbucket.org/1.0/repositories', auth=('user', 'pass'), data = "name=repo_name") 
+0

Mi piace quel sito httpbin, ma ho modificato la domanda per mostrare i miei tentativi recenti, non hanno funzionato – codyc4321

+0

Ho ottenuto 405 anche per quello – codyc4321

+1

@ codyc4321 Questo è fuori dallo scopo di questa domanda, poiché non è curl/python correlati – jlhonora