vue开发问题——根据http code码排除网络请求的故障,axios示例

如何根据code码排查请求错误

同我的其他文章一样,都是自己项目中遇到的问题。一说到http的请求返回的code码。有很多优秀的文档,写了前因后果,如何解决,但是都是大,多是自己dome或者项目中遇到的问题,所以解决问题的过程很坎坷,尽管是一样的错误,但是解决方式又不一样,在这里我把自己的经理记录下来。当作留念了哈~

在HTTP1.1协议下,HTTP状态码总共可分为5大类:
1xx:请求收到,继续处理
2xx:操作成功收到,分析、接受
3xx:完成此请求必须进一步处理
4xx:请求包含一个错误无法或不能完成
5xx:服务器执行一个完全有效请求失败

先贴出一篇文章,讲得非常详细

来自于 【装满哈希的Map】的 HTTP协议网络请求状态码,详细~

注:所有的请求,在控制台仔细看!都会在里面找到线索的!下面我会把我的经历贴出来,其他同胞免受http code错误之苦

我们后台展示swagger-ui,软件是idea,语言是java。前后端分离。请求为axios

一般会有个测试接口,无需登录,验证,token,就可以交互的数据,下面是我的一个测试接口,拿到返回值是,男,女
在这里插入图片描述

如果说你一开始测试接口都报错的话,说明---------你写的接口不对啊,小老弟(当然不排除你们那个不靠谱的后端没有启动项目,所以请求之前先看看后台起动没有)
两种方法查看,1、登录他的后台接口ip页面,能访问就是启动了的。2、倒杯茶,揉一揉肩,让他赶紧起

下面是我自己随便起的一个后台,前台的请求的接口dome,测试用的是axios的cdn

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="https://unpkg.com/axios/dist/axios.min.js"></script>

</head>

<body>
    <button onclick="Inter()"> 点击请求</button>

    <script>
        function Inter() {
            axios.get('http://192.168.1.111:8820/dict/gender')
                .then(function (response) {
                    console.log(response);
                })
                .catch(function (error) {
                    console.log(error);
                });
        }
    </script>
</body>

</html>

在这里插入图片描述
这里看到确实能用,那么就开整(如果是封装、加密什么的,就拿这部分测试就挺好 )

一、(Access-Control-Allow-Origin) 以下是请求分页数据接口地址。
Access to XMLHttpRequest at 'http://192.168.1.15:8820/cadre/listcadre?pageNo=1&pageSize=10' from origin 'null' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

嗯!Access-Control-Allow-Origin,大名顶顶的跨域错误~至于怎么跨域,我的上篇文章有分享,用vue内置vue.config.js Nginx代理跨域,作用就是伪装下请求的headers,

二、(code 404;timeout)http://localhost:8081/api/login 404 (Not Found)或者 timeout ****
在这里插入图片描述

其实如果说404,或者timeout(超时)一定是接口地址没有写对,非常低级的错误了,但是还有可能是有其他原因
1、vue.vonfig.js 里面的proxy 的target后台地址书写错误,所请求访问不到
2‘、axios的方法 请求地址书写错误
3、后台打了断点
4、后台压根儿没起动~

如果是以上地址都确认无误,请参考上篇 白屏的文章 可能是baseURL,或者.env.production 的基础路径配置错误

三、(code 400)POST http://localhost:8081/api/api/merchant/export 400 (Bad Request)

  • bed request 首先从控制台得出这是个坏请求。那么我是从以下几个方面看的。打开Network
    控制台
  • 下面发红的request 点开之后可以看到
    在这里插入图片描述
    以及request Payload
    在这里插入图片描述
    检查请求分为几个方面
  1. 日常检查是否接口地址是否错误

  2. 如果是get请求,Request URL:后面肯定有以"?"查询字符串的形式拼接的参数
    在这里插入图片描述
    如果是post请求,那么上面第二张图的Payload里面就是post携带参数,对比和后台的数据格式,数据名称是否有异同

  3. Content-Type:和后端要求是否一致
    在这里插入图片描述

  4. 如果你确实使用的post方式,但是Payload没有出现你传的参数,可能是你封装的axios有问题哦,比如像我axios博文里面写到的(如下图),用qs模块把参数序列化
    在这里插入图片描述
    或者当时封装的时候参数并不是在后台想要位置
    在这里插入图片描述
    比以上get就是正常方式,而delete呢,是拼接在url后面,而download又是body里面,并且在里面加入了responseType

四、
在这里插入图片描述

Access to XMLHttpRequest at 'http://139.9.***.*/estate-admin-api/login.jsp;JSESSIONID=a2d98be3-f057-4f96-9728-bdeb39e4fff8' (redirected from 'http://localhost:8081/api/api/property/list?pageNo=1&pageSize=15') from origin 'http://localhost:8081' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource

http://139.9.***.*/estate-admin-api/login.jsp;JSESSIONID=a2d98be3-f057-4f96-9728-bdeb39e4fff8 net::ERR_FAILED
先挑简单看得懂的
1、Network Error ,网络错误,先看你本机有没有有网络,或者去后端的swagger-ui看看能不能访问,
2、'Access-Control-Allow-Origin' header 同源策略的请求头,如果你和我一样添加了请求拦截器,在里面塞了token(如下图)
在这里插入图片描述
那么我怀疑是token过期了,检查Application里面的Session Storage(或者Local),果然没有,遂退出,重新登陆,ok!
在这里插入图片描述

五、code 401

  • 这个是我在swagger测试的时候,会出现401 ,意思是无权限,就是未登录在这里插入图片描述

六、(code 500) Inter Server Error 或者 Request failed with status 500
在这里插入图片描述
在这里插入图片描述

