HttpWebRequest:كيفية العثور على الرمز البريدي في كندا من خلال وظيفة WebRequest مع x-www-form-المغلقة ؟

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

سؤال

أنا حاليا كتابة بعض الاختبارات التي قد تحسين مهاراتي مع الإنترنت التفاعل من خلال نماذج Windows.واحد من هذه الاختبارات هو أن تجد الرمز البريدي التي ينبغي أن عاد من كندا موقع البريد.

  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-MSFT!)

نتيجة احصل على النتيجة المتوقعة.أحصل على تعليمات 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 من هذا الموقع.اسمحوا لي أن أشرح.

  • هناك واحد مع "ميتا"-المتغيرات التي تنص على ما يلي:

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

  • و واحد آخر في وقت لاحق إلى أسفل رمز هذا النحو:

form id="fpcByAdvancedSearch:fpcSearch" name="fpcByAdvancedSearch:fpcSearch" method="post" action="/cpotools/تطبيقات/الشركة العامة للفوسفات/الشخصية/findByCity?التنفيذ=e1s1" enctype="application/x-www-form-urlencoded"

سؤالي هو التالي:مع أي واحد هل يجب أن العصا ؟

اسمحوا لي أن أخمن ، أول ContentType يعتبر الثاني هو فقط من أجل طلب آخر إلى وظيفة أو حتى عندما تكون البيانات المنشورة من قبل

تحرير: حسب الطلب أقرب إلى الحل أنا هو المدرجة تحت هذا السؤال: WebRequest:كيفية العثور على الرمز البريدي باستخدام WebRequest ضد هذا ContentType="application/xhtml+xml, text/xml, text/html;charset=utf-8"?

شكرا على أي مساعدة!:-)

هل كانت مفيدة؟

المحلول

أنا في محاولة لمعرفة سبب لماذا كنت لا تستخدم فئة 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

إذا كنت قد فعلت ذلك بالفعل الحصول على نفسك نسخة من عازف الكمان حتى تتمكن من مراقبة ما يحدث عندما القياسية شكل طلبات البيانات بنجاح و ما رمز به.

تحرير:إذا كان لديك دليل على أن عدم وجود تعريف الارتباط الحاويات هو ما يسبب WebClient عدم العمل ثم يمكنك أن تجرب هذا المنهج:-

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