2014.05.29 20:53

[VB6.0]WinHttp의 시작.

조회 수 2271 추천 수 0 댓글 1
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

여우별다솜_알바 뛰는 마왕님.png


TrackBack : http://foxstar.dicki.kr/220014168159


목차 

0.시작하기에 앞서

1​.참조

2.선언과 사용

2-1.Open(GET)

2-2.Open(POST)

2-2-1.FireFox의 부가기능 HttpFox

2-2-2.SetRequestHeader

2-2-3.Send 값(전송 값)


0.시작하기에 앞서

VB6.0(Visual Basic6.0)은 아주 오래전에 출시된 버전으로 지원하는 기능이 한정되어 있으며, 실무에서는 사용하는 경우가 상당히 드문 언어니 직업적으로 프로그래밍을 하실 분은 크게 흥미를 가지지 않는 것이 좋습니다.


1.참조

​WinHttp는 MicroSoft에서 개발하여 프로그램상에서 HTTP(HyperText Transfer Protocol,이하 프로토콜)로의 연결을 지원해주는 라이브러리입니다.
이와 같은 라이브러리를 이용하기 위해선 프로젝트 내에 해당 라이브러리를 참조해야 합니다. 참조하는 방법은 아래를 참고하세요.


a_01.PNG


상단 메뉴에서 프로젝트(P)-참조(N)을 클릭하여 참조 대화상자를 띄워주세요.


 a_02.png

참조 대화상자에서 스크롤을 중간쯤으로 내린뒤 Microsoft WinHttp Service, version 5.1을 체크해주세요.

 

이 과정까지 진행을 하셨다면 이제부터 소스코드를 직접 입력하는 코딩작업을 해야합니다.


2.선언과 사용 

위 과정에서 참조한 WinHttp 라이브러리를 사용하기 위해선 변수를 선언하는 것처럼 WinHttp 객체를 선언해줘야 합니다.
소스 코드 최상단에 Dim WinHttp As New WinHttpRequest를 입력함으로써 WinHttp라는 이름으로 새로운 WinHttp 객체를 선언해주시면 됩니다.

 

이제부터는 본격적으로 사용에 대해 설명하도록 하겠습니다.


WinHttp는 앞에서 말씀드렸듯이 HTTP 즉, 인터넷 표준 프로토콜로의 연결을 도와주는 라이브러리입니다.
해당 프로토콜로의 연결 후 데이터 전송 방법 중 대표적인 것이 바로 GET 그리고 POST입니다.

 

2-1.Open(GET)

프로토콜로의 연결 후 데이터를 전송하는 방법 중 하나인 GET입니다.


GET은 쉽게 생각하시면 URL에서? 밑으로 데이터 값을 붙여 전달하는 방식입니다.

ex)http://test.com/test.php?data=a

 

위와 같은 방식으로 데이터를 전송해주면 test.php의 data 변수에 a라는 값을 전달해주는 것입니다.
비교적 간단하게 데이터를 전송할 수 있지만 보안상의 문제와 길이의 제약이 있습니다.

 

#GET 방식을 이용하여 HTML 소스코드 불러오기#

사실 GET 방식을 이용하여 데이터를 주고받는 것을 하고 싶었지만 요즘엔 GET 방식을 이용하여 데이터를 전송하는 웹사이트가 많지 않기에 생략하였습니다.

 

WinHttp.Open "GET", URL 'GET방식으로 URL을 Open(연결)합니다.

WinHttp.Send '전송할 데이터를 입력하는 부분인데 GET 방식에서는 입력할 데이터가 없으니 그냥 Send만 해줍니다.

MsgBox WinHttp.ResponseText '메시지 박스를 이용하여 WinHttp에 연결된 URL의 Send후 소스코드를 띄웁니다.


WinHttp는 객체이므로 .연산자를 이용하여 해당 속성,이벤트와 연결해줄수있습니다.

소스코드 하단의 .ResponseTextWinHttp에 응답,연결된 Text(소스코드)를 가져오는 Only Read 속성입니다.

 

간혹 웹페이지의 인코딩 상태에 따라 .ResponseText는 이용하면 한글을 포함한 몇몇 문자가 깨지는 현상이 발생하는 경우가 있는데
그런 경우엔 VB6.0에 내장된 함수인 StrConv를 이용하여 바이너리 형식으로 되어있는 WinHttp의 Text가져온뒤 유니코드로 변환을 해주어야합니다.

 

