axios.js以post方式传递数据后台获取不到数据,这到底是什么原因

本文详细介绍了如何封装axios库中的get和post方法,包括解决后台接收数据为null的问题,通过设置Content-Type为application/x-www-form-urlencoded,并利用qs库进行数据转换。同时,文章还探讨了使用全局拦截器来优化请求和响应处理。

这篇文章始于自己封装了axios.js的里面的get方法,和post方法 首先我们先来看看 使用说明 · Axios 中文说明 · 看云 ​http://link.zhihu.com/?target=https%3A//www.kancloud.cn/yunye/axios/234845

axios.post()方法
axios({
	method: 'post',
	url: '/user/123456',
	data: {
		username: 'ken',
		password: '123456'
	}
})

axios.post('/user', {
    firstName: 'Fred',
    lastName: 'Flintstone'
})
复制代码
axios.get()方法
axios({
	method: 'get',
	url: '/user/123456',
})

// 可选地,上面的请求可以这样做
axios.get('/user', {
	params: {
	  ID: 12345
	}
})
复制代码
这个下面是我的封装的伪代码
//伪代码的编写
axios({
	method: 'post' || 'get',
	url: '/user/123456',
	data: {
		username: 'ken',
		password: '123456',
	} || params: {
		ID: '123456'
	}
})
复制代码
我一开始的封装的方式是这样的
// eslint-disable-next-line
/* eslint-disable */
// 对 axios.get() 和 axios.post()进行封装
import axios from 'axios'
import qs from 'qs'

/*
post 方式
axios({
	method: 'post',
	url: '/user/123456',
	data: {
		username: 'ken',
		password: '123456'
	}
})
axios.post('/user', {
    firstName: 'Fred',
    lastName: 'Flintstone'
})

get 方式
axios({
	method: 'get',
	url: '/user/123456',
})

// 可选地,上面的请求可以这样做
axios.get('/user', {
	params: {
	  ID: 12345
	}
})


//伪代码的编写
axios({
	method: 'post' || 'get',
	url: '/user/123456',
	data: {
		username: 'ken',
		password: '123456',
	} || params: {
		ID: '123456'
	}
})
*/
export default function axios_get_post(params){
	return new Promise((resolve, reject)=>{
		let opt = {
			method: params.method || 'get',
			url: params.url,
		}
		if(params.method == 'post'){
			opt.data = params.data
		}else {
			// 
			opt.params = params
		}
		axios(opt).then(res=>{
			resolve(res.data)
		}).catch(err=>{
			reject(err)
		})
	})
}
复制代码
但是当我在这样调用测试接口的时候,

created() {
		// 测试封装
		axios_get_post({
			method: 'post',
			url: 'http://xxx.com/account/admin/login.php',
			data: {
				user_name: 'kennana',
				user_pass: '123456'
			}
		}).then(res=>{
			console.log('axios_get_post res',res)
		}).catch(err=>{
			console.log('axios_get_post err',err)
		})
	},
复制代码
出现一个问题就是后台获取不到数据,后台返回的数据是null

后台设置如下

控制到检测到数据为Request Payload状态,

HTTP请求中的form data和request payload的区别:

request payload的数据状态是因为content-type:application/json 关键就是设置Content-type这个Headerapplication/x-www-form-urlencoded, 实际上对于常规的HTML页面上的form的Content-type默认就是这个值。 这里要注意post请求的

Content-Type为application/x-www-form-urlencoded

,参数是在请求体中,即上面请求中的Form Data。 因为浏览器post传递数据一般是以表单的形式传递的, 而我上面的方式是以json的方式传递的,所以我们必须告诉服务端是以表单形式传递的, 所以要设置请求头的content-type,HTTP POST表单请求提交时,使用的Content-Type是application/x-www-form-urlencoded,而使用原生AJAX的POST请求如果不指定请求头RequestHeader,默认使用的Content-Type是text/plain;charset=UTF-8。

当然,设置了application/x-www-form-urlencoded的POST请求也可以通过这种方式来获取。 所以,在使用原生AJAX POST请求时,需要明确设置Request Header,即:

xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");  
复制代码
同样使用axios.post()传输的时候也要设置content-type

所以上面封装的代码改成如下:

// eslint-disable-next-line
/* eslint-disable */
// 对 axios.get() 和 axios.post()进行封装
import axios from 'axios'
import qs from 'qs'

