💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
>[success] # 发起http 请求 1. `http.request`是 Node.js 中用于发起 HTTP 请求的低级 API。`axios`库在 Node.js 环境下底层基于 Node.js 的`http`模块实现了发送 HTTP 请求的功能 ,在浏览器中,`axios`使用的是封装`xhr`; `http.request(options[, callback])`方法中,`options`参数是一个 JSON 对象,用于指定请求的一些属性,包括: * `protocol`:请求协议,默认为`'http:'`。 * `hostname`:请求主机名或 IP 地址。 * `port`:请求端口号,默认为`80`。 * `path`:请求路径,默认为`'/'`。 * `method`:请求方法,例如`'GET'`、`'POST'`等,默认为`'GET'`。 * `headers`:请求头,是一个对象,其中键值对分别表示请求头名称和值。 `callback`参数是一个回调函数,用于处理响应结果。回调函数有一个参数`response`,即响应对象,可以通过`response`对象获取一些响应信息和数据流。 ~~~ const http = require('http'); const options = { hostname: 'localhost', port: 8080, path: '/api/v1/login', method: 'POST', headers: { 'Content-Type': 'application/json', }, }; const req = http.request(options, (res) => { console.log(`请求状态:${res.statusCode}`); console.log(`响应头:${JSON.stringify(res.headers)}`); res.setEncoding('utf8'); res.on('data', (chunk) => { console.log(`响应数据:${chunk}`); }); res.on('end', () => { console.log('响应数据接收完毕。'); }); }); req.on('error', (e) => { console.error(`请求遇到问题:${e.message}`); }); const postData = JSON.stringify({ username: 'admin', password: '123456' }); // 往请求体中写入数据 req.write(postData); // `req.end()`方法提交请求 req.end(); ~~~ * 案例二 ~~~ // 1.使用http模块发送get请求 // http.get('http://localhost:8000', (res) => { // // 从可读流中获取数据 // res.on('data', (data) => { // const dataString = data.toString() // const dataInfo = JSON.parse(dataString) // console.log(dataInfo) // }) // }) // 2.使用http模块发送post请求 const req = http.request({ method: 'POST', hostname: 'localhost', port: 8000 }, (res) => { res.on('data', (data) => { const dataString = data.toString() const dataInfo = JSON.parse(dataString) console.log(dataInfo) }) }) // 必须调用end, 表示写入内容完成 req.end() [TOC] ~~~ 2. `http.request()`方法创建了一个 HTTP 请求对象`req`,并使用`req.write()`方法向请求主体中写入 JSON 数据,最后调用`req.end()`方法提交请求。可以看到,在通过`req.write()`方法写入数据后,数据会保存到请求主体中,并在发送请求时一起发送到服务器端。 >[danger] ##### 说明Content-Type 1. `'application/json'`作为`Content-Type`的值。如果 POST 的是表单数据或其他类型的数据,这个字段的值也会相应不同 2. 'Content-Type' 是 HTTP 协议中的一个重要字段,用于指示发送给接收者的实体的媒体类型。具体说,它告诉接收方发出请求或者响应的这个实体是有哪种 MIME 类型的数据。 3. MIME(Multipurpose Internet Mail Extensions)类型,是互联网上常用的一种数据格式标准。它定义了一组类型名称和相应的格式(Content-Type),供我们在互联网上交换不同类型的文件数据。 **常见的 MIME 类型包括**: * text/plain:文本文件,没有格式控制。 * text/html:HTML 文件,可以包含 HTML 标签等富文本信息。 * application/json:JSON 格式数据,如 API 返回的数据。 * application/x-www-form-urlencoded:表单提交的数据,表示数据被编码成以'&' 分隔的键\-值对,同时以'=' 分隔键和值 * multipart/form-data:文件上传的数据。 当我们发送请求时,需要根据要发送的数据类型设置 'Content-Type' 字段。以 POST 表单请求为例,Content-Type 的数据类型通常是`application/x-www-form-urlencoded`或`multipart/form-data`。 对于`application/x-www-form-urlencoded`数据类型,数据将被编码成 key-value 的形式,如: ~~~ POST / HTTP/1.1 Host: example.com Content-Type: application/x-www-form-urlencoded message=Hello+World! ~~~ 而`multipart/form-data`是用于发送带有文件的表单数据的常用数据格式,如: ~~~ POST /upload HTTP/1.1 Host: example.com Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryxxxxxx ------WebKitFormBoundaryxxxxxx Content-Disposition: form-data; name="title" My Title ------WebKitFormBoundaryxxxxxx Content-Disposition: form-data; name="description" A simple description here ------WebKitFormBoundaryxxxxxx Content-Disposition: form-data; name="file"; filename="test.txt" Content-Type: text/plain Here is some test text. ------WebKitFormBoundaryxxxxxx-- ~~~ 其中,`boundary`是分隔符,必须要在请求头中指定。 总之,了解 'Content-Type' 字段的作用和不同 MIME 类型的用途,可以帮助我们更好地使用 HTTP 协议来获取和发送数据。