Symfoware

Symfowareについての考察blog

Python urllib2で、サーバーエラー時のレスポンスボディを取得する

なんと書けば良いのか微妙なのですが、こういうことです。


  1. try:
  2.     response = urllib2.urlopen(request)
  3.     print 'Response:', response.read()
  4. except urllib2.HTTPError, e:
  5.     #ここでどんなエラーだったか応答を確認したい




具体的には、RedmineのREST APIを触っているときに、
自分の書いたプログラムがまずくてサーバーからエラーが帰ってくるのですが、


  1. # 登録実行
  2. try:
  3.     response = urllib2.urlopen(request)
  4.     ret = response.read()
  5.     print 'Response:', ret
  6. except urllib2.HTTPError, e:
  7.     print(e.code)
  8.     print(e.reason)



実行すると


422 Unprocessable Entity




具体的に何がまずいのか、エラー時もレスポンスのbodyを見たい。


こちらを見て、あっさり解決しました。
Overriding urllib2 HTTPError and reading response HTML anyway

urllib2.HTTPErrorをreadすればOK。


  1. # 登録実行
  2. try:
  3.     response = urllib2.urlopen(request)
  4.     ret = response.read()
  5.     print 'Response:', ret
  6. except urllib2.HTTPError, e:
  7.     print(e.code)
  8.     print(e.reason)
  9.     
  10.     # エラーレスポンスを取得
  11.     print(e.read())




実行すると、レスポンスにはjsonな文字列が入っているようです。


422
Unprocessable Entity
{"errors":["\u984c\u540d \u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002"]}




ソースの全体像はこちら。


  1. # -*- coding:utf-8 -*-
  2. import urllib2
  3. import json
  4. # 個人設定画面に表示されているAPIキー
  5. api_key = 'ea87faaba9549b5fdbea7655bf7de323cd6c118e'
  6. # 登録用のデータ
  7. issue = {}
  8. issue[u'project_id'] = u'test_project'
  9. issue[u'tracker_id'] = 3
  10. #issue[u'subject'] = u'JSONからの自動登録テスト'
  11. issue[u'description'] = u'JSONから登録してみます。'
  12. data = {}
  13. data[u'issue'] = issue
  14. # JSON形式の文字列を取得
  15. jsonstr = json.dumps(data)
  16. # APIのURL
  17. # 今回、RedmineのURLはhttp://192.168.1.102/redmine/
  18. # サブディレクトリで公開している
  19. # jsonの場合は、拡張子に「json」を指定
  20. url = 'http://192.168.1.102/redmine/issues.json'
  21. # Content-Type:application/json
  22. # X-Redmine-API-Key:[APIキー]
  23. # method:post
  24. request = urllib2.Request(url, data=jsonstr)
  25. request.add_header('Content-Type', 'application/json')
  26. request.add_header('X-Redmine-API-Key', api_key)
  27. request.get_method = lambda: 'POST'
  28. # 登録実行
  29. try:
  30.     response = urllib2.urlopen(request)
  31.     ret = response.read()
  32.     print 'Response:', ret
  33. except urllib2.HTTPError, e:
  34.     print(e.code)
  35.     print(e.reason)
  36.     
  37.     # エラーレスポンスを取得
  38.     d = json.loads(e.read())
  39.     for msg in d[u'errors']:
  40.         print msg



あえて、必須項目のタイトルの設定をコメントしています。
実行してみると、こんなエラーが表示されます。


題名 を入力してください。



これでデバッグがやりやすくなりました。
ちなみに、xml形式でpostしていると返されるエラーメッセージもxml形式です。
関連記事

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

  1. 2014/03/09(日) 17:28:16|
  2. Python
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<Ubuntu + Eclipseで医見書のソースを取得する | ホーム | PythonからREST API経由でRedmineにコメントを登録する(XML,JSON使用)>>

コメント

コメントの投稿


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

トラックバック

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