2013-07-09 183 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

相关问题