>  기사  >  백엔드 개발  >  XMLHTTP를 사용하여 매우 긴 XML 형식 데이터를 보내는 세부 사항

XMLHTTP를 사용하여 매우 긴 XML 형식 데이터를 보내는 세부 사항

黄舟
黄舟원래의
2017-03-04 17:24:471301검색

ASP 형식의 TEXTAREA와 같이 POST 데이터의 일부로 IIS 서버에 대량의 XML을 보낼 때 예상치 못한 결과가 나타날 수 있습니다. 서버에서 데이터를 처리할 때 데이터 처리 방식으로 인해 오류가 발생할 수 있습니다. 그 이유는 서버에 데이터를 다시 제출할 때 POST 필드에 (데이터) 크기 제한이 있기 때문입니다. 이것의 목적은 침입자가 서비스 거부(DoS) 공격으로 서버에 엄청난 양의 데이터를 보내는 것을 방지하는 것입니다.

이 제한은 또한 귀하의 능력을 제한합니다. 하지만 이 문제를 해결할 수 있는 방법이 있습니다. FORM 제출을 통한 데이터 전송에만 국한되지 않는 경우 xmlhttp 개체(Microsoft XML 세트의 DOM 개체)를 사용하여 필요한 XML을 보낼 수 있습니다.

var oXMLHTTP = new ActiveXObject("Microsoft.XMLHTTP");
oXMLHTTP.open("POST", "xml_handler.asp", false);
oXMLHTTP.send(xml_to_send);

Request 개체는 IStream 인터페이스에서는 DOMDocument 개체의 load() 메서드를 사용하여 제출할 XML을 로드할 수 있습니다.

Dim oDOM
Set oDOM = Server.CreateObject("MSXML2.DOMDocument")
oDOM.load Request

FORM을 통해서만 제출하도록 제한되어 있는 경우 이 제한을 극복할 수 있습니다. 여러 개의 TEXTAREA 또는 INPUT을 제출하면 서버가 FORM 데이터를 수신하자마자 처음 두 개를 다시 어셈블할 수 있습니다.

var MAXLEN = 90000;
var oForm = document.createElement("FORM");
oFORM.method = "POST";
oFORM.action = "xml_handler.asp";
oFORM = document.body.appendChild(oFORM);
var s = document.someForm.txtXML.value;
if (s.length > MAXLEN) {
    while (s.length > MAXLEN) {
        var o = document.createElement("INPUT");
        o.type = "hidden";
        o.name = "txtXML";
        o.value = s.substr(0, MAXLEN);
        oFORM.appendChild(o);
        s = s.substr(MAXLEN);
    }
    var o = document.createElement("INPUT");
    o.type = "hidden";
    o.name = "txtXML";
    o.value = s.substr(0, MAXLEN);
    oFORM.appendChild(o);
} else {
    var o = document.createElement("INPUT");
    o.type = "hidden";
    o.name = "txtXML";
    o.value = s;
    oFORM.appendChild(o);
}


이 코드는 데이터를 제출하고 BODY 요소 내에 배치합니다. 그런 다음 서버에 제출할 XML의 길이를 확인합니다. 이 XML은 someForm 내부의 txtXML이라는 TEXTAREA에 있습니다.

XML이 90,000자 MAXLEN보다 큰 경우 이 코드는 여러 개의 숨겨진 INPUT 요소를 생성하고 값 속성을 90,000자 XML 데이터로 설정하거나 데이터를 여러 부분으로 분할하려면 XML 끝에 값을 추가하세요. 이 XML의 크기가 MAXLEN보다 작으면 이 코드는 INPUT을 생성하고 이에 따라 값을 설정합니다. 그런 다음 이 데이터는 처리를 위해 서버에 제출됩니다.

새 양식의 각 필드에 동일한 이름(txtXML)을 할당한 것을 눈치채셨을 것입니다. 이렇게 하면 제출될 수 있는 다른 데이터와 XML 데이터를 분리하는 데 도움이 되며 XML 데이터를 쉽게 재구성할 수 있습니다. 데이터를 재구성할 때 필드의 데이터를 연결하는 간단한 루프가 필요합니다.

Dim str, fld
For Each fld In Request.Form("txtXML")
    str = str & fld
Next


각 FORM 요소에 대해 필드 세트가 생성되었으므로 필드를 반복할 수 있습니다. 같은 이름으로. 클라이언트 측에서 올바른 순서로 FORM 요소를 생성하는 한 필드가 탐색되는 순서에 대해 걱정할 필요가 없습니다. 이는 FORM의appendChild() 메소드를 통해 쉽게 수행할 수 있습니다.

클라이언트에서는 데이터가 왼쪽에서 오른쪽, 위에서 아래로 제출되므로 FORM 요소 끝에 INPUT 요소를 추가하면 항상 동일한 순서로 데이터가 수신됩니다.

클라이언트 시스템에서 서버로 대용량 Excel 데이터를 전송하는 등 대용량 데이터 솔루션을 구현하려는 경우 FORM 제출을 사용할지, 아니면 데이터를 논리적으로 전송할지 다시 고려해야 합니다. 더 작은 부분으로. 파일 유형 INPUT 요소를 사용할 수 없으므로 가장 창의적인 솔루션은 데이터를 로컬에서 XML로 변환한 다음 XML 데이터를 서버에 제출하는 것입니다. 그러면 데이터는 추가 처리가 필요할 때까지 서버에 저장됩니다.

물론 이 문제를 처리하는 더 좋은 방법이 있을 수 있습니다. 하지만 시간이 많지 않을 때 필요한 것은 빠르고 사용 가능한 솔루션뿐입니다.

위 내용은 XMLHTTP를 사용하여 매우 긴 XML 형식의 데이터를 보내는 내용입니다. 자세한 내용은 PHP 중국어 사이트(www.php.cn)를 참고해주세요!


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.