HttpWebRequest:如何找到一个邮政编码在加拿大通过发布一个问福汇,他们说的x-www-form-封闭?

StackOverflow https://stackoverflow.com/questions/1444563

目前,我正在写一些测试使得我可能会提高我的技能与互联网相互作用通过窗户的形式。那些测试是要找到一个邮政编码应该返回加拿大后的网站。

  1. 我的默认URL设置: http://www.canadapost.ca/cpotools/apps/fpc/personal/findByCity?execution=e4s1
  2. 所需要的形式领域是: streetNumber, streetName, 城市,
  3. 该contentType是"application/x-www-form-封闭"

编辑: 请考虑的价值"application/x-www-form-编码",而不是3点值作为contentType.(谢谢EricLaw-微软!)

结果我得到的不是结果的预期。我得到的HTML源码的网页在那里我可以手工输入的信息找到的邮政编码,但不HTML源码找到的邮政编码。任何想法什么的我做错了什么?

我考虑去XML方式?它是第一个的所有可能的搜索,在加拿大后的匿名?

这里有一个代码样本为更好地说明:

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的这个网站。让我解释一下。

  • 还有一个与"元"变量其规定如下:

元http当量="Content-Type"content="application/xhtml+xml, 文/xml,text/html;charset=utf-8"

  • 和另一个后来的码,读为:

id="fpcByAdvancedSearch:fpcSearch"name="fpcByAdvancedSearch:fpcSearch"method="post"action="/cpotools/apps/fpc/人/findByCity?执行=e1s1"enctype="application/x-www-form-urlencoded"

我的问题如下:与这一做我必须坚持?

让我猜猜,第一ContentType被认为是第二种是只能用于另一个请求函数或所以当数据被贴?

编辑: 为每一请求,更接近解决我是下列出的这个问题: 问福汇,他们说:如何找到一个邮政编码使用问福汇,他们说对这ContentType="application/xhtml+xml文/xml,text/html;charset=utf-8"?

感谢任何的帮助!:-)

有帮助吗?

解决方案

我想看到一个理由为什么你不使用Web客户端类:-

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

如果你已经做到了所以把自己的副本 提琴手 所以你可以观察到什么时发生的一个标准的形式要求的数据成功和你的代码这样做。

编辑:如果你有证据表明,缺乏一个饼干容器是什么原因导致Web客户端不工作然后你可以试试这个方法:-

public class MyWebClient : WebClient
{

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

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

现在使用我的代码以上,而是od实例 WebClient 实例 MyWebClient 代替。

其他提示

HTTPWebRequest将返回的内容URLrequested.如果它是一个HTML网页,它将返回HTML标记。如果页面内容是XML,然后将返回的XML标记。

它听起来像是你需要的是一个服务.我会看看那个网站有任何webserivces可用于处理这类请求。如果他们这样做,那么它将返回XML,JSON标记响应您的查询。否则留给你分析出的请求。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top