2015-06-25 9 views
12

Ich versuche, die Bitbucket API für mein Konto zu schlagen, und ein erfolgreicher Versuch wie folgt aussieht:curl vs Python "Anfragen", wenn APIs schlagen

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

in der Kommandozeile. In Python, ich versuche:

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

dann

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

und

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

und

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

alle 405 Fehler. Die API ist https://confluence.atlassian.com/display/BITBUCKET/Use+the+Bitbucket+REST+APIs

Ich frage mich:

  1. Was bin ich in der Anfragen-Version falsch zu machen, sie alle ähnlich aussehen wie meine curl Versuch

  2. Was ist der Unterschied mit curl zwischen Anforderung und Python Anfragen Modul? Welches generelle Muster kann ich beim Lesen einer API mit einem Curl-Beispiel erkennen und dann in Python schreiben?

Danke

ANTWORT:

es die richtigen Header erforderlich

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' in curl verwendet HTTP Auth Kopfzeilen. Ihre 'data = {" username "...' Lösung enthält sie als Post-Daten. Die beiden sind nicht dasselbe und es ist unwahrscheinlich, dass Bitbucket nach den Post-Daten sucht. –

Antwort

11

H ere ist ein Weg, grundlegenden HTTP Auth mit Python-Anfragen Modul zu tun:

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

Mit der anderen Art und Weise sind Sie den Benutzer vorbei/Durchlauf durch die Nutzlast Wunsch, das da nicht erwünscht ist, HTTP-Basis Auth seinen eigenen Platz hat in das HTTP-Protokoll.

Wenn Sie möchten, zu „sehen“, was mit Ihrer Anfrage unter der Haube passiert Ich empfehle, mit 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" 
} 

Und mit Curl:

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

Beachten Sie die Ähnlichkeit zwischen dem letzten Python-Beispiel und die CURL.

nun immer das Recht des API-Format eine andere Geschichte ist, auf diesen Link finden Sie unter: https://answers.atlassian.com/questions/94245/can-i-create-a-bitbucket-repository-using-rest-api

Die Python Weise so etwas wie dies sein sollte:

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

Ich mag diese httpbin Website, aber ich habe die Frage bearbeitet, um meine jüngsten Versuche zu zeigen, sie haben nicht funktioniert – codyc4321

+0

Ich habe 405 dafür auch – codyc4321

+1

@ codyc4321 Das ist außerhalb des Umfangs dieser Frage, da es nicht curl/python – jlhonora