앞에서 사용한 .ResponseText는 소스코드를 Text(문자) 형식으로 읽어오는 것입니다.

그렇기때문에 바이너리 형식으로 읽어오기 위해선 마찬가지로  Only Read.ResponseBody​ 속성을 사용해야합니다.

 

여기서 단순히

 

MsgBox WinHttp.ResponseBody

 

의 형식으로 소스코드를 가져오게되면 100%모든글씨가 깨지게 될것입니다. 바로 해당 값은 바이너리 형식이기때문입니다.

 

이때 바로 앞에서 언급한 내장 함수인 StrConv를 사용해주어야 합니다. 

StrConv의 사용법은 아래와 같습니다.

 

MsgBox StrConv(WinHttp.ResponseBody,vbUnicode)

 

이와 같이 StrConv함수의 인자값은 StrConv(변환할 문자열,변환방식)입니다.

WinHttp의 바이너리 형식으로 되어있는 문자열을 vb에서 인식할수있는 유니코드로 변환해주는 작업입니다.


이와 같은 작업을 거치게 되면 정상적으로 소스 코드를 출력할 수 있게 될 것입니다.

 

2-2.Open(POST)

​POST 역시 데이터를 전송하지만 GET 과는 방식의 차이가 있습니다.

[input]객체의 값들을 전송해줄수 있습니다. 이 [input]객체들은 다양하고(라디오 버튼,체크 박스,텍스트 박스 등등..)길이의 제약도 없으며 GET에 비해 보안적으로 유리합니다.

 

POST 방식을 사용하기 위해서는 데이터 전송에 필요한 헤더와 전송 값(파라미터)가 필요합니다.
이러한 값들은 Http Analyzer라고 불리는 프로그램을 이용하여 얻어올 수 있습니다.


본 강좌에서는 Http Analyzer의 종류 중 하나인 Mozilla의 FireFox 브라우저 부가기능 HttpFox이용할 것입니다

 

다운로드

