httpwebrequest : x-www-form enclosed가있는 웹 레퀴즈를 통해 Canada Post에서 우편 번호를 찾는 방법?

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

문제

현재 Windows 양식을 통해 인터넷 상호 작용으로 기술을 향상시킬 수 있도록 일부 테스트를 작성하고 있습니다. 이러한 테스트 중 하나는 Canada Post 웹 사이트에서 반환 해야하는 우편 번호를 찾는 것입니다.

  1. 내 기본 URL 설정은 다음으로 설정됩니다. http://www.canadapost.ca/cpotools/apps/fpc/personal/findbycity?execution=e4s1
  2. 필요한 양식 필드는 다음과 같습니다. 스트리트 오너, 스트리트 이름, 도시,
  3. ContentType은 "Application/X-www-form enclosed"입니다.

편집하다: ContentType로 점 3 값 대신 "Application/X-WWW- 형식 인코딩"값을 고려하십시오. (감사합니다 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.
}

나는 내 관점에서 병 목에 갇힌 것 같습니다. 나는 원하는 결과를 얻을 방법을 찾지 못한다.

편집하다: 이 사이트의 내용 유형에 대해 매개 변수가 필요한 것 같습니다. 설명하겠습니다.

  • 다음을 규정하는 "메타"-변수가있는 것이 있습니다.

메타 http-equiv = "content-type"content = "application/xhtml+xml, text/xml, text/html; charset = utf-8"

  • 그리고 나중에 읽는 코드 아래로 다른 하나는 다음과 같이 읽습니다.

양식 ID = "FPCBYADVANCES SEARCH : FPCSEARCH"이름 = "FPCBYADVANCES SEARCH : FPCSearch"Method = "Post"Action = "/CPOTools/apps/fpc/personal/findBycity? execution = e1s1"acplice = "application/x-www-urlencoded "

내 질문은 다음과 같습니다. 어떤 것을 고수해야합니까?

첫 번째 ContentType은 데이터가 게시 될 때 기능에 대한 다른 요청에 대한 것만으로도 고려해야한다고 추측하겠습니다.

편집하다: 요청에 따라, 내가 AM의 솔루션에 가까워지면이 질문에 나열됩니다. 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 마크 업을 반환합니다.

필요한 것은 웹 서비스 인 것 같습니다. 해당 사이트에 해당 유형의 요청을 처리 할 수있는 webserives가 있는지 확인합니다. 그렇다면 쿼리에 대한 응답으로 XML, JSON 마크 업을 반환합니다. 그렇지 않으면 요청의 출력을 구문 분석해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top