23

自分のアカウントで Bitbucket API をヒットしようとしていますが、成功した場合は次のようになります。

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

コマンドラインで。pythonでは、私は試します:

import requests
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/bitbucket/rest-apis-222724129.htmlです。

私は疑問に思う:

  1. リクエストバージョンで何が間違っているのですか。それらはすべて私のカール試行に似ています

  2. curl と python requests モジュールでのリクエストの違いは何ですか? curl の例で API を読み取り、それを 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)
4

2 に答える 2

23

Python の requests モジュールを使用して基本的な HTTP 認証を行う方法は次のとおりです。

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

もう一方の方法では、ユーザーを渡したり、リクエストのペイロードを通過したりしますが、HTTP 基本認証は 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 -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 の例と cURL の例が似ていることに注意してください。

さて、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")
于 2015-06-25T21:46:06.783 に答える
0

Python3 では、data={...} の代わりに json={...} を使用でき、ヘッダーが自動的に application/json に設定されます。

import requests
url = 'https://api.bitbucket.org/1.0/user/repositories'

data = {
    'data1': 'asd',
    'data2': 'asd'
}
req = requests.post(url, auth=('user', 'password'), json = data)
data = req.json()
# data['index']
于 2020-02-28T19:05:35.633 に答える