FireFox : 링크 공식 홈페이지( http://www.mozilla.or.kr/ko )

HttpFox : 링크


FireFox와 HttpFox의 다운로드 및 설치는 비교적 간단하니 따로 언급하지 않겠습니다.

 

2-2-1.FireFox의 부가기능 HttpFox

​대부분의 WinHttp개발자들이 편의를 위해 사용하는 Http Analyzer입니다.

앞에서 설치가 완료된 HttpFox를 FireFox에서 실행해봅시다.

 

※강의는 2014-05-29 기준 최신 버전인 FireFox 29.0.1버전, HttpFox 0.8.14버전으로 진행되니 이 점 참고해주시기 바랍니다.※


a_03.png

FireFox에서 키보드의 Alt를 누르게 되시면 상단의 메뉴가 나오게 됩니다.
당 메뉴에서 도구(T)-웹 개발 도구(W)-HttpFox-Toggle HttpFox를 순서대로 클릭하여 HttpFox를 실행해주세요.

a_04.png

FireFox의 하단에 HttpFox가 실행되었습니다.

 

POST 강의를 위하여 제 개인 홈페이지에 테스트용 페이지를 개설해두었으니 해당 페이지로 실습을 해보겠습니다.( 링크 )

해당 페이지에 접속하게 되시면 아래와 같은 페이지가 나오실 겁니다.

 a_05.png

해당 페이지는 전송 값 텍스트 박스에 값을 입력한 후 전송 버튼을 클릭하시면 전송 값과 함께 현재 서버의 시간을 출력해주는 페이지입니다.

 

해당 페이지에서 HttpFox의 Start 버튼을 클릭하신 뒤 테스트 페이지의 텍스트 박스에 임의의 값을 입력하신 뒤 전송 버튼을 클릭해주신 뒤 HttpFox의 Stop 버튼을 클릭해주세요.

전 test라고 입력하겠습니다. (한글은 지원하지않습니다.인코딩 설정하는걸 깜빡했거든요.) 

 

웹 페이지에서 테스트해보시면 비정상적인 접근 시도입니다.(Error:User-Agent)라는 에러 메시지가 뜨실텐데 이 부분은 조금 뒤에 언급할 Header부분을 위해 처리해둔 작업입니다. 


일단 HttpFox에서 해당 페이지에서 일어난 작업을 찾아야합니다.URL칼럼을 주시하면서 찾으면되는데요.

이번 강의에서 찾아야하는 URL은 http://dicki.kr/WinHttpTestPage 입니다.

 

HttpFox에서 해당 URL을 찾아 클릭해주세요.

 a_06.png

HttpFox의 Headers탭을 봐주세요.

Headers탭에는 

User-Agent,Content-Type,Referer등의 여러가지 정보가 나와있습니다.

이번 강의에서 필요한건User-AgentContent-Type입니다. 

이러한 Header를 WinHttp에 적용해주기 위한방법이 SetRequestHeader 입니다.

 

2-2-2.SetRequestHeader

​WinHttp의 Header를 설정해주기 위한 속성으로

 

WinHttp.SetRequestHeader "Header","값"


위와 같은 꼴로 사용합니다.


이번 강의에서 필요한건 Content-TypeUser-Agent라고 말했으니 두 가지 헤더에 대해 설명해드리겠습니다.


HttpFox의 Headers탭에서 Content-Type을 보게 되시면 application/x-www-form-urlencoded라고 적혀있으실겁니다.

--- 

Content-Type과application/x-www-form-urlencoded 이게 무엇인가?

Content-Type 은, (OECD 처럼) request 메세지에 포함되어야 하는 정보가 있을 때, 그 데이터 타입이 어떠해야 하는지를 나타낸다. 그런데 모든 request 메세지에 다 지정해 줄 필요가 있는 것은 아니고, request 메세지가 전송되는 방식은 여러가지가 있는데, 그 중 post 나 put 의 경우 content-type 을 지정해줘야 한다. Content-Type 이 가질 수 있는 값은 MIME type 의 값 들이다.

 

그 럼 MIME type 이 뭔지 또 살펴보자. 에고 공부할게 많다. 인터넷 메디아 타입(internet media type) 이라고도 불리는 이 타입은, Multipurpose Internet Mail Extension 의 약자이다. 처음에 MIME 타입은, SMTP(인터넷 프로토콜(IP) 에서 e-mail 을 보낼 때 사용되던 프로토콜) 를 통해 e-메일을 보낼 때 사용되는 것이 지금은 다른 프로토콜에서도 확장되어 사용되고 있다. MIME 타입은 아스키코드(ASCII code) 로 기술 될 수 없는 메세지를 인코딩 하여 보내는 것을 가능하게 해준다. 즉, 영어 외의 일본어 한국어 같은 것들도 표현하여 메세지를 보낼 수 있다는 의미이다. 또한 그림, 음악, 영화, 컴퓨터 프로그램과 같은 8비트 바이너리 파일을 전자우편으로 보낼 수 있도록 한다. (참고 : http://ko.wikipedia.org/wiki/MIME#Content-Type)

 

MIME type 은 크게 두 부분으로 나누어 진다. type 과 subtype 으로 나누어 지는데, subtype 에 따라 추가적으로 파라미터를 가질 수 있다. 아래 예를 보자. 

 

<%@ page contentType="text/html; charset=utf-8" pageEncoding="euc-kr" %>

 

JSP 파일을 작성할 때 맨 서두에 포함되는 부분이다. 여기도 contentType 이라고 적힌 부분을 볼 수 있다. 여기서 type 에 해당하는 부분이 text, subtype 에 해당하는 부분이 html 이며, charset=utf-8 은 subtype 이 html 일 때 가질 수 있는 파라미터에 해당하는 값이다.

 

이제 마지막이다. request 메세지를 post 방식으로 서버에 보낼 때, MIME type 은 무엇이어야 하는가?? post 방식으로 보낸 다는 것은, request 메세지가 헤더 부분 말고도 따로 데이터를 저정할 수 있는 저장 공간이 있으며, 그러므로 보내려는 정보를 이 공간에다 저장해서 보내는 방식이 post 방식이다. 웹 브라우저에서 web form 엘리먼트로 부터 post 방식으로 데이터를 보낼 때, 표준 MIME type 이 바로 application/x-www-form-urlencoded 이다.마 지막이다. request 메세지를 post 방식으로 서버에 보낼 때, MIME type 은 무엇이어야 하는가?? post 방식으로 보낸 다는 것은, request 메세지가 헤더 부분 말고도 따로 데이터를 저정할 수 있는 저장 공간이 있으며, 그러므로 보내려는 정보를 이 공간에다 저장해서 보내는 방식이 post 방식이다. 웹 브라우저에서 web form 엘리먼트로 부터 post 방식으로 데이터를 보낼 때, 표준 MIME type 이 바로 application/x-www-form-urlencoded 이다. (web form 엘리먼트라는 말은 우리가 검색창에서 검색어를 입력한 뒤, 그 입력값을 전달할 수 있는 것처럼, 사용자의 input을 받아서 처리할 수 있도록 해주는 엘리먼트를 의미한다.)

 

application/x-www-form-urlencoded 방식을 선택하면, key-value 형태로 인코딩 하게 된다. 가 령, 검색 예제에서 검색어가 OECE 일 경우, search=OECD 이런 식으로 인코딩 될 것이다. 만약 검색을 OECD UN 이렇게 두 단어로 했다면, search=OECD&search=UN 이렇게 인코딩 될 것이다. 참고로, 스페이스의 경우, 인코딩 되면 +로 바뀐다. 아래는 application/x-www-form-urlencoded 타입으로 인코딩 했을 때를 보여준다.

 

Name: Jonathan Doe
Age: 23
Formula: a + b == 13%!

are encoded as

Name=Jonathan+Doe&Age=23&Formula=a+%2B+b+%3D%3D+13%25%21
결론을 말하겠다.
웹 프로그래밍이 아니라도, 자바나 타 프로그램상에서 네트워크 통신을 해서 서버에 접근해야 할 때가 있다. Content-Type을 지정해 주는 것을 잊지 말자! 물론 POST 방식으로 전송할 때 말이다.


---

이번엔HttpFox의 Headers탭에서 User-Agent를봐주세요.

---

User-Agent에 대하여

User-Agent는 간단하게 설명하자면 해당 명령을 처리한 브라우저와 OS정보를 나타냅니다.

ex)Mozilla/5.0 (Windows NT 6.1; rv:29.0) Gecko/20100101 Firefox/29.0

Windows NT 6.1(Windows7)으로 Mozilla사의 Firefox 29.0버전을 이용해 접속하였음을 나타내준다.


---

Header값을 알아냈으니 이제 코딩을 해봅시다.

 

WinHttp.Open "POST","http://dicki.kr/WinHttpTestPage/WinHttp_Test_Page.php" 'POST형식으로 해당 URL을 Open합니다.
WinHttp.SetRequestHeader "Content-Type", "application/x-www-form-urlencoded" 'Content-Type을 지정해줍니다.

WinHttp.SetRequestHeader "User-Agent", "DICKI WinHttp User-Agent"  

'User-Agent를 지정해줍니다. 해당 페이지는 User-Agent를 DICKI WinHttp User-Agent​로 지정해주어야지 정상적으로 작동합니다.


이제 Send를해야하는데 POST의 Send는 GET의 Send와 다릅니다. 아래를 봐주세요.


2-2-3.Send 값(전송 값)

​HttpFox의 POST Data탭을 봐주세요.

 a_07.png

POST Data의 파라미터를 보시면 PostData에 Value가 test로 되어있습니다.제가 아까 입력한 값인 test이지요.이 값을 보다 편하게 Send에 넣어주기위하여 하단의 Raw를 클릭해주세요.


클릭하게 되시면


PostData=test 


위와 같은 꼴로 값이 나오실 겁니다. 해당 값을 복사해주세요.

다시 한번 코딩을 해봅시다.

 

WinHttp.Open "POST","http://dicki.kr/WinHttpTestPage/WinHttp_Test_Page.php" 'POST형식으로 해당 URL을 Open합니다.
WinHttp.SetRequestHeader "Content-Type", "application/x-www-form-urlencoded" 'Content-Type을 지정해줍니다.

WinHttp.SetRequestHeader "User-Agent", "DICKI WinHttp User-Agent"  

'User-Agent를 지정해줍니다. 해당 페이지는 User-Agent를 DICKI WinHttp User-Agent​로 지정해주어야지 정상적으로 작동합니다.
WinHttp.Send "PostData=test" 'PostData에 test라는 값을 넣어 전송해줍니다.

MsgBox WinHttp.ResponseText '메시지 박스를 이용하여 WinHttp에 연결된 URL의 Send후 소스코드를 띄웁니다.


이번 WinHttp의 시작 강의는 여기까지입니다.

다음 강의는 이번에 사용한 페이지를 이용하여 파싱(Parsing)강의를 진행하도록 하겠습니다.


감사합니다.

 

  • ?
    위더맨 2014.06.04 07:54
    오... 이제야 읽어보네요
    저도 이런 글 좋아합니다, 자주 블로그 들릴게요~

누군가가 채팅방에서 당신을 호출했습니다.