42774
サーバーを提供している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'}`の意味は分かりませんがとりあえず実行したところ、以下のエラーが出ました。

> dict object has no attribute encode

`encode('utf-8')`を消してみると以下のエラーが出ます。

> Can't concat bytes to str

初心者なので何か基本的なことが間違えているかもしれないです。  
また、トークン発行した後どのような作業をして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'))
    
```
CC BY-SA 3.0
2018-03-30T04:49:55.183
42768
2018-03-30T06:03:03.807
2018-03-30T05:12:32.550
19110
question
python python3 api conoha
ConoHa APIでjsonデータをリクエスト
複数の問題点があります。

  * 参照先のサイトに従うのであれば、`json_str` は辞書ではなく文字列にすべきです。今回の場合、`json_str = '{"a":1}'` のようにシングルクオートで全体を囲えば良いです。
  * リクエスト先の URI が異なります。やりたいことに応じて、ConoHa のドキュメントに書いてある "Request URL" をご参照ください。また、[ドキュメント](https://www.conoha.jp/docs/identity-post_tokens.html)の以下にも注意してください。

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

  * 変数 `method` が、初期値を代入された後使われていません。今回は単に要らないです。

  * コピー・ペースト時の問題かもしれませんが、Python のプログラムはインデントに意味があります。それぞれの行の左側にある空白を消さないようにしてください。

また、単に API を叩くだけであれば、ご参照先のブログにも書いてあるように urllib.request ではなく
[Requests](http://docs.python-requests.org/en/master/)
を使った方が見通しが良いと思います。たとえば今回の場合、今行っているのが GET なのか POST なのかもコードから読み取りづらいですが、Requests
だとこれが改善されます。日本語だと Qiita
の[この記事](https://qiita.com/sqrtxx/items/49beaa3795925e7de666)の解説が分かりやすいと思います。
CC BY-SA 3.0
2018-03-30T05:25:37.190
42774
2018-03-30T06:03:03.807
2018-03-30T06:03:03.807
19110
19110
42768
answer