首页 > 其他分享 >记录--get请求参数放在body中?

记录--get请求参数放在body中?

时间:2023-12-20 18:55:06浏览次数:39  
标签:body 请求 get -- request 参数 data

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助

 

1、背景

与后端对接口时,看到有一个get请求的接口,它的参数是放在body中的

******get请求参数可以放在body中??

随即问了后端,后端大哥说在postman上是可以的,还给我看了截图

 

可我传参怎么也调不通!

下面就来探究到底是怎么回事

2、能否发送带有body参数的get请求

项目中使用axios来进行http请求,使用get请求传参的基本姿势:

// 参数拼接在url上
axios.get(url, {
  params: {}
})

如果想要将参数放在body中,应该怎么做呢?

查看axios的文档并没有看到对应说明,去github上翻看下axios源码看看

lib/core/Axios.js文件中

 可以看到像deletegetheadoptions方法,它们只接收两个参数,不过在config中有一个data

熟悉的post请求,它接收的第二个参数data就是放在body的,然后一起作为给this.request作为参数

所以看样子get请求应该可以在第二个参数添加data属性,它会等同于post请求的data参数

顺着源码,再看看lib/adapters/xhr.js,上面的this.request最终会调用这个文件封装的XMLHttpRequest

export default isXHRAdapterSupported && function (config) {
  return new Promise(function dispatchXhrRequest(resolve, reject) {
    let requestData = config.data

    // 将config.params拼接在url上
    request.open(config.method.toUpperCase(), 
                 buildURL(fullPath, config.params, config.paramsSerializer), true);
    
    // 省略若干代码
    ...

    // Send the request
    request.send(requestData || null);
  });
}

最终会将data数据发送出去

所以只要我们传递了data数据,其实axios会将其放在body发送出去的

2.1 实战

本地起一个koa服务,弄一个简单的接口,看看后端能否接收到get请求的body参数

router.get('/api/json', async (ctx, next) => {
	console.log('get请求获取body: ', ctx.request.body)
  
	ctx.body = ctx.request.body
})

router.post('/api/json', async (ctx, next) => {
	console.log('post请求获取body: ', ctx.request.body)

	ctx.body = ctx.request.body
})

为了更好地比较,分别弄了一个getpost接口

前端调用接口:

const res = await axios.get('/api/json', {
  data: {
    id: 1,
    type: 'GET'
  }
})


const res = await axios.post('/api/json', {
  data: {
    id: 2,
    type: 'POST'
  }
})
console.log('res--> ', res)

axiossend处打一个断点

可以看到数据已经被放到body中了

后端已经接收到请求了,但是get请求无法获取到body

结论:

  • 前端可以发送带body参数的get请求,但是后端接收不到
  • 这就是接口一直调不通的原因

3、这是为何呢?

我们查看WHATGW标准,在XMLHttpRequest中有这么一个说明:

大概意思:如果请求方法是GETHEAD ,那么body会被忽略的

所以我们虽然传递了,但是会被浏览器给忽略掉

这也是为什么使用postman可以正常请求,但是前端调不通的原因了

因为postman并没有遵循WHATWG的标准,body参数没有被忽略

3.1 fetch是否可以?

fetch.spec.whatwg.org/#request-cl…

答案:也不可以,fetch会直接报错

总结

  1. 结论:浏览器并不支持get请求将参数放在body
  2. XMLHTTPRequest会忽略body参数,而fetch则会直接报错

本文转载于:

https://juejin.cn/post/7283367128195055651

如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。

 

标签:body,请求,get,--,request,参数,data
From: https://www.cnblogs.com/smileZAZ/p/17917253.html

相关文章

  • A. Problemsolving Log
    原题链接结合样例读题1.输入序列代表每一时刻思考的题目2.如果思考的题目时长超过给定值就代表题目解决。综上如果一个字符的出现次数大于给定值就代表解决了这个问题。代码#include<bits/stdc++.h>usingnamespacestd;intmain(){intt;cin>>t;while(t......
  • Vite4+Typescript+Vue3+Pinia 从零搭建(7) - request封装
    项目代码同步至码云weiz-vue3-template基于axios封装请求,支持多域名请求地址安装npmiaxios封装utils目录下新建request文件夹,并新建index.ts、request.ts和status.ts文件。1.status.ts文件主要是封装状态码exportconstErrMessage=(status:number|s......
  • npm设置源
    npm设置源时间:2023-06-3007:54:43(部分内容来自网络,其真实性存疑,为了避免对您造成误导,请谨慎甄别。)要设置npm源,您可以使用以下命令:1.查看当前的npm源:npmconfiggetregistry2.设置npm源为官方源(https://registry.npmjs.org/):npmconfigsetregistryhttp......
  • 如何解决MySQL Workbench中的错误Error Code: 1175
    错误描述:在MySQLWorkbench8.0中练习SQL语句时,执行一条update语句,总是提示如下错误:ErrorCode:1175.YouareusingsafeupdatemodeandyoutriedtoupdateatablewithoutaWHEREthatusesaKEYcolumnTodisablesafemode,toggletheoptioninPreferences->SQ......
  • 【算法】决策树算法:ID3
    importmathfromcollectionsimportCounter#创建数据集defcreate_dataset():dataset=[#年龄,工作,房子,信用,标签['青年',0,0,'一般','0'],['青年',0,0,'好','0'],[�......
  • pycharm中间件简介
    个人理解:#中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出。因为改变的是全局,所以需要谨慎实用,用不好会影响到性能#django内置中间件 'django.middleware.security.SecurityMiddleware','django.contrib.s......
  • Apipost:一键生成接口文档
    你是否经常遇到接口开发过程中的各种问题?或许你曾为接口测试与调试的繁琐流程而烦恼。不要担心!今天我将向大家介绍一款功能强大、易于上手的接口测试工具——Apipost,并带你深入了解如何玩转它,轻松实现接口测试与调试。什么是Apipost?Apipost是一款API全生命周期管理平台,它提供了......
  • 使用 Amazon Fault Injection Service 演示多区域和多可用区应用程序弹性
    文章作者:JeffAmazonFaultInjectionService(FIS)可帮助您将混沌工程大规模付诸实践。今天,我们推出了新的场景,这些场景可以让您演示在亚马逊云科技可用区完全断电,或从一个亚马逊云科技区域到另一个亚马逊云科技区域的连接中断时,您的应用程序是否按预期运行。亚马逊云科技开发者社......
  • IDEA中也能用Postman了,这款插件平替
    Postman是大家最常用的API调试工具,那么有没有一种方法可以不用手动写入接口到Postman,即可进行接口调试操作?今天给大家推荐一款IDEA插件:ApipostHelper,写完代码就可以调试接口并一键生成接口文档!而且还可以根据已有的方法帮助您快速生成url和params。更重要的是他完全免费!Apipos......
  • ATM2.0模块版
    ATM项目开发(1)在主程序文件中创建程序入口(2)在核心代码文件(视图层)搭建程序框架(3)进行代码功能分配-ATM项目根目录-README.md项目说明书-start.py项目启动文件的创建方式二,直接暴露在最外层-conf配置文件-settings.py-lib公共方法文件......