2015-06-25 16 views
12

próbuję trafić API Bitbucket na moim koncie i udana próba wygląda następująco:curl vs python „żądań” po uderzeniu API

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

w wierszu poleceń. W Pythonie, staram:

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

następnie

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

i

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

i

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

wszystko dostać 405 błędu. API jest https://confluence.atlassian.com/display/BITBUCKET/Use+the+Bitbucket+REST+APIs

zastanawiam:

  1. Co robię źle w wersji wnioski, wszystkie wyglądają podobnie do mojego curl próbie

  2. Jaka jest różnica między wnioskiem z dyni i moduł zapytań Pythona? Jaki ogólny wzór mogę rozpoznać, czytając API z przykręconym przykładem, a następnie zapisując go w pythonie?

Dziękuję

odpowiedź:

to wymagane odpowiednie nagłówki

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' w zwinięcie używa uwierzytelniania HTTP nagłówki. Twoje rozwiązanie 'data = {" username "...' uwzględnia je jako dane post. Te dwie rzeczy to nie to samo i jest mało prawdopodobne, że Bitbucket szuka tych w danych postów. –

Odpowiedz

11

H ere to sposób zrobić podstawowe uwierzytelniania HTTP z Pythona modułu życzenia:

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

z innymi sposób jesteś przechodzącej użytkownikowi/przechodzą przez ładowności wniosek, który nie jest pożądany, ponieważ HTTP basic auth ma swoje miejsce w protokół HTTP.

Jeśli chcesz „zobaczyć” co się dzieje pod maską z żądania Polecam używanie 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" 
} 

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

zauważy podobieństwo między ostatnim przykładzie Pythona i cURL jeden.

Teraz coraz prawo Format API jest inna historia, sprawdź ten link: https://answers.atlassian.com/questions/94245/can-i-create-a-bitbucket-repository-using-rest-api

Sposób pyton powinno być coś takiego:

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

Podoba mi się strona httpbin, ale edytowałem pytanie, aby pokazać moje ostatnie próby, nie działały – codyc4321

+0

Mam 405 również za to – codyc4321

+1

@ codyc4321 To jest poza zakresem tego pytania, ponieważ nie jest zwijane/python związane – jlhonora