ごめんなさい、ごめんなさい。半年ほったらかしにしていたSongWidgetのバグ修正版をリリースしました。(もっと放置してるwidgetもあるのは内緒)
http://makotokw.com/ja/portfolio/yahoowidget/songwidget
COMを同梱してwinamp対応とか考えてたんですが、影響がでかそうなので0.3.x系とtrunkに分岐して、とりあえず今起きてる不具合を修正して0.3.2としてリリースです。
でかい不具合としてAmazonのレスポンスが文字化けするという問題を修正しました。どうも、Yahoo Widget Engine側の修正の影響で発生するようになったようです。
結局、根本原因を調べるのはあきらめたんですが、調べてわかったことを書きます。
Yahoo! WidgetにおけるAWS(Amazon Web Service)文字化け問題
要因1:AWSにおいてResponseGroupをつけるとxml属性のencodingが省略される
http://webservices.amazon.co.jp/onca/xml?Service=AWSECommerceService&AWSAccessKeyId=0F49XFHPQYWX91XK4K82&Operation=ItemLookup&ItemId=B0000AKI8I&ResponseGroup=Large
ただし、HTTPのレスポンスヘッダには
Content-Type:text/xml;charset=UTF-8
が入ってる。
ResponseGroupがないと何故かencoding属性は返ってくる。
http://webservices.amazon.co.jp/onca/xml?Service=AWSECommerceService&AWSAccessKeyId=0F49XFHPQYWX91XK4K82&Operation=ItemLookup&ItemId=B0000AKI8I
&Versionで古いのを指定してもだめ。というかAmazonが突然仕様を返るとは考えにくい。
要因2:encodingが省略されるとXMLHttpRequestのresponseText/responseXMLが文字化けする
encodingが省略されるときにどの文字コードで処理しようとしてるのかはわからない。。。文字化けしたbyteコードを調べればわかったかもしれないが、どの文字コードで処理してるのではなくどうしたら文字化けしないのかばかり調べてたから。。。
要因3:SongWidetはレビューとかを取るためにReponseGroupを指定する
ResponseGroupを指定しなければencoding属性がついて結果として文字化けしないんだけど、SongWidgetではAmazonのレビューとかを取得するためにResponseGroupを省略するという選択肢がない。。。
最終的な対応
とりあえずforumになんかないかと思って調べてみたものの有用な情報は見つからなかった。こういう問題のときの英語圏のforumほど切ないものはないよ。。。
仕方がないので今度は日本のYahoo! WidgetでAmazon関連のwidgetを探してみたところ、文字化けを修正していた人がいたのでそれを参考にさせてもらった。
参考にしたWidget:
今日の新刊情報
# いぬさんありがとうございました!
結論から言うと、GETではなくPOSTを使い、リクエストをpostBodyに突っ込めばとencodingが返ってきて文字化けしない。
SongWidgetの場合、prototype.jsを経由しているの参考にならないが・・・対応コード
var ajax = new Ajax.Request(url, { method:'post', postBody: postBody, onComplete:this.onAjaxFetchContentComplete.bind(this), onFailure:this.onAjaxFetchContentFailure.bind(this), } );
タイミング的にはYWE(Yahoo Widget Engine) 4.5で挙動が変わったと考えるのが自然なんだけど・・・確かYahoo.comで4.5がリリースされたときに動作確認した気がするんだけど・・・(YWEはなんか知らないがいつも日本はUSからかなり遅れてリリースされる)、それは気のせいなのか、日本のYWEだけ起きるのか今となってはわからないし、もうどっちでもいい。それが分かったところでYWEを直せないからさー。