我们如何在 NodeJS 中实现这样的 HTTP 请求。
curl https://www.googleapis.com/urlshortener/v1/url \ -H 'Content-Type: application/json' \ -d '{"longUrl": "http://www.google.com/"}'
Mikeal 的请求 模块可以很容易地做到这一点:
var request = require('request'); var options = { uri: 'https://www.googleapis.com/urlshortener/v1/url', method: 'POST', json: { "longUrl": "http://www.google.com/" } }; request(options, function (error, response, body) { if (!error && response.statusCode == 200) { console.log(body.id) // Print the shortened url. } });
举个简单的例子
var request = require('request'); //Custom Header pass var headersOpt = { "content-type": "application/json", }; request( { method:'post', url:'https://www.googleapis.com/urlshortener/v1/url', form: {name:'hello',age:25}, headers: headersOpt, json: true, }, function (error, response, body) { //Print the Response console.log(body); });
As the official documentation says:
Body-tity body 用于 PATCH、 POST 和 PUT 请求。必须是缓冲区、字符串或 ReadStream。如果 json 为 true,那么 body 必须是可 JSON 序列化的对象。
当发送 JSON 时,您只需要将它放在选项的主体中。
var options = { uri: 'https://myurl.com', method: 'POST', json: true, body: {'my_date' : 'json'} } request(options, myCallback)
由于某种原因,今天只有这个对我有用。所有其他的变体都出现在来自 API 的 坏 Json错误中。
Besides, yet another variant for creating required POST request with JSON payload.
request.post({ uri: 'https://www.googleapis.com/urlshortener/v1/url', headers: {'Content-Type': 'application/json'}, body: JSON.stringify({"longUrl": "http://www.google.com/"}) });
使用带有标题和文章的请求。
var options = { headers: { 'Authorization': 'AccessKey ' + token, 'Content-Type' : 'application/json' }, uri: 'https://myurl.com/param' + value', method: 'POST', json: {'key':'value'} }; request(options, function (err, httpResponse, body) { if (err){ console.log("Hubo un error", JSON.stringify(err)); } //res.status(200).send("Correcto" + JSON.stringify(body)); })
由于其他答案所使用的 request模块已被废弃,我建议切换到 node-fetch:
request
node-fetch
const fetch = require("node-fetch") const url = "https://www.googleapis.com/urlshortener/v1/url" const payload = { longUrl: "http://www.google.com/" } const res = await fetch(url, { method: "post", body: JSON.stringify(payload), headers: { "Content-Type": "application/json" }, }) const { id } = await res.json()
Axios 更小更好:
const data = JSON.stringify({ message: 'Hello World!' }) const url = "https://localhost/WeatherAPI"; axios({ method: 'POST', url, data: JSON.stringify(data), headers:{'Content-Type': 'application/json; charset=utf-8'} }) .then((res) => { console.log(`statusCode: ${res.status}`) console.log(res) }) .catch((error) => { console.error(error) })
也检查 在 Node.js 中制作 HTTP 请求的5种方法
Https://www.twilio.com/blog/2017/08/http-requests-in-node-js.html
参考:
Https://nodejs.dev/learn/make-an-http-post-request-using-nodejs
Https://flaviocopes.com/node-http-post/
https://stackabuse.com/making-asynchronous-http-requests-in-javascript-with-axios/