상세 컨텐츠

본문 제목

MSXML2.XMLHTTP 란 무엇인가?

프로그래밍/JAVA

by 라제폰 2009. 3. 6. 19:33

본문

요즘 xmlhttp를 궁금해하시는 분들이 많은듯해서...

xmlhttp는 원격파일을 부르는 방법입니다. 물론 로컬웹서버에 있는 파일도
가능하고, 같은 도메인 내에서라면 클라이언트영역에서도 사용가능합니다. 이렇게
개체를 참조합니다.

set xh=createobject(\"msxml2.xmlhttp\")

get/post 둘다 사용가능합니다.

xh.open \"get\", \"url\", false
xh.open \"post\", \"url\", false

url은 비록 로컬서버라 해도 반드시 http로 시작합니다. 이렇게 연결을 연
다음에는 보냅니다.

xh.send something

마지막 something은 생략될수도 있습니다. 예를들어 get방식에서는 보낼게
없을겁니다. 그러므로 그냥,

xh.send

무언가를 보냈으면 받는게 있을수도 있습니다. 받는건 스트링, 바이너리, xml
등이 있습니다. 그러므로 호출자측 코드는 마지막으로 이렇게 끝납니다.

response.write xh.responseText \'or
response.binarywrite xh.responsebody \'or
response.write xh.responseXml.xml

한편 피호출자(url의 주소페이지)는 xmlhttp가 보내는걸 이렇게 받습니다.

response.write request.querystring(1)
response.write request.form(1)
response.binaryWrite request
xmldoc.load request

각각 get, post, binary, xml을 보냈을 경우입니다. 한편 두번째 post방식은
그동안 설명만으론 안됩니다. 사실은 보낼때, open과 send 사이에 다음 행을
집어넣습니다.

xh.setRequestHeader \"Content-Type\",\"application/x-www-form-urlencoded\"

담에 보낼때,

xh.send \"f1=1&f2=2\"

이런식으로 쿼리스트링을 나누는것처럼 폼 변수를 나누어 보냅니다. 받는측에선
request.form(1), request.form(2), 이런식으로 나누어 받을겁니다.

한편 get방식은 오픈할때 그냥 url에 쿼리문자열을 넣어서 보냅니다.

xh.open \"get\", \"http:// url/page.asp?a=1&b=2\", false
그리고 send는 그냥,
xh.send

한글페이지를 불러올때는 바이너리로 열어야 글자가 안깨집니다.

xh.open \"get\", \"http:// 한글페이지주소/page.asp\", false
xh.send
response.binaryWrite xh.responseBody

이외에 xmlhttp는 바이너리나 xml dom 개체를 보내는데도 편리하게 사용할수
있습니다.

xmlhttp는 윈도우의 wininet.dll이라는 개체를 사용합니다. 단점은 멀티스레드가
안된다는겁니다. 그러므로 요즘은 serverXmlHttp가 권장됩니다. 사용법은
같습니다. 그냥 시작할때,

set xh=createobject(\"msxml2.serverXmlhttp\")

server만 앞에 붙이면 됩니다. 한편 최신xml버전을 깔아두고, 버전까지 명시해서
사용하는것이 좋습니다.

set xh=createobject(\"msxml2.xmlhttp.4.0\")
set xh=createobject(\"msxml2.serverXmlhttp.4.0\")

이상 초간단 xmlhttp 설명이었습니다. 혹시 안되시는 부분, 추가응용이
있으시다면, 질문을 올려주십시오.


==================================================================

Han님 좋은 강좌 감사합니다.

예전에 Han님께서 제공해주신 xmlhttp에 대한 소개를 접하고
잘 사용하고 있습니다.

그동안 xmlhttp 개체를 자바스크립트에서

var oXMLHTTP = new ActiveXObject( \"Microsoft.XMLHTTP\" );

이렇게 생성해서 사용했는데
오늘 게시하신 글을 읽고 아래 처럼 바꿔봤으나 되는 게 있고
또 되지 않는게 있었습니다.

msxml2.xmlhttp         <-- 잘됨
msxml2.xmlhttp.4.0    <-- 잘됨

msxml2.serverxmlhttp         <-- 에러
msxml2.serverxmlhttp.4.0    <-- 에러

발생하는 스크립트 오류는 다음과 같습니다:

    오류: 자동화 서버는 개체를 작성할 수 없습니다.

xml은 4점대 버전이 설치되어 있습니다.

serverxmlhttp를 사용하기 위해 또 다른 설치가 필요한 건가요?




==================================================================


혹시 클라이언트 영역에서 사용하신게 아닌지요? 클라이언트영역에선 안됩니다.
그리고 버전명도 클라이언트영역에선 옛날걸로 하시는게
안전합니다(msxml2.xmlhttp). xml4.0을 가진 클라이언트는 1백명에 한명도
안될겁니다
==================================================================

Han님이 알려주신 msxml2.xmlhttp를 사용하다가 질문입니다...

4월9일 ADSI질문에 답변글을 만들면서 ASP에서 사용해 보았는데...
msxml2.serverxmlhttp 에서는 에러가 발생합니다.

msxml2.xmlhttp <-- 잘됨
msxml2.serverxmlhttp <-- 에러

msxml3.dll error \'80072eef\'
로그인 요청이 거부되었습니다.
/vir.asp, line 59

저는 xml3.0 이깔려있는 것은데... 최신버전 다운로드 경로도 알수있을까요?


\'------------ 소스 ----------------
<%
Function execADSI(v_idx, v_name, v_path)
Dim xh, xPath, strPost, intVal

xPath = \"http://220.xx.xx.xx/ADSI/VirCreate.asp\"

v_idx = Server.URLEncode(v_idx)
v_name = Server.URLEncode(v_name)
v_path = Server.URLEncode(v_path)

strPost = \"iis_idx=\" & iis_idx & \"&vir_name=\" _
& vir_name & \"&vir_path=\" & vir_path

xPath = xPath & \"?\" & strPost
Response.Write xPath & \"<hr>\" \'경로확인

Set xh = Createobject(\"msxml2.serverxmlhttp\")
  xh.open \"GET\", xPath, false, PROC_ID, PROC_PW
  xh.send()            <---- 이부분에서 에러발생
  intVal = xh.ResponseText
Set xh = Nothing

execADSI = Cint(intVal)
End Function
%>

==================================================================

좋은 정보 감사합니다... 하하 ^^; 해결되었습니다...

ServerXMLHTTP 는 XMLHTTP 보다 엄격한것 같습니다.. Admin 이라고 하면
안되더군요... 검퓨터이름\\Admin 이런식으로 정확한 사용자명만 되는군요...

MSDN에도 이런설명이 전혀 없고 도움말 예제가 아래와 같이 되어 있다는게 정말
황당하네요... >.<

<%@language=Jscript%>
<%
   var objSrvHTTP;
   objSrvHTTP = Server.CreateObject(\"MSXML2.ServerXMLHTTP.4.0\");
   objSrvHTTP.open (\"GET\",\"http://someotherserver/secure.asp\",false, _
                       \"testuser\", \"testpassword\";
   objSrvHTTP.send ();
   Response.ContentType = \"text/xml\";
   Response.Write (objSrvHTTP.responseXML.xml);
%>
----- 잘못된점...
1. \")\"가 빠졌다.
2. Jscrpt에서는  _ 로 줄바꿈을 할수 없다.
3. \"testuser\" 이런식으로는 절대 로그인할수 없다.

저는 \"testuser\" (아이디) 때문에 4시간 넘게 방황했습니다...
다른분들도 저처럼 고생하는 일 없었으면 좋겠네요....

* 정확한 로그인 사용법
MSXML2.XMLHTTP --> Admin 또는 myCom\\Admin
MSXML2.ServerXMLHTTP --> myCom\\Admin



--- XMLHTTP의 추가적인 사용기....

>단점은 멀티스레드가 안된다는겁니다. 그러므로 요즘은 serverXmlHttp가 권장됩니다.
>사용법은같습니다.

han님이 말씀하신 것이 정말 맞는것 같습니다....

낮은 버전의 xmlhttp 는 개발서버에 올려놓고 테스트 하는데...
잘못된 인터넷 주소를 가지고 이렇게 저렇게 하다보니 금방 다운이 되버리네요...
한번 다운된후에 다른 웹브라우져를 올려놓고 http://www.yahoo.co.kr을 쳐도
서버가 먹통犬六?... scriptTimeOut까지 완전히 해당페이지가 뻗어
버리는군요... xmlhttp4.0의 경우는 그나마 에러처리가 잘되는것 같구요...

ServerXMLHTTP.4.0 는 정말 좋네요. ^_^ 확실한 에러처리로 다운도 전혀
안되고...


MSDN에도 이와 비슷한 문제에 관련된 글이 있군요...
ServerXMLHTTP 를 쓰라는 말 같은데.. 영어가 딸려서....
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnaskdr/htm
l/askgui05012001.asp


언제나 도움주시는 Han님께 다시한번 감사드립니다.


==================================================================

관련글 더보기