/*
post 方式
axios({
	method: 'post',
	url: '/user/123456',
	data: {
		username: 'ken',
		password: '123456'
	}
})
axios.post('/user', {
    firstName: 'Fred',
    lastName: 'Flintstone'
})

get 方式
axios({
	method: 'get',
	url: '/user/123456',
})

// 可选地,上面的请求可以这样做
axios.get('/user', {
	params: {
	  ID: 12345
	}
})


//伪代码的编写
axios({
	method: 'post' || 'get',
	url: '/user/123456',
	data: {
		username: 'ken',
		password: '123456',
	} || params: {
		ID: '123456'
	}
})
*/
export default function axios_get_post(params){
	return new Promise((resolve, reject)=>{
		let opt = {
			method: params.method || 'get',
			url: params.url,
			headers: {
				'Content-Type':'application/x-www-form-urlencoded'
			},
		}
		if(params.method == 'post'){
			opt.data = params.data
		}else {
			// 
			opt.params = params
		}

		axios(opt).then(res=>{
			resolve(res.data)
		}).catch(err=>{
			reject(err)
		})
	})
}
复制代码

但是这样是解决问题了,但是又有一个问题来,我们来看看

真是一波平,一波起啊,查了一下文档,有个全局拦截器,可以在数据请求前先处理好数据,

所以我们要引入qs库

import qs from 'qs'
复制代码
全局拦截器
在请求或响应被 then 或 catch 处理前拦截它们。

// 添加请求拦截器
axios.interceptors.request.use(function (config) {
    // 在发送请求之前做些什么
    return config;
  }, function (error) {
    // 对请求错误做些什么
    return Promise.reject(error);
  });

// 添加响应拦截器
axios.interceptors.response.use(function (response) {
    // 对响应数据做点什么
    return response;
  }, function (error) {
    // 对响应错误做点什么
    return Promise.reject(error);
  });
复制代码
所以我们要来改造我上面的那个封装了
// eslint-disable-next-line
/* eslint-disable */
// 对 axios.get() 和 axios.post()进行封装
import axios from 'axios'
import qs from 'qs'

/*
post 方式
axios({
	method: 'post',
	url: '/user/123456',
	data: {
		username: 'ken',
		password: '123456'
	}
})
axios.post('/user', {
    firstName: 'Fred',
    lastName: 'Flintstone'
})

get 方式
axios({
	method: 'get',
	url: '/user/123456',
})

// 可选地,上面的请求可以这样做
axios.get('/user', {
	params: {
	  ID: 12345
	}
})


//伪代码的编写
axios({
	method: 'post' || 'get',
	url: '/user/123456',
	data: {
		username: 'ken',
		password: '123456',
	} || params: {
		ID: '123456'
	}
})
*/
export default function axios_get_post(params){
	return new Promise((resolve, reject)=>{
		let opt = {
			method: params.method || 'get',
			url: params.url,
			headers: {
				'Content-Type':'application/x-www-form-urlencoded'
			},
		}
		if(params.method == 'post'){
			opt.data = params.data
		}else {
			// 
			opt.params = params
		}
		// 拦截处理
		axios.interceptors.request.use((req) => {
		    if (req.method === 'post') {
		     	req.data = qs.stringify(req.data);
		    }
		    return req;
		}, (error) => Promise.reject(error));

		axios(opt).then(res=>{
			resolve(res.data)
		}).catch(err=>{
			reject(err)
		})
	})
}
复制代码

终于解决了

更多请参考 www.kancloud.cn/yunye/axios…

