3

次のコードを使用してHTTPPOSTを実行するC#コンソールアプリ(.NET 2.0フレームワーク)があります。

StringBuilder postData = new StringBuilder(100);
postData.Append("post.php?");
postData.Append("Key1=");
postData.Append(val1);
postData.Append("&Key2=");
postData.Append(val2);

byte[] dataArray = Encoding.UTF8.GetBytes(postData.ToString());

HttpWebRequest httpRequest = (HttpWebRequest)WebRequest.Create("http://example.com/");
httpRequest.Method = "POST";
httpRequest.ContentType = "application/x-www-form-urlencoded";

httpRequest.ContentLength = dataArray.Length;
Stream requestStream = httpRequest.GetRequestStream();
requestStream.Write(dataArray, 0, dataArray.Length);
requestStream.Flush();
requestStream.Close();

HttpWebResponse webResponse = (HttpWebResponse)httpRequest.GetResponse();

if (httpRequest.HaveResponse == true) {
  Stream responseStream = webResponse.GetResponseStream();
  StreamReader responseReader = new System.IO.StreamReader(responseStream, Encoding.UTF8);
  String responseString = responseReader.ReadToEnd();
}

これからの出力は次のとおりです
。webResponse.ContentLength=
-1webResponse.ContentType = text
/htmlwebResponse.ContentEncodingは空白です

responseStringは、タイトルと本文を含むHTMLです。

ただし、同じURLをブラウザ(http://example.com/post.php?Key1=some_value&Key2=some_other_value)に投稿すると、次のような小さなXMLスニペットが表示されます。

<?xml version="1.0" ?>
<RESPONSE RESULT="SUCCESS"/>

アプリケーションと同じHTMLはありません。なぜ応答がそんなに違うのですか?HTMLで取得していない返された結果を解析する必要があります。アプリケーションでの投稿方法を変更する必要がありますか?投稿を受け入れるサーバー側のコードを制御できません。

4

7 に答える 7

9

実際にPOSTHTTP メソッドを使用することになっている場合は、いくつか問題があります。まず、この行:

postData.Append("post.php?");

間違っています。に投稿 post.phpたいのですが、「post.php?」という値を投稿したくありません。ページに。この行を完全に削除してください。

この作品:

... WebRequest.Create("http://example.com/");

それに追加する必要がpost.phpあるので...

... WebRequest.Create("http://example.com/post.php");

POST繰り返しますが、これは、実際には ingではなく、指定されたページに ing することになっていると想定していますGET。を使用することになっている場合はGET、既に提供されている他の回答が適用されます。

于 2009-02-13T02:32:58.137 に答える
3

Fiddlerのような HTTP スニファー ツールを入手して、アプリから送信されているヘッダーとブラウザーから送信されているヘッダーを比較する必要があります。サーバーが別の応答を返す原因となる別の何かがあります。ブラウザが送信しているものと同じものを送信するようにアプリを微調整すると、同じ応答が得られるはずです。(ユーザー エージェント、Cookie、その他何でもかまいませんが、何かが確実に異なります。)

于 2009-02-13T21:00:58.643 に答える
2

私は過去にこれを見たことがあります。

ブラウザから実行する場合、ヘッダーの「User-Agent」は「Mozilla ...」です。

プログラムから実行する場合、それは異なり、一般的に使用する言語に固有です。

于 2009-02-13T01:59:03.723 に答える
1

コードでは、データをWebアドレスに配置せずにデータをPHPファイルに送信するPOSTメソッドを指定します。情報をアドレスバーに配置すると、POSTメソッドではなく、GETメソッドになります。名前は紛らわしいかもしれませんが、GETは、データがバックグラウンドではなく、Webアドレスを介してPHPファイルに送信されていることを意味し、情報を取得することになっているわけではありません。ブラウザにアドレスを入力すると、GETが使用されます。

単純なhtmlフォームを作成し、メソッドとしてPOSTを指定し、アクションとしてURLを指定します。アドレスバーに表示されずに情報が送信されていることがわかります。

次に、同じことを行いますが、GETを指定します。送信した情報がアドレスバーに表示されます。

于 2009-02-13T01:53:12.350 に答える
1

POST の代わりに GET リクエストを使用する必要があると思います。使用している URL にクエリ文字列値 (?Key1=some_value&Key2=some_other_value など) がある場合は、GET が必要です。Web リクエストに投稿値を追加する代わりに、このデータをクエリ文字列に入れるだけです。

HttpWebRequest httpRequest = (HttpWebRequest)WebRequest.Create("http://example.com/?val1=" + val1 + "&val2=" + val2);
httpRequest.Method = "GET";
httpRequest.ContentType = "application/x-www-form-urlencoded";
....

そのため、アプリからデータを POST したときに得られる結果は異なります。これは、サーバー側のコードが、クエリ文字列で期待されているデータを読み取ることができない場合に異なる出力を持つためです。

于 2009-02-13T02:27:37.820 に答える
0

この問題は、WebRequestのヘッダーの設定方法に関係していると思います。

リクエストのヘッダーを変更してブラウザをシミュレートしようとすると、サーバーに違いが生じるという奇妙なケースを見てきました。

簡単に言うと、コンソールアプリケーションはWebブラウザーではなく、example.comのWebサーバーはブラウザーとの対話を期待しているということです。

ContentTypeを「multipart/form-data」に変更することも検討してください。

私が奇妙だと思うのは、あなたが本質的に何も投稿していないということです。作業はクエリ文字列によって実行されています。したがって、POSTではなくGETを使用する必要があります。

于 2009-02-13T01:51:31.323 に答える
0

フォームは Cookie を期待していますか? これが、コンソール アプリではなくブラウザーで機能するもう 1 つの理由です。

于 2009-02-13T02:58:44.033 に答える