2010-12-20 21 views
4

私は練習として構築している小さなレセレットサービスに奇妙な問題があります。アプリケーションは、HTTP POSTでいくつかのXML(specifically TwiML、Twilioのためのものです)で応答するはずです。スタンドアロン要求に対してはうまくいきました。しかし、Twilioが要求すると、応答は完了せずタイムアウトします。 Twilioから来たトラフィックを(偽のHTMLフォームを使って)動作しているものと比較した後、私はこの問題を「Connection:close」ヘッダーに分離し、curlコマンドラインを使用して問題を再現することができました。ここで働く要求されます。HTTP接続でエラーが発生しました:閉じるヘッダー

curl -i -H 'Connection: keep-alive' -X POST -d "name=value" http://localhost:8020/hello 

、ここでは単にハングいずれかです。

curl -i -H 'Connection: close' -X POST -d "name=value" http://localhost:8020/hello 

を私がカールし、サーバーを殺す場合は、「サーバーから(52)空の応答を」と言います。ここでは、私がServerResourceで使用しているコードを示します。

@Post 
public Representation hello(Representation repr) 
{ 
    Representation result = new StringRepresentation(("<Response>\n"+ 
      " <Say>Hello. This is a test.</Say>\n"+ 
      "</Response>"), MediaType.APPLICATION_XML); 
    return result; 
} 

私がここで何をしているのか明らかに間違っていますか?私はrestlet-2.0を使用していますが、2.1m1でも同じ結果を試しました。私は演習を終えるために締め切りを迎えているので、すばやい回答に本当に感謝しています。

答えて

4

あなたのエラーの解決策が見つかったのかどうかはわかりませんが、Restlet V 2.0.4では同じ問題が発生しました。

デフォルトサーバーを使用してレセルレットを実行しているとき。ここでは、サーバーは応答ストリームが書き込み可能ではないと仮定しているため、エンティティで応答しません。私は

org.restlet.engine.http.connector.Connection 

に位置し、それが良好であれば、元の

public boolean canWrite() { 
    return (getState() == ConnectionState.OPEN) && !isOutboundBusy() 
      && (getOutboundMessages().size() > 0); 
} 

わからないから

public boolean canWrite() { 
    return (
      (getState() == ConnectionState.OPEN) 
        || (getState() == ConnectionState.CLOSING)) 
      && !isOutboundBusy() 
      && (getOutboundMessages().size() > 0); 
} 

にcanWrite()メソッドを変更クイックフィックスとして

修正しましたが、Restletモジュールを再コンパイルした後、正常に動作しているようです。 HTTPヘッダー 'Connection:close'を指定するとき、ストリームはデフォルトでクローズ状態になっていることが問題になっているようです。

アプリケーションやコンポーネントを作成するよりも

http://restlet.tigris.org/ds/viewMessage.do?dsForumId=4447&dsMessageId=2698048

+0

共有いただきありがとうございます。これは、Restletが "Connection:close"ヘッダ(重大なバグになるでしょう)を持つ接続でうまく動作しなかったことを意味しますか? – haridsv

+0

これは、restletにバンドルされている標準のrestletサーバーの人為的なようです。私はあなたが別のコンテナ(例えば、桟橋)内にあなたのレストレットを配備すれば、この問題にはならないと思います。しかし同意して、それは間違いなくバグです。 – Joey

+0

これは現在公式のバグです。http://restlet.tigris.org/issues/show_bug.cgi?id=1191 – Joey

0

ない、これはそれがあるが、ここで考慮すべき何かを確認してください。

のRestletは非常に慎重かつ正確にRESTアーキテクチャ・スタイルを実装しています。それが実装する主要なRESTの原則の1つは、統一されたインタフェースです。 HTTPベースのWebサービスでは、統一されたインターフェイスは、HTTP GET、PUT、POST、DELETE(およびその他の)操作を元々意図したとおりに活用します。したがって、リソース名を割り当てるときにサーバー上にリソースを作成するには、PUTを使用します。そのリソースを更新するには、再度PUTを使用します。それを読むには、GETを使用します。それを削除するには、DELETEを使います。 POSTはサーバがリソース名を割り当てるときにリソースを作成するために予約されています。

これは、何とかして期待の不一致が原因である可能性があります。 POSTには通常、サーバーに送信する表現がありますが、このPOSTでは表示されません。あなたは完全な要求を読んで、サーバー側で接続を適切に閉じていますか?

+0

その他のRestletフォーラムに問題は、ここを参照してください

ジョーイを助け

希望は、私は、特に何もしません私はrestletがそれを世話することを期待しました。表現に関して、私はそれがどのように機能するかはっきりしておらず、直接的な文書を見つけるのが難しかった(私は認めている、私は今急いでいる)が、表現を何も送っていないので、特別?フォームのパラメータを読んでいないと、何らかの形でrestletが待ち状態になるのを確認します。私はスタックダンプをチェックしました。スタックのどれもがrestletコードを指していませんでした。 – haridsv

関連する問題