- - PR -
webのrequestが取れていない?
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2008-11-11 01:08
初めまして。unteiと申します。
webのrequest?が取れなくて悩んでいます。 以下のページのjetrans.csを参考にしています。 http://www.atmarkit.co.jp/fdotnet/dotnettips/318webpost/webpost.html 開発はVS2008、言語はC++/CLIになります。(これは変更出来ません) ローカルPCにTOMCAT6をいれて実験しています。 //localhost/test.htmlにはformでローカルのファイルをアップロード するものになっています。test.htmlではファイルのアップロードは検証済みです。 (htmlでのpost先はサーブレットです。自前ではありません) 入力は、ローカルファイル場所とID、PASSです。 それをjetrans.csを参考にプログラムにてPOSTメソッドによりデータを送信 するFormを作りました。 ですが、writeが出来ず、確認してみた限りではどうも Stream resStream = res.GetResponseStream(); でresStreamのContentLengthにNotSupportedExceptionエラーが でていて正常にStreamがとれていないと思うのですが、さっぱりです。 apacheならばerror.logでin/out情報が取れるのですが、tomcatでは どう取得していいのかわかりません。 今、自宅なので定かではない部分ですが、もう一ヶ所、NotSupportedExceptionエラー が出ていたと思います。 ただ、HttpWebRequestのreqを見るとGetResponseStreamを実行した時に 書き換わっている部分もあります。 よろしくお願い致します。 | ||||||||||||
|
投稿日時: 2008-11-11 01:37
あまり直接の回答ではないかもしれませんが、どこまでできているのかを書かれたほうが良いと思います。たとえば、うかがって私が疑問に思ったのはつぎの点です。 ・ファイルのアップロードではない POST ならば成功するのか? ・サーバー側に問題はないことは確かか?たとえばそのサーブレットに対して、ブラウザーで POST したら成功するのか? ・そのクライアントプログラムで、既存のアップロードを受けるサーバーに POST しても失敗するのか? 提示されたサンプルはファイルアップロードの POST ではないため、ContentType は "application/x-www-form-urlencoded" を使っていますが、ファイルアップロードの場合は "multipart/form-data" にする必要があります。そういった基礎的な点は大丈夫でしょうか?こういうやりとりを少なくするためにも、質問文に添えてソースコードも提示されるほうが良いと思います。 | ||||||||||||
|
投稿日時: 2008-11-11 11:15
unibonさん、ご回答ありがとう御座います。
ソースです。 try { String^ param = ""; HttpWebRequest^ req = nullptr; //WebRequestの作成 //urlはhttp://127.0.0.1:8080/test.html req = (HttpWebRequest^)( WebRequest::Create( url ) ); //メソッドにPOSTを指定 req->Method = "POST"; //ContentTypeを設定 req->ContentType = "multipart/form-data"; //文字コードを指定する Encoding^ enc = Encoding::GetEncoding("UTF-8"); //送信するフォームデータ作成 // ポスト・データの作成 Hashtable^ ht = gcnew Hashtable(); ht["uid"] = id; ht["pwd"] = pass; ht["tfn"] = file; //ローカルファイルの場所:ドライブ直下に配置 for each (String^ k in ht->Keys) { param += String::Format("{0}={1}&", k, ht[k]); } array<Byte>^ data = enc->GetBytes(param); //length req->ContentLength = data->Length; // ポスト・データの書き込み Stream^ reqStream = req->GetRequestStream(); reqStream->Write(data, 0, data->Length); reqStream->Close(); } catch( Exception^ e ) { MessageBox::Show(なにか出す); } test.htmlは、ブラウザからのファイルのアップロード動作は検証済みです。 >>・ファイルのアップロードではない POST ならば成功するのか? まだ、試していません。 >>・そのクライアントプログラムで、既存のアップロードを受けるサーバーに POST しても失敗するのか? tomcat、servlet設定が必要なため、試していません。 | ||||||||||||
|
投稿日時: 2008-11-11 16:29
HTTPモニタツールで実際のPOSTデータを見てみるがいいでしょう。 おすすめは、横取り丸/InetSpyもしくはFiddlerです。 普通のPOSTとは書式が違いますので、multipart/form-dataについてお調べください。 C#のサンプル http://www.codeproject.com/KB/cs/uploadfileex.aspx?msg=972854 | ||||||||||||
|
投稿日時: 2008-11-11 23:53
ご返答ありがとうございます。
>todoさん すでにfirefoxのアドオン、RESTTestにて確認しております。 私の求めている回答とちょっと違うと思いまして再度、質問事項を要約致します。 私がやりたいのは、最初ににも記載したリンク先や以下の「2008年8月12日 (火) ニコニコ動画から検索結果を取得するプログラム」という部分と同じことです。 http://kotatuinu.cocolog-nifty.com/blog/cat3438394/index.html test.htmlと同じことをwindowsアプリでやりたいのではなくて、 test.htmlに対してwindowsアプリによってアクセスしたいということです。 上記のようにボタンを押すとtest.htmlで指定したinputのname、value情報を 送りたいということです。 それで同じようなやり方をしていてエラーが出ていることに対して質問させて頂きました。 添付したソースではContentTypeを最初、application/x-www-form-urlencodedに していました。ご指摘があって添付ソースのようにしましたが、それでもだめだと いうことです。 よろしくお願い致します。 [ メッセージ編集済み 編集者: untei 編集日時 2008-11-11 23:56 ] | ||||||||||||
|
投稿日時: 2008-11-13 11:54
余談ですが、記事を特定した URL だと、 http://kotatuinu.cocolog-nifty.com/blog/2008/08/post_a3f4.html ですよね。 これはファイルアップロードがない場合ですよね?
todoさんがご紹介されたページ、 http://www.codeproject.com/KB/cs/uploadfileex.aspx?msg=972854 には、
のように boundary の指定や、その他、multipart/form-data のためのコードがありますが、それはされているのでしょうか? HTML(HTTP)の仕様上、紛らわしいのですが、method="POST" であっても、ファイルアップロードがある(<input type="file"> がある)かないかで、クライアントからサーバーに送る内容がぜんぜん違ってきますが、この点は大丈夫でしょうか? | ||||||||||||
|
投稿日時: 2008-11-13 22:24
んと、
というのが、よくわからんです。 この言葉では、test.html の input type=file に対して、何かしらの値を設定した後、POST を行いたいというように読み取れます。 しかし、jetrans.cs も、備忘ぶ録のコードも、そうではなく、test.html がするのと同じこと、というより、Internet Explorer がすることを実装しています。 で、test.html に対して何らかの情報を送り込む方法ですが、type=file に対しては、IE コンポーネントでは Script の仕様として、送り込むことができません。ローカルのファイルについては、操作している人が UI によって指示する必要があります。 よって、test.html と同じことを Windows アプリケーションで実装する必要があります。 | ||||||||||||
|
投稿日時: 2008-11-13 23:54
unibonさん、jittaさん、ご返答ありがとうございます。
IE コンポーネントに送り込むことが出来ないことが わかりました。 すみません。 |