2013-07-09 185 views
1

在流星中,我正在向外部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是由空的主體創建的一樣)。

回答

0

我認爲這是你的API的問題,而不是流星。

這HTTP調用似乎爲我(服務器)工作:

Meteor.http.call('PUT','http://sciencesoft.at/latex', {content: sentxml, params: {src: latexsrc}}); 
+0

感謝,params選項做的伎倆。但是爲什麼在客戶端異步執行http調用時不需要它? – PGlivi

+0

來自客戶端的呼叫根本不起作用:'Origin http://domainname.com不被Access-Control-Allow-Origin.'允許,請嘗試使用meteor.com客戶端的javascript控制檯。 – mquandalle

+0

Access-Control-Allow-Origin問題是由於跨站點HTTP請求安全設置。爲了在開發過程中擺脫錯誤,我使用'--disable-web-security'選項運行chrome。 – PGlivi

相關問題