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

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

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

记录--get请求参数放在body中?的更多相关文章

  1. tomcat访问(access)日志配置、记录Post请求参数

    tomcat访问(access)日志配置.记录Post请求参数 一.配置与说明 tomcat访问日志格式配置,在config/server.xml里Host标签下加上 <Valve classN ...

  2. 微信小程序:post请求参数放在请求体中还是拼接到URL中需要看后台是如何接收的

    前端发送post请求时,请求参数可以放在请求中,代码如下: function post(url, data, callback) { wx.request({ method: 'POST', url: ...

  3. 【整理】01. localhost_access_log 记录post请求参数

    环境:apache-tomcat-7.0.57 利用Filter过去request请求参数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 ...

  4. Action获取请求参数的3中方式

    方式一:Action本身作为Model对象,通过属性注入(Setter)方法讲参数数据封装到Action中 具体为:在Action中,提供和参数名相同的几个属性,并为其提供set方法,那么,该参数会被 ...

  5. 接口调用post请求参数在body中

    package com.ynhrm.common.utils; import com.alibaba.fastjson.JSONObject; import lombok.Data; import o ...

  6. java https post请求并忽略证书,参数放在body中

    1 新建java类,作用是绕过证书用 package cn.smartercampus.core.util; import java.security.cert.CertificateExceptio ...

  7. Servlet、Tomcat访问(access)日志配置、记录Post请求参数

    一.运行环境: Maven:3.5.2(点击下载) ,下载页 Tomcat:8.5.29(点击下载) ,下载页 JDK:jdk1.7.0_80(点击下载) ,下载页 MavenDependency: ...

  8. tomcat访问(access)日志配置、记录Post请求参数(转)

    一.配置与说明 tomcat访问日志格式配置,在config/server.xml里Host标签下加上 <Valve className="org.apache.catalina.va ...

  9. SpringMVC @RequestBody请求参数在postman中的请求

    使用SpringMVC框架,controller使用参数  @RequestBody  LoginReq req   注解方式模拟http请求 需要请求header添加一个参数 设置  Header参 ...

  10. 在生产环境记录http请求参数

    StringBuilder strParam = new StringBuilder(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ...

随机推荐

  1. JS leetcode 两数之和 II - 输入有序数组 题解分析

    壹 ❀ 引 我在JS leetcode 两数之和 解答思路分析一文中首次解决两数之和等于目标值的问题,那么今天遇到的是两数之和的升级版,题目为leetcode167. 两数之和 II - 输入有序数组 ...

  2. docker方式部署并使用gitlab

    工作中企业会在内网搭建一个公司内部使用的git环境,一般用的是gitlab. GitLab 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的web服务. 下面介绍一 ...

  3. ubuntu 23.04 无法联网

    一些参考文章: 解决ubuntu突然无法联网问题 共享主机网络方法: https://www.server-world.info/en/note?os=Ubuntu_22.04&p=squid ...

  4. IDA 常用快捷键记录

    常用快捷键1 1.切换文本视图与图表视图 空格键 2.返回上一个操作地址 ESC 3.搜索地址和符号 G 4.对符号进行重命名 N 5.常规注释 冒号键 6.可重复注释 分号键 7.添加标签 Alt+ ...

  5. Feign入门介绍

    Feign入门介绍 基本概述 除Feign之外,在Java中经常使用的HTTP客户端组件主要有3个,如下: (1)HttpURLConnection,JDK自带 (2)Apache HttpClien ...

  6. 麒麟系统开发笔记(八):在国产麒麟系统上使用linuxdeployqt发布qt程序

    前言   在ubuntu上发布qt程序相对还好,使用脚本,但是在麒麟上发布的时候,因为银河麒麟等不同版本,使用脚本就不太兼容,同时为了实现直接点击应用可以启动应用的效果,使用linuxdeployqt ...

  7. Java是解释型语言么

    基础概念 JVM虚拟机会将.java类文件编译成.class文件--字节码文件,这大家都知道. 代码运行时还需要将.class字节码文件翻译成机器码才能执行. 解释执行:将编译好的字节码一行一行地翻译 ...

  8. X86模拟龙芯与编译 .NET CoreCLR

    目录 .NET 收到一台龙芯机器 编译 CoreCLR 环境要求 部署虚拟机与环境 Linux 安装 KVM 下载需要的文件 启动模拟器 下载 CoreCLR 尝试编译 CoreCLR 前段时间得知龙 ...

  9. Java 异常处理(2) : 异常处理的方式二:throws + 异常类型

    1 package com.bytezero.throwable; 2 3 import java.io.File; 4 import java.io.FileInputStream; 5 impor ...

  10. 摆脱鼠标系列 - vscode 搜索 自定义快捷键 F1 - 然后F4 搜索 Alt+Shift+回车 跳转到搜索列表 选好后回车进入文件

    摆脱鼠标系列 - vscode 搜索 自定义快捷键 F1 搜索 Alt+Shift+回车 跳转到搜索列表 选好后回车进入文件 F1的设置可能在其他贴子了 最新特大好消息 F4 是搜索完的跳转 等于F1 ...