当出现500 的时候,一般会下意识的认为是后端语法问题,或者接口的问题。题主呢经历过大概有以下几个方面。

  • 前端报错500,根据后台的idea,并没有日志,发现请求并没有走进去,进检查,前端的打包时候地址少了一个 / (通过日志确定方向,到底是前,还是后端的错误
  • 本身后台的java语法真的真的写错了。这就是自身的原因了,就是接口语法错误。(-.-!
  • 前端传值错误。其实这个也是因为后端的错误,比如常见的就是前端新增数据,为了图简便,个人电话没写,是个空的。但是等你请求展示个人信息,后台会对你的电话号码做处理(比如说只展示后四位),到时候,此时你新增数据的电话是空的,后台又没有做非空判断,所以造成后台空指针,java语言错误,报错500。(更据后端风格把,最好是前后端都做非空判断,能避免不少麻烦)
  • 后台修改接口。这个比较容易疏忽。比如说现在个人信息有 【姓名】【年龄】,此时上线。上线后客户说应该新增【性别】一栏。于是后台返回性别字段。新增的数据有了【性别】字段,但是,原来的旧的测试数据没有【性别】字段,造成数据查询空指针。语法性错误,报错500 .(你发现更改字段,或者参数,自己去清空数据库,或者提示后端,毕竟直接给人说报错500找半天要好太多。。

————Lazy33

欢迎多多补充,多多点赞~

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
### 回答1: Vue Axios封装示例可以参考如下:// 创建 axios 实例 const service = axios.create({ baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url withCredentials: true, // send cookies when cross-domain requests timeout: 5000 // request timeout })// request 拦截器 service.interceptors.request.use( config => { // 在发送请求之前做一些处理 // ... return config }, error => { // 对请求错误做些什么 return Promise.reject(error) } )// response 拦截器 service.interceptors.response.use( response => { const res = response.data // 如果返回的状态不是200,则reject if (res.code !== 200) { return Promise.reject(res.message || 'Error') } else { return res } }, error => { return Promise.reject(error) } )export default service ### 回答2: Vue axios 提供了一种方便的方式来发送 HTTP 请求和处理响应。以下是一个简单的示例,展示了如何封装 axios。 首先,需要在项目中安装 axios: ``` npm install axios ``` 然后,在你的Vue组件中,你可以创建一个名为axiosService.js的文件,并将以下代添加到该文件中: ```javascript import axios from 'axios'; // 创建一个 axios 实例,可以在所有的请求中共享该实例 const instance = axios.create({ baseURL: 'https://api.example.com', // 设置请求的基础URL timeout: 5000 // 设置请求超时时间 }); // 请求拦截器,在发送请求前可以对请求进行一些处理 instance.interceptors.request.use( config => { // 在请求发送前做一些处理,例如添加 token 到请求头部 config.headers['Authorization'] = 'Bearer ' + localStorage.getItem('token'); return config; }, error => { // 处理请求错误 console.error(error); return Promise.reject(error); } ); // 响应拦截器,在接收到响应后可以对响应进行一些处理 instance.interceptors.response.use( response => { // 在接收到响应数据前做一些处理 return response.data; }, error => { // 处理响应错误 console.error(error); return Promise.reject(error); } ); export default instance; ``` 现在,在你的 Vue 组件中,你可以导入 `axiosService.js` 并使用 `axios` 实例来发送请求: ```javascript import axiosService from '@/axiosService'; export default { data() { return { users: [] }; }, methods: { getUsers() { axiosService.get('/users') .then(response => { this.users = response; }) .catch(error => { console.error(error); }); } }, mounted() { this.getUsers(); } }; ``` 这是一个简单的封装示例,当然你可以根据你项目的需求来进行更复杂的封装。这样可以提高代的可重用性,并使代更易于维护。 ### 回答3: 以下是一个Vue Axios封装的示例: 首先,我们需要安装`axios`和`vue-axios`,可以通过npm或者yarn进行安装。 然后,我们创建一个util文件夹,并在其中创建一个`http.js`文件。在`http.js`中,我们导入`axios`和`vue-axios`,同时创建一个名为`http`的实例,并设置其基本的请求配置。 ```javascript import axios from 'axios'; import VueAxios from 'vue-axios'; import Vue from 'vue'; Vue.use(VueAxios, axios); const http = axios.create({ baseURL: 'http://api.example.com', // 设置默认的请求地址 timeout: 5000, // 设置请求超时时间 headers: { 'Content-Type': 'application/json', // 设置请求头类型 }, }); export default http; ``` 在`http.js`中,我们创建了一个名为`http`的实例,这样我们可以在整个项目中使用该实例来发送请求,并可以设置一些默认的请求配置。 接下来,我们可以在其他需要发送请求的组件中引入`http.js`文件,并使用`http`来发送请求。 ```javascript import http from '@/utils/http'; export default { methods: { fetchData() { http.get('/data').then(response => { // 处理响应数据 }).catch(error => { // 处理错误 }); }, sendData() { const data = { // 请求的数据 }; http.post('/data', data).then(response => { // 处理响应数据 }).catch(error => { // 处理错误 }); }, }, }; ``` 在上述示例中,我们首先引入了`http.js`文件,然后通过使用`http`来发送请求。我们可以使用`http.get`来发送GET请求,使用`http.post`来发送POST请求,等等。在请求的结果中,我们可以使用`.then`来处理成功的响应,使用`.catch`来处理错误。 通过封装`http.js`文件,我们可以在整个项目中使用同样的请求配置,同时也可以更好地管理请求和错误处理的逻辑。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lazy33

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值