HttpWebRequest: Wie eine Postleitzahl in Canada Post durch eine WebRequest mit x-www-form-eingeschlossen zu finden?

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

Frage

Ich schreibe zur Zeit einige Tests, so dass ich meine Fähigkeiten mit dem Internet-Interaktion durch Windows Forms verbessern können. Einer dieser Tests ist es, eine Postleitzahl zu finden, die von Canada Post Website zurückgegeben werden sollte.

  1. Meine Standard-URL Einstellung auf: http: / /www.canadapost.ca/cpotools/apps/fpc/personal/findByCity?execution=e4s1
  2. Die erforderlichen Formularfelder sind: Hausnummer , Strasse- , Stadt , Provinz
  3. Die content ist "application / x-www-form-geschlossene"
  

EDIT: Bitte beachten Sie, der Wert "application / x-www-form-encoded" anstelle von Punkt 3 Wert als content. (Danke EricLaw-MSFT!)

     

Das Ergebnis, das ich bekommen, ist nicht das Ergebnis erwartet. Ich erhalte den HTML-Quellcode der Seite, wo ich die Informationen manuell eingeben könnte die Postleitzahl, aber nicht der HTML-Quellcode mit dem gefundenen Postleitzahl zu finden. Jede Idee, was ich falsch mache?

     

Soll ich betrachte den XML-Weg zu gehen? Ist es erst einmal möglich anonym Canada Post suchen?

Hier ist ein Codebeispiel für eine bessere Beschreibung:

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.
}

Ich scheine in einem Flaschenhals in meiner Sicht stecken. Ich finde keinen Ausweg zu dem gewünschten Ergebnis.

  

EDIT: Es scheint Parameter wie für die Content von dieser Seite zu haben. Lassen Sie mich erklären.

  • Da ist man mit dem „Meta“ -Variablen, die besagt:
  

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

  • Und noch ein später auf den Code, der als gelesen wird:
  

form id = "fpcByAdvancedSearch: fpcSearch" name = "fpcByAdvancedSearch: fpcSearch" method = "post" action = "/? Cpotools / apps / fpc / personal / findByCity Ausführung = e1s1" enctype = "application / x-www- form-urlencoded "

Meine Frage ist folgende: Mit dem man muß ich halten

?

Lassen Sie mich raten, ist der erste Content betrachtet werden, da der zweite nur für eine weitere Anforderung an eine Funktion oder so, wenn die Daten geschrieben wird?

  

EDIT: Wie pro Antrag wird die näher an der Lösung Ich bin unter dieser Frage aufgeführt:    WebRequest: Wie ein finden Postleitzahl ein WebRequest gegen diese Contenttype =“application / XHTML + xml, text / xml, text / html verwendet; charset = utf-8” ?

Vielen Dank für jede Hilfe! : -)

War es hilfreich?

Lösung

Ich versuche, einen Grund zu sehen, warum Sie nicht mit der WebClient-Klasse sind: -

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);

Sie möchten vielleicht die Codierung vom Server verwendet wird, um zu überprüfen, wenn die Ergebnisse zu senden, wenn es UTF-8 ändert die letzte Zeile verwendet, um: -

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

Einige Fragen, die ich in Ihrem ursprünglichen Code vor Ort: -

  1. Das erste Feld wird mit dem Präfix &, die nicht da sein sollte.
  2. Sie müssen Verwendung Uri.EscapeDataString auf jedem Feldwert nennen.
  3. Sie versuchen, einen Speicherstrom um das Ergebnis von GetRequestStream zu konstruieren, kann ich nicht sehen, was das erreichen würde, selbst wenn MemoryStream einen solchen Konstruktor hatte, aber es funktioniert nicht sowieso. Schreiben Sie einfach direkt an den Strom von GetRequestStream zurückgegeben

Wenn Sie bereits so erhalten Sie sich eine Kopie von Fiedler getan, so können Sie beobachten, was geschieht, wenn ein Standard Form fordert die Daten erfolgreich und was Ihr Code tut.

Bearbeiten : Wenn Sie Beweise haben, dass das Fehlen eines Cookies Container ist, was bewirkt, dass WebClient nicht zu arbeiten, dann können Sie versuchen, diesen Ansatz: -

public class MyWebClient : WebClient
{

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

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

Jetzt ist mein Code zu verwenden, oben, sondern od instancing WebClient Instanz MyWebClient statt.

Andere Tipps

httpwebrequest wird der Inhalt des URLrequested zurückzukehren. Wenn es sich um eine HTML-Seite ist, wird es HTML-Markup zurück. Wenn der Seiteninhalt XML ist, dann wird es XML-Markup zurück.

Es klingt wie Sie ist ein Webservice benötigen. Ich würde sehen, ob diese Website keine webserivces zur Verfügung hat, die Art der Anforderung zu verarbeiten. Wenn sie das tun, dann wird es XML zurückgeben, JSON-Markup als Antwort auf Ihre Anfrage. Ansonsten werden Sie nach links, um den Ausgang des Antrags Parsen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top