【问题标题】:JS equivalent of curl -X PUT -d 'data={"keyname":"keyvalue"}'JS 相当于 curl -X PUT -d 'data={"keyname":"keyvalue"}'
【发布时间】:2012-11-19 06:25:36
【问题描述】:

我正在尝试使用 XMLHttpRequest 发送 PUT 请求,但我不确定如何传递参数。

我要发送的 curl 版本是:

$ curl -u me@myurl.com -X PUT -d 'data={"keyname":"keyvalue"}' https://api.myurl.com/v1/action

我有一个身份验证令牌可以拨打电话,所以我正在尝试这样:

var xhr = new XMLHttpRequest();
xhr.open("PUT", ROOT_URL + link + "?auth_token=" + token, true);
xhr.setRequestHeader("Cache-Control", "no-cache");
var data = 'data={"keyname":"' + keyvalue + '"}';
xhr.send(data);

但这似乎不正确,因为我收到一个 500 服务器错误提示

 "data={\"keyname\":\"keyvalue\"}" does not have a valid root.

关于我做错了什么有什么想法吗?

【问题讨论】:

  • 您可能必须将Content-Type 请求标头设置为application/x-www-form-urlencoded(以便服务器知道如何解释数据)。
  • 只需阅读 CURL man 页面,它会说在使用 -d 时内容类型标头会自动设置为该值。所以这可能确实是问题所在。但请注意,服务器也可能直接接受 JSON,在这种情况下,您真的只想发送 JSON.stringify(some_object) 并将内容类型标头设置为 application/json

标签: javascript curl xmlhttprequest


【解决方案1】:

那是因为"data={\"keyname\":\"keyvalue\"}" 不代表一个有效的 json 对象。

尝试使用

  xhr.send({keyname:keyvalue});, passing a valid json object

或者

  var data = {keyname:keyvalue};
  xhr.send(JSON.stringify(data));, passing a json object string representation 

【讨论】:

  • "There is no such thing as a JSON object"。您传递的是一个 JavaScript 对象,它很可能会转换为字符串 [object Object]。如果要发送 JSON,则必须将对象转换为 JSON,您是否在第二个示例中显示。在 JavaScript 中,{keyname:keyvalue} 是一个对象,而不是 JSON。此外,OP 似乎使用 CURL 成功发送了data={"keyname":"keyvalue"}
猜你喜欢
  • 1970-01-01
  • 2013-07-14
  • 2021-12-16
  • 2015-01-26
  • 1970-01-01
  • 2013-06-29
  • 1970-01-01
  • 2016-08-11
  • 2020-12-23
相关资源
最近更新 更多