Polymer <core-xhr> - 没有POST params发送</core-xhr>

时间:2014-12-19 14:56:48

标签: post xmlhttprequest polymer

我拼命想通过POST将数据发送到express.js应用程序。 express.js应用程序工作正常,但无论出于何种原因,POST数据都没有正确发送到服务器:

var xhrConfig = {
  url: "http://localhost:3000/test",
  body: {"foo": "bar"},
  // body: JSON.stringify({"foo": "bar"}),
  // body: 'foo=bar',
  method: "POST"
};
document.createElement('core-xhr').request(xhrConfig);

我的express.js console.log(req.body)输出始终为{}。无论是否发送字符串或原始或JSON。我还尝试了params而不是body来确保。

我在jQuery中尝试了相同的操作,以排除在express.js路由中出现错误的可能性,但$.ajax({url: 'http://localhost:3000/test', data: {foo: 'bar'}, type: 'POST'});完全正常。

那么req,body总是空的原因是什么?有什么想法吗?

//编辑:

body: "foo=bar",
headers: {'Content-Type': 'application/x-www-form-urlencoded'},

这个有效,但有没有办法可以使用body: {"foo": "bar"}而不是先将其转换为foo=bar

3 个答案:

答案 0 :(得分:1)

据我所知,core-xhr是一个低级元素,而它的conf上的body对象不接受JS对象,而是接受你想要使用的字符串体。

对于您描述的用途,您可以尝试使用可以使用对象配置的更高级别元素core-ajaxcore-ajax上的文档:https://www.polymer-project.org/docs/elements/core-elements.html#core-ajax

<core-ajax
  auto
  url="http://localhost:3000/test"
  body='{"foo": "bar"}'
  handleAs="json"
  method: "POST"
  on-core-response="{{handleResponse}}"></core-ajax>

希望它有所帮助。如果您需要更详细的示例,请不要犹豫。

答案 1 :(得分:1)

看起来像是通过Express查看Content-Type标题以确定它具有哪种类型的主体,以下是适合我的。

this.$.xhr.request({
    url: "/my/url", 
    method: "POST",
    headers:{
        "Content-Type":"application/json"
    },
    body: JSON.stringify(survey), 
    callback: function(response){
        console.log(response);
    }
});

答案 2 :(得分:0)

我在Polymer上遇到了这个问题。这个问题非常令人沮丧,因为在core-xhr上没有关于Polymer的大量文档。

由于你已经自己回答了第一个问题,我将回答后者:是/否。如果您查看<core-xhr>的来源,它会直接将参数提供给xhr.send(params)。但是,有一个调用toQueryString的方法,它可以做你想做的事。

toQueryString: function(params) {
    var r = [];
    for (var n in params) {
      var v = params[n];
      n = encodeURIComponent(n);
      r.push(v == null ? n : (n + '=' + encodeURIComponent(v)));
    }
    return r.join('&');
  }