HttpWebRequest:كيفية العثور على الرمز البريدي في كندا من خلال وظيفة WebRequest مع x-www-form-المغلقة ؟
-
22-07-2019 - |
سؤال
أنا حاليا كتابة بعض الاختبارات التي قد تحسين مهاراتي مع الإنترنت التفاعل من خلال نماذج Windows.واحد من هذه الاختبارات هو أن تجد الرمز البريدي التي ينبغي أن عاد من كندا موقع البريد.
- بلدي URL الافتراضي تعيين: http://www.canadapost.ca/cpotools/apps/fpc/personal/findByCity?execution=e4s1
- المطلوب حقول النموذج هي: streetNumber, streetName, المدينة, محافظة
- على 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);
بعض القضايا بقعة في الاصلي كود:-
- الحقل الأول هو مسبوقة بـ &, لا ينبغي أن يكون هناك.
- كنت بحاجة إلى استخدام
Uri.EscapeDataString
على كل قيمة الحقل. - أنت تحاول بناء الذاكرة تيار حول نتيجة
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 العلامات في الاستجابة إلى الاستعلام الخاص بك.وإلا كنت من اليسار إلى تحليل الناتج من الطلب.