- PR -

webのrequestが取れていない?

投稿者投稿内容
untei
会議室デビュー日: 2008/11/11
投稿数: 4
投稿日時: 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を実行した時に
書き換わっている部分もあります。
よろしくお願い致します。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2008-11-11 01:37
引用:

unteiさんの書き込み (2008-11-11 01:08) より:
//localhost/test.htmlにはformでローカルのファイルをアップロード
するものになっています。test.htmlではファイルのアップロードは検証済みです。
(htmlでのpost先はサーブレットです。自前ではありません)
入力は、ローカルファイル場所とID、PASSです。


あまり直接の回答ではないかもしれませんが、どこまでできているのかを書かれたほうが良いと思います。たとえば、うかがって私が疑問に思ったのはつぎの点です。
・ファイルのアップロードではない POST ならば成功するのか?
・サーバー側に問題はないことは確かか?たとえばそのサーブレットに対して、ブラウザーで POST したら成功するのか?
・そのクライアントプログラムで、既存のアップロードを受けるサーバーに POST しても失敗するのか?

提示されたサンプルはファイルアップロードの POST ではないため、ContentType は "application/x-www-form-urlencoded" を使っていますが、ファイルアップロードの場合は "multipart/form-data" にする必要があります。そういった基礎的な点は大丈夫でしょうか?こういうやりとりを少なくするためにも、質問文に添えてソースコードも提示されるほうが良いと思います。
untei
会議室デビュー日: 2008/11/11
投稿数: 4
投稿日時: 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設定が必要なため、試していません。
todo
ぬし
会議室デビュー日: 2003/07/23
投稿数: 682
投稿日時: 2008-11-11 16:29
引用:

test.htmlは、ブラウザからのファイルのアップロード動作は検証済みです。



HTTPモニタツールで実際のPOSTデータを見てみるがいいでしょう。
おすすめは、横取り丸/InetSpyもしくはFiddlerです。

普通のPOSTとは書式が違いますので、multipart/form-dataについてお調べください。

C#のサンプル
http://www.codeproject.com/KB/cs/uploadfileex.aspx?msg=972854
untei
会議室デビュー日: 2008/11/11
投稿数: 4
投稿日時: 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 ]
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2008-11-13 11:54
引用:

unteiさんの書き込み (2008-11-11 23:53) より:
私がやりたいのは、最初ににも記載したリンク先や以下の「2008年8月12日 (火)
ニコニコ動画から検索結果を取得するプログラム」という部分と同じことです。
http://kotatuinu.cocolog-nifty.com/blog/cat3438394/index.html


余談ですが、記事を特定した URL だと、
http://kotatuinu.cocolog-nifty.com/blog/2008/08/post_a3f4.html
ですよね。
これはファイルアップロードがない場合ですよね?

引用:

unteiさんの書き込み (2008-11-11 23:53) より:
添付したソースではContentTypeを最初、application/x-www-form-urlencodedに
していました。ご指摘があって添付ソースのようにしましたが、それでもだめだと
いうことです。


todoさんがご紹介されたページ、
http://www.codeproject.com/KB/cs/uploadfileex.aspx?msg=972854
には、
引用:

webrequest.ContentType = "multipart/form-data; boundary=" + boundary;


のように boundary の指定や、その他、multipart/form-data のためのコードがありますが、それはされているのでしょうか?
HTML(HTTP)の仕様上、紛らわしいのですが、method="POST" であっても、ファイルアップロードがある(<input type="file"> がある)かないかで、クライアントからサーバーに送る内容がぜんぜん違ってきますが、この点は大丈夫でしょうか?
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2008-11-13 22:24
んと、
引用:

test.htmlと同じことをwindowsアプリでやりたいのではなくて、
test.htmlに対してwindowsアプリによってアクセスしたいということです。


というのが、よくわからんです。
この言葉では、test.html の input type=file に対して、何かしらの値を設定した後、POST を行いたいというように読み取れます。

しかし、jetrans.cs も、備忘ぶ録のコードも、そうではなく、test.html がするのと同じこと、というより、Internet Explorer がすることを実装しています。


 で、test.html に対して何らかの情報を送り込む方法ですが、type=file に対しては、IE コンポーネントでは Script の仕様として、送り込むことができません。ローカルのファイルについては、操作している人が UI によって指示する必要があります。
よって、test.html と同じことを Windows アプリケーションで実装する必要があります。
untei
会議室デビュー日: 2008/11/11
投稿数: 4
投稿日時: 2008-11-13 23:54
unibonさん、jittaさん、ご返答ありがとうございます。
IE コンポーネントに送り込むことが出来ないことが
わかりました。
すみません。

スキルアップ/キャリアアップ(JOB@IT)