3

私は現在、Windowsフォームを介したインターネットインタラクションのスキルを向上させるためにいくつかのテストを書いています。それらのテストの1つは、CanadaPostWebサイトから返される郵便番号を見つけることです。

  1. 私のデフォルトのURL設定は次のように設定されています:http://www.canadapost.ca/cpotools/apps/fpc/personal/findByCity?execution = e4s1
  2. 必須のフォームフィールドは次のとおりです。streetNumberstreetNamecityprovince
  3. contentTypeは「application/x-www-form-enclosed」です

編集: contentTypeとして、ポイント3の値ではなく「application/x-www-form-encoded」の値を考慮してください。(EricLaw-MSFTに感謝します!)

私が得た結果は期待された結果ではありません。郵便番号を見つけるための情報を手動で入力できるページのHTMLソースコードを取得しましたが、見つかった郵便番号を含むHTMLソースコードは取得できません。私が間違っていることについて何か考えはありますか?

XMLを使用することを検討しますか?まず、Canada Postを匿名で検索することは可能ですか?

説明をわかりやすくするためのコードサンプルを次に示します。

public static string FindPostalCode(ICanadadianAddress address) {
   var postData = string.Concat(string.Format("&streetNumber={0}", address.StreetNumber)
    , string.Format("&streetName={0}", address.StreetName)
    , string.Format("&city={0}", address.City)
    , string.Format("&province={0}", address.Province));

   var encoding = new ASCIIEncoding();
   byte[] postDataBytes = encoding.GetBytes(postData);
   request = (HttpWebRequest)WebRequest.Create(DefaultUrlSettings);
   request.ImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Anonymous;
   request.Container = new CookieContainer();
   request.Timeout = 10000;
   request.ContentType = contentType;
   request.ContentLength = postDataBytes.LongLength;
   request.Method = @"post";
   var senderStream = new StreamWriter(request.GetRequestStream());
   senderStream.Write(postDataBytes, 0, postDataBytes.Length);
   senderStream.Close();
   string htmlResponse = new StreamReader(request.GetResponse().GetResponseStream()).ReadToEnd();

   return processedResult(htmlResponse); // Processing the HTML source code parsing, etc.
}

私の視点では、ボトルネックに引っかかっているように見えます。希望する結果が得られません。

編集:このサイトのContentTypeに関してはパラメータが必要なようです。説明させてください。

  • 次のことを規定する「メタ」変数を持つものがあります。

meta http-equiv = "Content-Type" content = "application / xhtml + xml、text / xml、text / html; charset = utf-8"

  • そしてもう1つは、コードの後半に次のように読み取られます。

form id = "fpcByAdvancedSearch:fpcSearch" name = "fpcByAdvancedSearch:fpcSearch" method = "post" action = "/ cpotools / apps / fpc / personal / findByCity?execution = e1s1" enctype = "application / x-www-form-urlencoded 「」

私の質問は次のとおりです:私はどちらに固執する必要がありますか?

最初のContentTypeは、データが投稿されたときの関数などへの別のリクエスト専用であるため、最初のContentTypeと見なされますか?

編集:リクエストに従って、私がいる解決策に近いものがこの質問の下にリストされています: WebRequest:このContentType =” application / xhtml + xml、text / xml、text/htmlに対してWebRequestを使用して郵便番号を見つける方法; charset = utf-8”?

助けてくれてありがとう!:-)

4

2 に答える 2

1

WebClient クラスを使用していない理由を確認しようとしています:-

var fields = new NameValueCollection();
fields.Add("streetnumber", address.StreetNumber);
fields.Add("streetname", address.StreetName);
fields.Add("city", address.City);
fields.Add("province", address.Province);

var wc = new WebClient();
byte[] resultData = wc.UploadValues(url, fields);
string result = Encoding.Default.GetString(resultData);

結果を送信するときにサーバーが使用するエンコードを確認することをお勧めします。UTF-8 を使用している場合は、最後の行を次のように変更します。

string result = Encoding.UTF8.GetString(resultData);

元のコードで見つけたいくつかの問題:-

  1. 最初のフィールドには & というプレフィックスが付いていますが、これは存在しないはずです。
  2. Uri.EscapeDataString各フィールド値で使用を呼び出す必要があります。
  3. の結果の周りにメモリストリームを構築しようとしています。そのようなコンストラクターがあったGetRequestStreamとしても、それが何を達成するのかわかりませんが、とにかくそうではありません。MemoryStreamによって返されたストリームに直接書き込むだけですGetRequestStream

既に行っている場合は、fiddlerのコピーを取得して、標準フォームがデータを正常に要求したときに何が発生し、コードが何を行っているかを観察できるようにします。

編集: Cookie コンテナーがないことが原因で WebClient が機能しないという証拠がある場合は、次のアプローチを試すことができます。

public class MyWebClient : WebClient
{

    protected override WebRequest GetWebRequest (Uri address)
    {
      WebRequest request = (WebRequest) base.GetWebRequest (address);

      request.Container = new CookieContainer();
      return request;
    }
}

上記のコードを使用して、代わりに odWebClientインスタンス化インスタンスMyWebClientを使用します。

于 2009-09-18T13:45:57.197 に答える
1

HTTPWebRequest は、要求された URL のコンテンツを返します。HTML ページの場合、HTML マークアップが返されます。ページ コンテンツが XML の場合、XML マークアップが返されます。

必要なのはWebサービスのようです。そのサイトに、そのタイプのリクエストを処理できる Web サービスがあるかどうかを確認します。一致する場合は、クエリに応答して XML、JSON マークアップを返します。それ以外の場合は、リクエストの出力を解析する必要があります。

于 2009-09-18T13:46:37.557 に答える