<think>首先,用户的问题是:“我想解决axios获取后台数据为空的问题请问axios获取后台数据为空的解决方案”。根据系统指令,我需要用中文回答,并且引用段落末尾添加引用标识。我有几个引用:-[^1]:谈到当服务器返回响应但后台无法接收到数据时,可能的原因是请求头有数据后台不到,作者提到了检查开发者工具网络信息时发现了问题。-[^2]:是一个代码片段,但没有具体说明,看起来是过滤器的Java代码。-[^3]:关于在Vue中使用ECharts和axios,提到了当使用子组件时,需要确保在数据获取成功后才渲染组件,通过v-if和v-bind来实现。-[^4]:提供了安装axios和创建自定义实例的详细步骤,包括基本的请求配置和使用方法。用户的问题是获取后台数据为空,意思是axios请求成功(有响应),但后台返回的数据为空(空响应或数据为null)。这不同于请求失败(如404),而是请求成功后返回的内容为null。我需要结构清晰,逐步解决问题。参考用户上一次的问题,但在这个对话中没有历史记录,因为这是新对话。系统指令说“尽可能多的参考用户上一次的问题和你的回答”,但这里用户第一次提问,所以基于引用提供解决方案。关键点从引用中:1.**检查网络请求**:[^1]提到检查开发者工具的网络标签页,这很重要。我应该指导用户检查响应内容、状态码、请求头和响应体。2.**后端处理**:[^2]是一个过滤器的代码,可能表示后端问题。CORS(跨源资源共享)问题是常见原因。3.**前端异步处理**:[^3]强调在Vue中确保数据获取正确后再渲染组件,使用了v-if来避免在数据准备好前渲染。4.**axios配置**:[^4]展示了如何设置baseURL、timeout,并定义了GET、POST等方法。配置错误如baseURL不正确可能导致数据为空。常见原因及解决方案:1.**前端配置问题**:-确保baseURL正确([^4])。-检查请求方法(GET/POST错误)。-如果POST/PUT,请求体是否发送正确(如content-type)。-在Vue/React中,正确处理异步响应(使用.then()或async/await)。2.**后端问题**:-API端点是否正确返回数据(可能API逻辑错误返回空)。-CORS问题:如果跨域,需要设置CORS头。[^2]的过滤器代码可能用于处理CORS。-服务器响应为空(检查后端日志)。3.**开发工具检查**:-像[^1]提到的,使用浏览器开发者工具检查网络请求:状态码应为200,响应体应有数据。4.**异步处理**:-[^3]中建议在数据准备好前不渲染组件,防止空数据渲染。结构回答:-引导用户逐步检查问题。-步骤清晰。-添加引用自然。回答结构:1.介绍问题。2.逐步排查:a.检查网络请求(开发者工具)。b.验证axios配置。c.检查后端API。d.解决CORS问题。e.前端处理响应数据。3.以生成相关问题结束(系统指令要求“生成相关问题”)。结束部分需要添加§§相关问题§§。确保数学表达式正确使用$...$或$$...$$,但在这个问题中,可能没有数学内容。如果有数据格式,考虑。添加引用:例如,当提到网络检查时,添加[^1]。最终答案:</think> 以下是解决 Axios 获取后台数据为空问题的详细解决方案。我会基于您提供的引用信息和常见实践,一步步引导您排查原因并修复问题。Axios 获取数据为空通常发生在请求成功(如状态码 200)但响应体为空时,可能与配置错误、异步处理或服务器问题相关。以下步骤结构化展开,确保真实可靠(基于 Axios 官方文档和常见开发实践)。 ### 逐步排查和解决方案 #### 1. **检查网络请求和响应 (通过浏览器开发者工具)** - 首先,确保使用浏览器开发者工具(如 Chrome DevTools)查看网络请求。这能帮助您确认请求是否成功发送、响应状态码和内容。 - 打开开发者工具(F12)→ 转到 "Network" 标签页。 - 重现请求(如页面加载或触发 axios 调用)。 - 检查: - **状态码**:应为 200(成功),但数据为空。如果为 404 或 500,表示服务器问题(如 API 路径错误或内部错误)。 - **请求头和响应体**:在 "Headers" 下: - 确认 `Content-Type` 是否正确(如 JSON 请求应为 `application/json`)。 - 检查 "Preview" 或 "Response" 标签,查看响应体是否包含数据。如果响应体为 `{}` 或 `null`,问题可能在服务器端。 - 如果响应体为空但请求头显示成功,可能是服务器逻辑错误返回空数据(例如数据库查询无结果)。引用中 [^1] 提到类似情况:"当我回去查开发者工具中网络那里的时候,发现到了一点端倪",这常是排查起点 [^1]。 #### 2. **验证 Axios 配置是否正确** - Axios 配置错误可能导致请求参数未正确发送或接收。 - **baseURL 和 URL**:确保 `baseURL` 指向正确的服务器地址(如本地开发环境或生产环境)。引用中 [^4] 展示了基本设置: ```javascript const instance = axios.create({ baseURL: "http://localhost:8081", // 确保与您的服务器匹配 timeout: 3000, // 设置合理超时 }); ``` 如果 `baseURL` 错误(如端口不匹配),服务器可能返回404或空响应。 - **请求方法(GET/POST/PUT/DELETE)**: - GET 请求:数据应通过 `params` 传递(如 `axios.get(url, { params: query })`)。 - POST/PUT 请求:数据应通过 `data` 传递(如 `axios.post(url, data)`)。引用中 [^4] 的 `postMapping` 使用了 `data` 属性: ```javascript export function postMapping(data) { return request({ url: url, method: 'post', data // 检查请求体是否正确发送 }); } ``` 确保服务器端能接收 `data` 参数(如后端使用 `@RequestBody` 在 Spring 中)。 - **Content-Type 头**:如果是 POST 请求,需设置 `Content-Type`。默认 Axios 会自动设置 JSON,但有时需要手动添加: ```javascript headers: { 'Content-Type': 'application/json' } ``` 如果未设置,服务器可能无法解析请求体导致空响应。 #### 3. **检查后端服务器端问题** - 即使 Axios 请求成功,服务器逻辑错误也可能导致数据为空。 - **API 路径和逻辑**:确认您的 API 路径是否正确返回数据(如在后端调试代码)。例如,一个 Spring Boot 控制器应类似: ```java @PostMapping("/system/user") public ResponseEntity<List<User>> getUsers(@RequestBody Query query) { List<User> users = userService.getUsers(query); return ResponseEntity.ok(users); // 确保 users 不为 null } ``` 如果数据库查询返回空(如查询条件错误),就会空响应。 - **跨域问题 (CORS)**:跨域请求时,浏览器会阻止响应数据。引用中 [^2] 提到了过滤器的 Java 代码(如 `doFilter`),这常用于设置 CORS 头: ```java public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException { HttpServletResponse response = (HttpServletResponse) servletResponse; response.setHeader("Access-Control-Allow-Origin", "*"); // 允许所有域 response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE"); response.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization"); chain.doFilter(servletRequest, response); } ``` 如果不设置 CORS,浏览器可能收到响应但不显示数据(开发者工具可能显示 CORS 错误)。在本地开发时,确保后端服务器配置了 CORS。 - **服务器日志检查**:查看后端日志(如 Spring Boot 控制台)确认请求是否到达和处理错误。 #### 4. **前端处理响应数据 (如 Vue/React 中)** - 数据为空可能源于前端异步处理不当,导致在数据未就绪时使用了空值。引用中 [^3] 强调了使用 `v-if` 和 `v-bind` 来避免子组件过早渲染: - 在 Vue 中,确保父组件在数据获取成功前不渲染子组件: ```html <!-- 使用 v-if 确保数据获取成功后再渲染 --> <bar_mix_line v-if="isGetSuccess" :xAxis="xAxis" :yAxis="yAxis" :series="series"></bar_mix_line> ``` ```javascript methods: { getUserList() { postMapping('/system/user', this.queryList) .then(res => { if (res.data && res.data.data) { this.userList = res.data.data; // 赋值数据 this.isGetSuccess = true; // 设置标志以渲染组件 } else { console.error("后台返回数据为空", res); } }) .catch(error => console.error("请求失败", error)); }, } ``` - 使用 Axios 的响应处理: - `.then(res => {...})` 中检查 `res.data`。确保解析了数据(如果响应是 JSONAxios 会自动解析)。 - 添加错误处理 (`.catch(...)`) 捕获请求异常。 #### 5. **其他常见问题和修复** - **调试工具**:使用 `console.log` 输出中间变量: ```javascript axios.get('/api/data') .then(response => { console.log("完整响应:", response); // 检查结构和数据 console.log("响应体:", response.data); }); ``` 如果 `response.data` 为空,问题在服务器。 - **参数格式**:确保请求参数格式匹配 API(如数字或字符串)。 - **环境问题**:开发与生产环境的差异(如 baseURL 需在部署时更新)。 - **依赖冲突**:确保安装最新 Axios(如 `npm install axios@latest`),旧版本可能有 bug。 ### 总结排查流程 1. 优先检查开发者工具网络面板 → 确认请求状态和响应体。 2. 验证 Axios 配置 → 特别是 baseURL 和 data 发送。 3. 调试后端 → 确保 API 返回数据且无 CORS 问题。 4. 前端异步处理 → 在数据准备好后再使用它。 如果所有步骤后仍为空数据,可能是服务器端逻辑错误(如数据库无记录),需与后端开发者协调 [^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值