2013-12-10 5 views
3

내 mediawiki에서 페이지를 가져 오기 위해 스크립트 (js)를 만듭니다. "잘못된 토큰"이 있습니다. 뭐가 문제 야 ?Mediawiki의 가져 오기 페이지

var xhttp = new ActiveXObject("Microsoft.XmlHttp"); 
xmlHttp2.open("POST", url, false); 
xmlHttp2.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); 
xmlHttp2.send("action=query&prop=info&intoken=import&titles=Test2"); 
var result2 = xmlHttp2.responseText; 
var resultTokenImport = extractTokenImport(result2); 
//return me 'dsa7u6ds6u7asd76das67sad+\' (more or less :D) 

xmlHttp2.open("POST", url, false); 
xmlHttp2.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); 
xmlHttp2.send("action=import&format=xml&xml="+dump+"&token="+resultTokenImport); 

음, 문제는 '수입'이 필요 토큰의 '다른'종류가.

지금, 내 문제는 다음과 같습니다

xmlHttp2.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); 

"NOFILE"나에게 오류를주고이 코드 :

누락 :

xmlHttp2.setRequestHeader("Content-Type", "multipart/form-data"); 

그것은 나에게를 보내 multipart/form-data POST 데이터의 경계가 인 경우 Unknown on line 0

답변

1

"파일 없음"이라고 말하면 POST 본문에 파일이 있어야합니다. FormData을 사용하여 쉽게 POST 할 수 있습니다.

는에서 예 여기

 
    xml  - Uploaded XML file 
       Must be posted as a file upload using multipart/form-data 

/api.php 나를 위해 무엇을 노력하고있다 인용합니다. 단순화를 위해, 다음 코드는 미디어 위키의 자바 스크립트의 사용을 텍스트 영역에서 읽고하게된다 포함

var apiUrl = mw.util.wikiScript('api'); 
var onreadystatechange = function() { 
    if (4 !== this.readyState) return; 
    if (200 === this.status) { 
    console.log(this.response); 
    } 
}; 

function continueWithToken (token) { 
    var fd = new FormData(); 
    var xhr = new XMLHttpRequest(); 
    // First argument is an array! 
    var bXml = new Blob([$('textarea').val()], { 
      type: 'text/xml' 
     }); 
    fd.append('format', 'json'); 
    fd.append('action', 'import'); 
    // Third parameter is not required but 
    // You're likely on the safe side using it 
    fd.append('xml', bXml, 'file.xml'); 
    fd.append('token', token); 

    xhr.onreadystatechange = onreadystatechange; 
    xhr.open('POST', apiUrl); 
    xhr.send(fd); 
} 

$.get(apiUrl, { 
    format: 'json', 
    type: 'import', 
    action: 'tokens' 
}).done(function(r) { 
    var token = r.tokens.importtoken; 
    continueWithToken(token); 
}); 

이 단지 최소한의 구현입니다. 오류 처리를 잊지 마십시오. 업로드 파일을 내보내기 용 파일로 사용하고 Blob 및 FormData를 충분히 지원하지 않는 구형 브라우저에서 작동하게하려면 양식을 작성하십시오! 양식의 타겟은 iframe 일 수 있으므로 빈 API 결과 페이지를 사용자에게 노출시키지 않고도 응답을 읽을 수 있습니다.

예상 응답

{"import":[{"ns":0,"title":"Main Page2","revisions":1}]} 

완료 요청

클라이언트에 의해 구성되고, 참조 용 서버로 전송되는 요청. 파일이 POST 본문에 있음을 유의하십시오. 당신이 URL 인코딩 보낼 수 있지만 multipart/form-data 될 것이라고 주장 때문에 오류은 "다중/폼 데이터를 POST 데이터의 누락 경계"에 관해서는

POST http://localhost/api.php HTTP/1.1 
Host: localhost 
User-Agent: <ua string> 
Accept-Language: de,en-US;q=0.7,en;q=0.3 
Accept-Encoding: gzip, deflate 
Referer: http://localhost/index.php?title=Special:Export&action=submit 
Content-Length: 3231 
Content-Type: multipart/form-data; boundary=---------------------768648126486 
Cookie: <redacted>; mwdbUserID=1; mwdbUserName=Rillke 
Connection: keep-alive 
Pragma: no-cache 
Cache-Control: no-cache 

-----------------------768648126486 
Content-Disposition: form-data; name="format" 

json 
-----------------------768648126486 
Content-Disposition: form-data; name="action" 

import 
-----------------------768648126486 
Content-Disposition: form-data; name="xml"; filename="file.xml" 
Content-Type: text/xml 

<mediawiki ...schemas... version="0.8" xml:lang="en"> 
    <siteinfo> 
    <sitename>Sample Wiki</sitename> 
    <!-- .... --> 
</mediawiki> 
-----------------------768648126486 
Content-Disposition: form-data; name="token" 

XX39e9fd22a9de7675c71eadcfd2XXXX+\ 
-----------------------768648126486-- 

이입니다. MediaWiki가 헤더에서 경계를 찾고 있지만 찾을 수 없습니다.