質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.03%

[conoha api]python3でjsonデータをリクエスト

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,045
退会済みユーザー

退会済みユーザー

サーバーを提供しているconohaでAPIを利用しようと試みておりますが躓いております。
やりたいことはAPIを利用したサーバーの追加です。調べたところ下の手順で作るものだと思われます。
1.トークン発行 https://www.conoha.jp/docs/identity-post_tokens.html
2. VM追加 https://www.conoha.jp/docs/compute-create_vm.html

はじめにトークンの発行ですがPOSTでJSONの送り方を調べ下記サイトを参考にして下のようなコードを書きました。
http://takuya-1st.hatenablog.jp/entry/2017/03/08/021706
headers={'Content-type':'application/json'}の意味は分かりませんがとりあえず実行したところ、
urllib.error http.Error 405 Not Allowedとエラーがでました。初心者なので何か基本的なことが間違えているかもしれないです。
また、トークン発行した後どのような作業をして2のVM追加に至るのか少しでいいので道筋を教えていただけると幸いです。

import requests
import urllib.parse
import urllib.request

url="https://identity.tyo1.conoha.io/v2.0"
method="POST"
headers={
'Content-type':'application/json'
}

json_str="""{"auth": {
"passwordcredentials": {
"username": "aaa",
"password": "bbb"
},
"tenantid": "ccc"
}
}"""

req = urllib.request.Request(url=url,headers=headers, data=json_str.encode('utf-8'))
f = urllib.request.urlopen(req)
print(f.read().decode('utf-8'))

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

このAPIを使った事はありませんが、トークン発行 - Identity API v2.0のページを見る限りでは、メソッドがGETではなくPOST、エンドポイントも違います。

※エンドポイントURLにつきましては、お客様環境によって異なりますので、コントロールパネルにてご確認の上ご利用ください。

以下はrequestsモジュールでjsonデータを送るサンプルコードです。

# -*- coding: utf8 -*-
import requests


def post_content(json_data: dict):
    # identity.tyo1.conoha.io ←送り先はここでいいのかコントロールパネルで確認してください。
    url = 'https://identity.tyo1.conoha.io/v2.0/tokens'
    return requests.post(url=url, json=json_data)


def main() -> None:
    json_data = {"auth": {
        "passwordCredentials": {
            "username": "aaa",
            "password": "bbb"
        },
        "tenantId": "ccc"
        }}
    res = post_content(json_data)
    # ※ステータスコードが200以外ならエラー処理を行うこと。
    print(res.status_code)
    print(res.json())


if __name__ == '__main__':
    main()

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/03/30 22:31

    requestsを用いる方法で第一段階のトークンの発行できました。ありがとうございます(≧▽≦)
    こちらのドキュメントにはrequest jsonではなくrequest parameterも載っていたので勉強のため
    parameterを使ってみたのですが400badrequestとなりました><よろしければ不適切な所ご指摘いただけないでしょうか。
    import requests
    import json

    def main() -> None:
    url = 'https://identity.tyo1.conoha.io/v2.0/tokens&#039;
    data={"username": "aaa", "password": "bbb","tenantId":"ccc"}
    res = requests.post(url=url, params=data)
    print(res.status_code)
    print(res.json())


    if __name__ == '__main__':
    main()

    キャンセル

  • 2018/03/30 22:37 編集

    >Anacondaaaさんへ
    こちらのドキュメントってどちらでしょ・・。
    この質問と回答にparamsオプション付きのドキュメントは一切存在しないのですが・・
    https://ja.stackoverflow.com/questions/42768
    マルチポストしてらっしゃるみたいなので、マルチポスト先の方に回答してもらってくださいな。

    キャンセル

  • 2018/03/30 23:11

    すみません。こちらのサイトのRequest Paramtersの所です。
    https://www.conoha.jp/docs/identity-post_tokens.html

    分かりました。そちらで質問します。

    キャンセル

+1

とりあえずひと目見てわかるのは、json_strがpythonの辞書型になっちゃってることなので、文字列にしてください。
全体を文字列としてクオートしないといけないので、

# 方法1
json_str = '{"auth": {"passwordcredentials": {"username": "aaa","password": "bbb"},"tenantid": "ccc"}}'

# 方法2
json_str= """{"auth": {
"passwordcredentials": {
"username": "aaa",
"password": "bbb"
},
"tenantid": "ccc"
}
}"""


このように書き換えてください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/03/30 14:09

    ありがとうございます。エラーの内容が変わりました;;;
    urllib.error http.Error 405 Not Allowed

    キャンセル

  • 2018/03/30 14:15

    405エラーはこういう意味なので、送り先を間違えていないかなどを確認してください。
    http://wa3.i-3-i.info/word15669.html

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.03%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る