基本 HTTP 请求

HTTP 已经被广泛大量使用,尽管 HTTP 有多种请求方式,但是万变不离其宗,我们先以基本的4个请求方法为例子,逐步讲解一下更多的复杂应用场景。

以下例子都会在 controller 代码中对 https://httpbin.org 发起请求来完成。

GET

读取数据几乎都是使用 GET 请求,它是 HTTP 世界最常见的一种,也是最广泛的一种,它的请求参数也是最容易构造的。

  1. // app/controller/npm.js
  2. class NpmController extends Controller {
  3. async get() {
  4. const ctx = this.ctx;
  5. const result = await ctx.curl('https://httpbin.org/get?foo=bar');
  6. ctx.status = result.status;
  7. ctx.set(result.headers);
  8. ctx.body = result.data;
  9. }
  10. }
  • GET 请求可以不用设置 options.method 参数,HttpClient 的默认 method 会设置为 GET
  • 返回值 result 会包含 3 个属性:status, headersdata
    • status: 响应状态码,如 200, 302, 404, 500 等等
    • headers: 响应头,类似 { 'content-type': 'text/html', ... }
    • data: 响应 body,默认 HttpClient 不会做任何处理,会直接返回 Buffer 类型数据。一旦设置了 options.dataType,HttpClient 将会根据此参数对 data 进行相应的处理。

完整的请求参数 options 和返回值 result 的说明请看下文的 options 参数详解 章节。

POST

创建数据的场景一般来说都会使用 POST 请求,它相对于 GET 来说多了请求 body 这个参数。

以发送 JSON body 的场景举例:

  1. // app/controller/npm.js
  2. class NpmController extends Controller {
  3. async post() {
  4. const ctx = this.ctx;
  5. const result = await ctx.curl('https://httpbin.org/post', {
  6. // 必须指定 method
  7. method: 'POST',
  8. // 通过 contentType 告诉 HttpClient 以 JSON 格式发送
  9. contentType: 'json',
  10. data: {
  11. hello: 'world',
  12. now: Date.now(),
  13. },
  14. // 明确告诉 HttpClient 以 JSON 格式处理返回的响应 body
  15. dataType: 'json',
  16. });
  17. ctx.body = result.data;
  18. }
  19. }

下文还会详细讲解以 POST 实现 Form 表单提交和文件上传的功能。

PUT

PUT 与 POST 类似,它更加适合更新数据和替换数据的语义。除了 method 参数需要设置为 PUT,其他参数几乎跟 POST 一模一样。

  1. // app/controller/npm.js
  2. class NpmController extends Controller {
  3. async put() {
  4. const ctx = this.ctx;
  5. const result = await ctx.curl('https://httpbin.org/put', {
  6. // 必须指定 method
  7. method: 'PUT',
  8. // 通过 contentType 告诉 HttpClient 以 JSON 格式发送
  9. contentType: 'json',
  10. data: {
  11. update: 'foo bar',
  12. },
  13. // 明确告诉 HttpClient 以 JSON 格式处理响应 body
  14. dataType: 'json',
  15. });
  16. ctx.body = result.data;
  17. }
  18. }

DELETE

删除数据会选择 DELETE 请求,它通常可以不需要加请求 body,但是 HttpClient 不会限制。

  1. // app/controller/npm.js
  2. class NpmController extends Controller {
  3. async del() {
  4. const ctx = this.ctx;
  5. const result = await ctx.curl('https://httpbin.org/delete', {
  6. // 必须指定 method
  7. method: 'DELETE',
  8. // 明确告诉 HttpClient 以 JSON 格式处理响应 body
  9. dataType: 'json',
  10. });
  11. ctx.body = result.data;
  12. }
  13. }