Project/T-Set

HTTP Request ActiveX Object

SSKK 2011. 1. 3. 23:11
HTTP Request 를 요청하기 위해서, 

"Msxml2.XMLHTTP" 또는 "Microsoft.XMLHTTP" 와 같이 MS XML 객체를 사용하다가 
원인을 알 수 없는 문제가 발생하였습니다. 

웹페이지에 대한 요청이 아니라 특정 application 이 직접 구현한 http 서비스에 요청을 하는 것인데 위 객체로는 정상적으로 동작하지 않았습니다. 제 생각에 이 특정 app 이 제대로 구현했을거라 생각되지도 않습니다. 더군다나 process 간 통신을 위해서 http 프로토콜을 사용하는 건 처음 보았답니다. 단순히 프로세스간 통신에는 파이프, 메시지, TCP, 공유 메모리, 그리고 COM 등의 다른 수단이 많음에도 말이죠. 

어쨋든 문제는 고쳐야 했고, 혹시나 해서 WinHttpRequest 객체로 바꾸어 봤는데 제대로 동작하더군요. 그래서 혹시나 저와 같이 프로세스간 통신에 http request 를 요청해야 하고, 그걸 스크립트 상에서 호출할 수 있어야 한다면 XMLHTTP 외에도 winHttpRequest 가 있다는 것도 유념하시길 바랍니다.

사용법은 XMLHttp 와 거의 유사합니다.

function getText(strURL)
{
    var strResult;
    
    try
    {
        // Create the WinHTTPRequest ActiveX Object.
        var WinHttpReq = new ActiveXObject(
                                  "WinHttp.WinHttpRequest.5.1");
        
        //  Create an HTTP request.
        var temp = WinHttpReq.Open("GET", strURL, false);

        //  Send the HTTP request.
        WinHttpReq.Send();
        
        //  Retrieve the response text.
        strResult = WinHttpReq.ResponseText;
    }
    catch (objError)
    {
        strResult = objError + "\n"
        strResult += "WinHTTP returned error: " + 
            (objError.number & 0xFFFF).toString() + "\n\n";
        strResult += objError.description;
    }
    
    //  Return the response text.
    return strResult;
}

WScript.Echo(getText("http://www.microsoft.com/default.htm"));

아 그리고 호출하기 전 SetTimeouts 함수를 호출하는 것도 유념해야 합니다.

The following scripting example shows how to set all WinHTTP time-outs to 30 seconds, open an HTTP connection, and send an HTTP request.

// Instantiate a WinHttpRequest object.
var WinHttpReq = new ActiveXObject("WinHttp.WinHttpRequest.5.1");

// Set time-outs. If time-outs are set, they must 
// be set before open.
WinHttpReq.SetTimeouts(30000, 30000, 30000, 30000);

// Initialize an HTTP request.  
WinHttpReq.Open("GET", "http://www.microsoft.com", false);

// Send the HTTP request.
WinHttpReq.Send();


참고: