curl vs python "запросы" при нажатии API

Я пытаюсь попасть в Bitbucket API для своей учетной записи, и успешная попытка выглядит так:

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

в командной строке. В python я пытаюсь:

import requests
s = requests.session()
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/display/BITBUCKET/Use+the+Bitbucket+REST+APIs

I чудо:

  1. что я делаю неправильно в версии запросов, все они похожи на мою попытку завитка

  2. в чем разница между запросом с помощью curl и модулем запросов python? Какой общий шаблон я могу распознать при чтении API с примером curl, а затем писать его на python?

спасибо

ответ:

требуются права заголовки

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)

1 ответов


вот способ сделать базовую http-аутентификацию с модулем запросов Python:

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

С другой стороны, вы передаете пользователю / проходите через полезную нагрузку запроса, что нежелательно, так как HTTP basic auth имеет свое место в протоколе HTTP.

если вы хотите "увидеть", что происходит под капотом с вашим запросом, я рекомендую использовать 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:

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 пример и завиток один.

теперь, получив право на формат API-это еще одна история, проверьте эту ссылку: 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")