Symfoware

Symfowareについての考察blog

PythonからREST API経由でRedmineに添付ファイルを登録する(XML,JSON使用)

RedmineのREST APIを使ってみました。
PythonからREST API経由でRedmineにチケットを登録する(XML,JSON使用)

添付ファイル付きのチケット登録をやってみます。



XML形式で添付ファイル登録



添付ファイル付きチケットの登録は2段階に分けて行います。

まず、添付したいファイルを先にアップロード。
アップロードに成功すると、レスポンスにトークンが含まれています。


  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <upload>
  3.     <token>1.08accfff44270ed3d5557d4d425e93e0</token>
  4. </upload>




次にチケットを登録。
この時、添付ファイルとして画像アップロードによって得られたトークンを指定します。

具体的な例はこんな感じになります。


  1. # -*- coding:utf-8 -*-
  2. import urllib2
  3. import xml.etree.ElementTree
  4. # 個人設定画面に表示されているAPIキー
  5. api_key = 'ea87faaba9549b5fdbea7655bf7de323cd6c118e'
  6. # まず、添付ファイルのアップロードを実行
  7. f = open('Lenna.jpg', 'rb')
  8. img = f.read()
  9. f.close()
  10. url = 'http://192.168.1.102/redmine/uploads.xml'
  11. request = urllib2.Request(url, data=img)
  12. request.add_header('Content-Type', 'application/octet-stream')
  13. request.add_header('X-Redmine-API-Key', api_key)
  14. request.get_method = lambda: 'POST'
  15. # 画像のアップロード実行
  16. response = urllib2.urlopen(request)
  17. ret = response.read()
  18. print(ret)
  19. # 結果を解析し、tokenを取得
  20. doc = xml.etree.ElementTree.fromstring(ret)
  21. token = doc.findtext('token')
  22. print(token)
  23. # チケット登録用のデータ
  24. # アップロードで取得したtokenはここで指定する
  25. xml = """<?xml version="1.0"?>
  26. <issue>
  27. <project_id>test_project</project_id>
  28. <subject>自動登録テスト</subject>
  29. <description>チケットの詳細です</description>
  30. <tracker_id>2</tracker_id>
  31. <uploads type="array">
  32.     <upload>
  33.      <token>%s</token>
  34.      <filename>Lenna.jpg</filename>
  35.      <description>添付テスト</description>
  36.      <content_type>image/jpg</content_type>
  37.     </upload>
  38. </uploads>
  39. </issue>""" % token
  40. # APIのURL
  41. # 今回、RedmineのURLはhttp://192.168.1.102/redmine/
  42. # サブディレクトリで公開している
  43. url = 'http://192.168.1.102/redmine/issues.xml'
  44. # Content-Type:text/xml
  45. # X-Redmine-API-Key:[APIキー]
  46. # method:post
  47. request = urllib2.Request(url, data=xml)
  48. request.add_header('Content-Type', 'text/xml')
  49. request.add_header('X-Redmine-API-Key', api_key)
  50. request.get_method = lambda: 'POST'
  51. # 登録実行
  52. response = urllib2.urlopen(request)
  53. ret = response.read()
  54. print 'Response:', ret




ちゃんと添付ファイルが設定されました。

359_01.png






JSON形式で添付ファイル登録



同様のことをJSON形式でも行なってみます。
JSONの場合、ファイルアップロード後のレスポンスはこんな感じになります。


{"upload":{"token":"3.08accfff44270ed3d5557d4d425e93e0"}}




サンプルは以下のようになりました。


  1. # -*- coding:utf-8 -*-
  2. import urllib2
  3. import json
  4. # 個人設定画面に表示されているAPIキー
  5. api_key = 'ea87faaba9549b5fdbea7655bf7de323cd6c118e'
  6. # まず、添付ファイルのアップロードを実行
  7. f = open('Lenna.jpg', 'rb')
  8. img = f.read()
  9. f.close()
  10. url = 'http://192.168.1.102/redmine/uploads.json'
  11. request = urllib2.Request(url, data=img)
  12. request.add_header('Content-Type', 'application/octet-stream')
  13. request.add_header('X-Redmine-API-Key', api_key)
  14. request.get_method = lambda: 'POST'
  15. response = urllib2.urlopen(request)
  16. ret = response.read()
  17. # レスポンスからtokenを取得
  18. retjson = json.loads(ret)
  19. token = retjson[u'upload'][u'token']
  20. print(token)
  21. # 登録用のデータ
  22. issue = {}
  23. issue[u'project_id'] = u'test_project'
  24. issue[u'tracker_id'] = 3
  25. issue[u'subject'] = u'JSONからの自動登録テスト'
  26. issue[u'description'] = u'JSONから登録してみます。'
  27. imgdata = {}
  28. imgdata[u'token'] = token
  29. imgdata[u'filename'] = u'Lenna.jpg'
  30. imgdata[u'description'] = u'添付ファイルサンプル'
  31. imgdata[u'content_type'] = u'image/jpg'
  32. issue[u'uploads'] = [imgdata]
  33. data = {}
  34. data[u'issue'] = issue
  35. # JSON形式の文字列を取得
  36. jsonstr = json.dumps(data)
  37. # APIのURL
  38. # 今回、RedmineのURLはhttp://192.168.1.102/redmine/
  39. # サブディレクトリで公開している
  40. # jsonの場合は、拡張子に「json」を指定
  41. url = 'http://192.168.1.102/redmine/issues.json'
  42. # Content-Type:application/json
  43. # X-Redmine-API-Key:[APIキー]
  44. # method:post
  45. request = urllib2.Request(url, data=jsonstr)
  46. request.add_header('Content-Type', 'application/json')
  47. request.add_header('X-Redmine-API-Key', api_key)
  48. request.get_method = lambda: 'POST'
  49. # 登録実行
  50. response = urllib2.urlopen(request)
  51. ret = response.read()
  52. print 'Response:', ret




JSONからもちゃんと登録出来ました。
xmlの時と違い、「uploads」の中に「upload」を定義しなくて良いことに気が付かず、
地味に苦労しました。

359_02.png
関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2014/03/09(日) 16:07:48|
  2. Python
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<PythonからREST API経由でRedmineにコメントを登録する(XML,JSON使用) | ホーム | PythonからREST API経由でRedmineにチケットを登録する(XML,JSON使用)>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/1322-de0c5a3f
この記事にトラックバックする(FC2ブログユーザー)