Javascript 如何通过XMLhttprequest向我自己的节点服务器发送一篇文章?
我试图通过XMLhttprequest将数据发送到节点。数据如下所示(/q/zmw:95632.1.9999.json)。我与节点的连接是正确的,但是,我得到的是一个空对象,所以我将标题设置为Content-Type-application/json,然后对数据进行字符串化。然而,节点给了我一个意外的标记“错误。我认为这是因为字符串,但是,如果我不字符串化数据,那么它会因为/“在数据中。如何使用纯Javascript正确发送数据。我想远离axios和jquery,因为我想更加精通普通javascript。我将通过组合url前缀和后缀对节点中的api进行最后调用 这是我的密码:Javascript 如何通过XMLhttprequest向我自己的节点服务器发送一篇文章?,javascript,json,ajax,node.js,Javascript,Json,Ajax,Node.js,我试图通过XMLhttprequest将数据发送到节点。数据如下所示(/q/zmw:95632.1.9999.json)。我与节点的连接是正确的,但是,我得到的是一个空对象,所以我将标题设置为Content-Type-application/json,然后对数据进行字符串化。然而,节点给了我一个意外的标记“错误。我认为这是因为字符串,但是,如果我不字符串化数据,那么它会因为/“在数据中。如何使用纯Javascript正确发送数据。我想远离axios和jquery,因为我想更加精通普通javasc
function getCityForecast(e){
//User selects option data from an early JSONP request.
var id = document.getElementById('cities');
var getValue = id.options[id.selectedIndex].value;
//Assembles the suffix for http request that I will do in Node.
var suffix = getValue + ".json";
var string = JSON.stringify(suffix);
console.log(suffix);
var xhr = new XMLHttpRequest();
xhr.open("POST", "http://localhost:3000/", true);
xhr.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
xhr.send(string);
}
Node.js代码:
var express = require('express');
var app = express();
var bodyParser = require('body-parser');
var path = require('path');
var request = require('request');
var http = require('http');
// ****************** Middle Ware *******************
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
app.use(express.static(__dirname + '/public'));
app.post('/', function(req, res){
console.log('working');
console.log(req.body);
});
app.listen(3000, function() { console.log('listening')});
目前,这对我很有效。我正在使用的RESTAPI需要一个令牌。您的可能没有,或者它可能正在寻找其他自定义标题。阅读API的文档。注意,您可能需要一个多边形填充/垫片来实现跨浏览器的平滑度(承诺)。我正在做GET,但这也适用于POST。您可能需要传递一个对象。如果要传递凭据以获取令牌,请不要忘记
window.btoa
。可以这样说:
httpReq('GET', device.address, path, device.token).then(function(data) {
//console.log(data);
updateInstrument(deviceId,path,data);
}, function(status) {
console.log(status);
});
function httpReq(method, host, path, token) {
if(method === "DELETE" || method === "GET"|| method === "POST" || method === "PUT" ){
var address = 'https://' + host + path;
return new Promise(function(resolve, reject) {
var xhr = new XMLHttpRequest();
xhr.open(method, address, true);
xhr.setRequestHeader("Accept", "application/json");
xhr.setRequestHeader ("X-auth-token", token);
//xhr.setRequestHeader ("Content-Type", "application/x-www-form-urlencoded");
xhr.onload = function() {
var status = xhr.status;
if (status == 200 || status == 201 || status == 202) {
resolve(xhr.response);
}
// this is where we catch 404s and alert what guage or resource failed to respond
else {
reject(status);
}
};
xhr.send();
});
} else {
console.log('invalid method');
}
};
我发现这是我的错误,这是我的问题。我试图发送一个字符串而不是一个对象。所以它不是像这样合适的JSON:
var string = JSON.stringify(suffix);
为了纠正这种情况,我补充说:
var newObj = JSON.stringify({link : suffix});
这使我的帖子成功了,因为我现在发送了一个对象,因此使用了单词Javascript对象表示法。请参阅
FormData
对象,以便为帖子请求以正确的格式放置数据:或者只使用XMLHttpRequest
查看:看起来它将成功创建一个包含文件名的字符串,JSON对其进行编码,然后使用正确的HTTP头将其发送到服务器。我不知道您试图发送的数据是什么,而且您还没有共享服务器端代码,这就是错误的来源。您的问题非常不清楚。您没有向Node.js发送请求,而是将其发送到HTTP服务器,请求并不关心该服务器是Node、java、go服务器还是反向代理。@Quentin非常感谢您的提问。我忘了实际创建一个要字符串化的对象。当你说“创建一个包含文件名的字符串”时,我意识到我只是在创建一个字符串,而不是一个对象。