【问题标题】:MeteorJS: Restful API works at Meteor Shell but not Meteor MethodsMeteorJS:Restful API 适用于 Meteor Shell,但不适用于 Meteor 方法
【发布时间】:2016-01-02 19:19:06
【问题描述】:

我正在使用 HTTP.call 对第三方服务提供商进行 Restful API 调用。

我在服务器端创建了相关的 Meteor 方法并从客户端调用它们。

我对 GET 调用没有任何问题。但是对于 POST 和 PUT 调用,它会在客户端返回内部服务器错误 (500),并在服务器上返回 405 Method not allowed。

当我尝试调试它时,我打开 Meteor Shell 并在那里调用 POST 和 PUT 调用,它们可以工作。但是当我从客户端调用方法时它们不会。

我有客户端...

Meteor.call('cancelCall', function (err, res) {
  if (err) {
    console.log(err);
  } else {
    console.log(res);
  }
});

还有服务器端...

Meteor.methods('cancelCall', function () {
 var url = 'http://example.com/some/params/cancel';
 var result = HTTP.call('PUT', url);
 return result;
});

我直接在 Meteor Shell 中输入的内容...

HTTP.call('PUT', 'http://example.com/some/params/cancel');

是什么导致了这种行为以及如何解决它?

非常感谢。

【问题讨论】:

  • 您在上面的示例代码中缺少右括号/括号
  • 谢谢,那只是我的错字
  • 这一切对我来说都是正确的。我假设您只是在服务器上定义方法,对吧?
  • @ChristianFritz 是的,这些方法是从服务器定义并从客户端调用的。不知道为什么它只能在 Meteor shell 中工作
  • 您能否提供在浏览器控制台中调用它们的错误/返回值?

标签: api rest meteor


【解决方案1】:

无需将这些调用包装在方法中,因为可以直接在客户端调用 HTTP.call(和相关方法)。

Docs:调用签名如下:

HTTP.call('PUT', url, [callOptions], [asyncCallback])

在服务器上你可以省略 asyncCallback 参数,调用只是阻塞,直到它有结果。

在客户端这不能省略,因为只有异步调用是可能的。

您也没有为 PUT (/POST) 方法提供任何数据。这应该像这样在 callOptions 参数中传递:

HTTP.call('PUT', url, {params: {user: userId}}, callbackFunc)

【讨论】:

  • 你说的都是真的,但我不认为它回答了这个问题。
  • 好的,所以有一个混合的建议(你不需要为此使用 Meteor.method)和一个可能的解决方案(你需要通过 callOptions 参数提供参数,而不是作为网址的一部分)。
  • 我猜如果访问不提供 CORS 标头的 API,Meteor.method 是一种可接受的解决方法
  • 我可以在没有参数的情况下在 Meteor Shell 中运行 PUT 调用,因为路径在链接中间有参数并且它以 /cancel 结尾。另一方面,我可以通过设置标题和内容来运行 POST 调用,但同样,它只适用于 shell
【解决方案2】:

但是对于 POST 和 PUT 调用,它返回内部服务器错误 (500) 在客户端和服务器不允许的 405 方法。

当您在服务器端发出 POST 和 PUT 请求时,您会收到错误 405 返回。这告诉您您正在调用的 api 不接受 POST 和 PUT 请求。

这部分是猜测:

当您通过 Meteor.method 调用从客户端发出这些相同的请求时,您的应用服务器正在发出请求,并从远程服务器收到 405 错误。然后,这会导致您的服务器将 500(内部服务器错误)返回给客户端。

【讨论】:

  • 但是我可以在 Meteor Shell 中运行 POST & PUT,它也适用于 Advanced Rest Client(Chrome 扩展)和 Postman。而这些调用都是基于我们合作伙伴提供的API文档。
  • 那么你是什么时候拿到 405 的?
  • 在浏览器控制台,在服务器端调用Meteor方法,返回405(终端),500(浏览器控制台)
猜你喜欢
  • 2014-04-18
  • 2016-07-16
  • 2016-04-20
  • 1970-01-01
  • 1970-01-01
  • 2016-07-19
  • 1970-01-01
  • 2017-05-12
  • 2014-10-28
相关资源
最近更新 更多