천객만래 [千客萬來] (It has an interminable succession of visitors)

'httpopenrequest'에 해당되는 글 2건

  1. 2012.01.27 [개발/VC++] 인터넷에 쿼리요청 보내기 / HttpSendRequest
  2. 2012.01.25 [개발/c++] Send HTTP Post Request
[개발/VC++] 인터넷에 쿼리요청 보내기 / HttpSendRequest

출처:  http://toolz.pe.kr/32 

QueryInternet : 인터넷에 쿼리요청 보내기 / html 코드 받아오기

1. 함수 원형
BOOL QueryInternet(const char *szAddress,UINT nPort,UINT nQuery) 

2. 인자 설명
szAddress : 쿼리 요청을 보낼 주소
nPort : 포트번호
nQuery : 쿼리 횟수

3. 헤더 파일
wininet.h (?)

BOOL QueryInternet(const char *szAddress,UINT nPort,UINT nQuery)
{

/*

Return -1 : 포트번호입력오류

Return 2 : InternetOpen() 함수에러

Return 3 : InternetConnect() 함수에러

Return 4 : HttpOpenRequest() 함수에러

Return 0 : 정상

*/

 

if(nPort<=0 || nPort>65535)

{

return -1;

}

 

HINTERNET hIOpen = InternetOpen("TestWeb",INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0);

if ( hIOpen == NULL )

return 2;

UINT i;

for(i=0;i<nQuery;i++)

{

HINTERNET hIConnect = InternetConnect(hIOpen,szAddress,nPort,NULL,NULL,INTERNET_SERVICE_HTTP, 0, 0);

if ( hIConnect == NULL )

{

InternetCloseHandle(hIOpen);

return 3;

}

// Request the file from the server.

//LPCTSTR ppszAcceptTypes = "text/*" ;

HINTERNET hIReq = HttpOpenRequest(hIConnect,

NULL, // "Get"

NULL,

(LPCSTR)HTTP_VERSION,

NULL, //(LPCSTR )csUrlCon,

NULL,//&ppszAcceptTypes,

INTERNET_FLAG_RELOAD|INTERNET_FLAG_NO_CACHE_WRITE,

0);

if ( hIReq == NULL){

InternetCloseHandle(hIConnect);

InternetCloseHandle(hIOpen);

return 4;

}

// Send the request.

HttpSendRequest(hIReq, NULL, 0, NULL, 0);

BYTE pBuffer[8192]={0,};

DWORD dwBytesRead;

InternetReadFile(hIReq,pBuffer,8192,&dwBytesRead);

// Close all of the Internet handles.

InternetCloseHandle(hIReq);

InternetCloseHandle(hIConnect);

}

InternetCloseHandle(hIOpen);

}
Posted by SB패밀리
Send HTTP Post Request 
http://support.microsoft.com/kb/165298

WinInet을 사용하여 양식 전송 제대로 시뮬레이션하려면 적절한 콘텐츠 형식을 나타내는 헤더 보내야 합니다. Forms에 대해 올바른 Content-Type 헤더에 있습니다:
Content-Type: application/x-www-form-urlencoded

콘텐츠 형식을 지정하지 않은 경우 대부분의 경우 서버를 적절히 응답하지 않습니다. 
예를 들어, IIS 3.0 Active Server Pages 구성 요소를 실제로 ' application/x-www-form-urlencoded ' 이 
헤더를 특히 폼 변수 "Request.Form" 개체를 추가하기 전에 확인합니다. 
이 MIME/Content-Type 데이터 요청URL-encoded form variables 목록을 나타냅니다. 
공백 문자 (ASCII 32) 로 인코딩된 '+ ', 특수 문자 예: 것을'!' 의미합니다 
URL 인코딩은 '%21' 16진수 형식으로 인코딩된. 

폼 POST 요청을 시뮬레이션하기 위해 MFC WinInet 클래스를 사용하는 코드

CString strHeaders =
      _T("Content-Type: application/x-www-form-urlencoded");
   // URL-encoded form variables -
   // name = "John Doe", userid = "hithere", other = "P&Q"
   CString strFormData = _T("name=John+Doe&userid=hithere&other=P%26Q");

   CInternetSession session;
   CHttpConnection* pConnection =
      session.GetHttpConnection(_T("ServerNameHere"));
   CHttpFile* pFile =
      pConnection->OpenRequest(CHttpConnection::HTTP_VERB_POST,
                              _T("FormActionHere"));
   BOOL result = pFile->SendRequest(strHeaders,
      (LPVOID)(LPCTSTR)strFormData, strFormData.GetLength());

======================================================================
    
MFC 동일한 코드를 직선 SDK 호출하려면 다음과 같이 변환합니다:

   static TCHAR hdrs[] =
      _T("Content-Type: application/x-www-form-urlencoded");
   static TCHAR frmdata[] =
      _T("name=John+Doe&userid=hithere&other=P%26Q");
  static LPSTR accept[2]={"*/*", NULL};

   // for clarity, error-checking has been removed
   HINTERNET hSession = InternetOpen("MyAgent",
      INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
   HINTERNET hConnect = InternetConnect(hSession, _T("ServerNameHere"),
      INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 1);
   HINTERNET hRequest = HttpOpenRequest(hConnect, "POST",
      _T("FormActionHere"), NULL, NULL, accept, 0, 1);
   HttpSendRequest(hRequest, hdrs, strlen(hdrs), frmdata, strlen(frmdata));
   // close any valid internet-handles

Posted by SB패밀리