在流星中,我正在向外部API(這一個 - http://sciencesoft.at/latex/?lang=en)做請求。流星http.call在服務器上無法正常工作
從客戶端(控制檯)執行Meteor.http.call時,它工作正常。當從服務器執行相同的操作時,Meteor.http.call似乎發送一個空主體呼叫(忽略其選項參數)。
我使用的完整和具體的代碼如下。在這裏,我試圖指出問題的原則:
在客戶端(控制檯)這工作得很好:
Meteor.http.call('PUT', 'http://sciencesoft.at/latex', {content: sentxml}, function (e,r) {console.log(r.content)}); //asynchronously
這裏sentxml包含XML請求的主體(如在該文檔中指定外部API)。
在服務器上,我有一個Meteor.method其中包含:
return Meteor.http.call('PUT', 'http://sciencesoft.at/latex', {content: sentxml}); //synchronously
當我在控制檯下:
Meteor.call('myMethod', sentxml, function (e,r) {
console.log(r.content);
});
我回去其中包含一個錯誤XML響應(同錯誤,就好像我在我的方法中省略了Meteor.http.call()的第三個參數)。
更具體,完整的代碼如下。
當我在控制檯下:
src= 'ABCD'; // I want to get png of this text.
latexsrc = '\\documentclass[12pt]{article}\\pagestyle{empty}\\begin{document}'+ src +'\\end{document}'; // minimalistic LaTeX source code
sentxml = '<?xml version="1.0" encoding="UTF-8"?><latex ochem="false"><dev dpi="120">png16m</dev><src><![CDATA['+latexsrc+']]></src><embeddedData>true</embeddedData></latex>'; // body of the xml request as described in the docs of http://sciencesoft.at/latex/?lang=en
Meteor.http.call('PUT','http://sciencesoft.at/latex', {content: sentxml}, function (e,r) {console.log(r.content)});
然後sentxml正確地發送到指定的URL,我得到一個正確的XML響應,其中包含了我所要求的數據。
但是,我想從服務器進行http調用。我有幾乎相同的代碼作爲上述一個流星方法內:
if (Meteor.isServer) {
Meteor.methods({
getLatexImgData: function (src) {
this.unblock();
var latexsrc = '\\documentclass[12pt]{article}\\pagestyle{empty}\\begin{document}'+ src +'\\end{document}';
var sentxml = '<?xml version="1.0" encoding="UTF-8"?><latex ochem="false"><dev dpi="120">png16m</dev><src><![CDATA['+latexsrc+']]></src><embeddedData>true</embeddedData></latex>';
var result = Meteor.http.call('PUT','http://sciencesoft.at/latex', {content: sentxml});
return result;
}
});
}
當我現在在做控制檯:
src = 'ABCD';
Meteor.call('getLatexImgData', src, function (e,r) {
console.log(r.content);
});
然後r.content包含錯誤消息「元素「SRC一個XML響應'是空的!沒有可用的LaTeX源代碼!「 (同樣的消息,就像http.call是由空的主體創建的一樣)。
感謝,params選項做的伎倆。但是爲什麼在客戶端異步執行http調用時不需要它? – PGlivi
來自客戶端的呼叫根本不起作用:'Origin http://domainname.com不被Access-Control-Allow-Origin.'允許,請嘗試使用meteor.com客戶端的javascript控制檯。 – mquandalle
Access-Control-Allow-Origin問題是由於跨站點HTTP請求安全設置。爲了在開發過程中擺脫錯誤,我使用'--disable-web-security'選項運行chrome。 – PGlivi