小さな星がほらひとつ

読者です 読者をやめる 読者になる 読者になる

text=Error #2032: Stream Errorを解決

スポンサーリンク

記事を更新するあたりのプログラムで,保存ボタンを押すとError #2044: Unhandled ioError:. text=Error #2032: Stream Errorといったエラーが出てしまいました。

ioErrorなのでファイルのオープンとかに失敗した場合に出るっぽい。
今回これが出た場所はURLLoaderを使ってリクエストを送ろうとしたとき。

var request:URLRequest = new URLRequest();
request.method = 'PUT';
request.url = "http://192.168.2.104:3000/stickies/"+sticky.id+".xml";

var variables:URLVariables = new URLVariables();
variables['sticky[x]'] = sticky.window.x / Capabilities.screenResolutionX;
variables['sticky[y]'] = sticky.window.y / Capabilities.screenResolutionY;
variables['sticky[width]'] = sticky.window.width;
variables['sticky[height]'] = sticky.window.height;
variables['sticky[body]'] = sticky.editor.text;
request.data = variables;*/
request.data = data;
var loader:URLLoader = new URLLoader();
loader.load(request); // ここ


HTTPのステータスコードを取得してみます.HTTPStatusEventのイベントリスナーを追加します.

public function load():void {
...
   loader.addEventListener(HTTPStatusEvent.HTTP_STATUS, httpSt);
}

public function httpSt(evt:HTTPStatusEvent):void {
   message.text += "ERROR:" + evt.toString();
}

エラーの詳細は割愛しますが、大きく2つの原因があったようです。

  1. Content-Typeの未指定

これは読み込みとか、通常のリクエストでは問題なかったのですがload()メソッドではPUTで、〜.xmlに書き込みを行っています。
このためリクエスト情報保持しているURLRequestオブジェクトのcontentTypeプロパティに「text/xml」の指定が必要になるようです。

var request:URLRequest = new URLRequest();
request.method = 'PUT';
request.url = "http://192.168.2.104:3000/stickies/"+sticky.id+".xml";
  1. 値の設定方法

今回行いたいのは言うまでもなくXMLデータの送信。
チュートリアルでは,URLVariablesを使っていますがこれが良くなかったらしい.
URLVariables - Adobe ActionScript® 3 (AS3 ) API Reference

URLVariablesの使いどころはまだちょっとわかりませんが、XMLデータで送りなさいってことになるらしい。
ってことで、XMLクラスのオブジェクトを作ってセットします。
XML - Adobe ActionScript® 3 (AS3 ) API Reference

var data:XML = new XML("<sticky></sticky>");
var body:XML = new XML("<body></body>");
body.appendChild(sticky.editor.text);
data.appendChild(body);
var height:XML = new XML("<height></height>");
height.appendChild(sticky.window.height);
data.appendChild(height);
var width:XML = new XML("<width></width>");
width.appendChild(sticky.window.width);
data.appendChild(width);
var x:XML = new XML("<x></x>");
x.appendChild(sticky.window.x / Capabilities.screenResolutionX);
data.appendChild(x);
var y:XML = new XML("<y></y>");
y.appendChild(sticky.window.y / Capabilities.screenResolutionY);
data.appendChild(y);

XMLクラスの使い方等参考にしました.(というか丸写し)
RoRとFlex(XMLデータの取り扱い): はやまらむてならひ