httpwebrequest : x-www-form enclosed가있는 웹 레퀴즈를 통해 Canada Post에서 우편 번호를 찾는 방법?
-
22-07-2019 - |
문제
현재 Windows 양식을 통해 인터넷 상호 작용으로 기술을 향상시킬 수 있도록 일부 테스트를 작성하고 있습니다. 이러한 테스트 중 하나는 Canada Post 웹 사이트에서 반환 해야하는 우편 번호를 찾는 것입니다.
- 내 기본 URL 설정은 다음으로 설정됩니다. http://www.canadapost.ca/cpotools/apps/fpc/personal/findbycity?execution=e4s1
- 필요한 양식 필드는 다음과 같습니다. 스트리트 오너, 스트리트 이름, 도시, 주
- 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);
내가 당신의 기관 코드에서 발견 한 몇 가지 문제 :-
- 첫 번째 필드는 &로 접두사가 있습니다.
- 통화 사용이 필요합니다
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 마크 업을 반환합니다.
필요한 것은 웹 서비스 인 것 같습니다. 해당 사이트에 해당 유형의 요청을 처리 할 수있는 webserives가 있는지 확인합니다. 그렇다면 쿼리에 대한 응답으로 XML, JSON 마크 업을 반환합니다. 그렇지 않으면 요청의 출력을 구문 분석해야합니다.