问题—前端调用接口url多加一个/,本地可以调通,测试环境报错302,分开调两个接口

问题背景

接口url前面多加一个/ ,npm run serve 起项目,本地调用正常

在这里插入图片描述
npm run build 打包到测试环境,接口出现问题,分开调用接口,且报302错误

在这里插入图片描述

问题原因:

本地开发环境和测试环境的URL处理方式不同
本地使用vue-cli工具,工具内部使用webpack-dev-server等实现热更新和启动本地服务,webpack-dev-server对URL的处理较为宽松,多出来的”/“会被忽略。

而在测试环境中,这个”/“不会被忽略,因为你的请求将由服务器处理,如Nginx等,服务器接收到你的请求后,不会像webpack-dev-server那样忽略这个”/“,它会严格按照URL进行处理,导致了你后端接收到两个接口请求。

所以,我们在编写代码,特别是涉及到URL处理的时候,需要注意这个问题,尽量避免多出”/“。忽略。

你可以尝试以下几种解决办法

  1. 配置服务器:如果可能,你可以配置你的测试环境服务器,让它自动去除 URL 中多余的 /。具体的配置方法取决于你的服务器软件。

  2. 使用 URL 模块:你可以使用 Node.js 的 url 模块或者其他类似的库来构造你的请求 URL。这些库通常会自动处理 URL 中的多余 /。

webpack-dev-server 底层如何实现兼容

Webpack Dev Server 底层利用 express 提供了 HTTP server 的功能,而 express 本身对 URL 的斜杠添加和减少是默认做了处理的。也就是说不论你访问 /api/foo 或者 /api/foo/,express 都会将其视为一个路由来处理。

注意:webpack-dev-server 无法兼容请求URL空格

webpack-dev-server 本身并不会自动处理请求 URL 前后的空格。HTTP 规范中明确指出,URL 中是不存在空格的,因此在应用中我们也需要遵守这个规则。如果请求的 URL 地址前后出现空格,可能会导致服务端无法正确解析,产生错误。因此,建议在编写 URL 时必须遵守 HTTP 规范,保证 URL 前后没有空格。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,您可以在原有的代码基础上添加一个新的图像区域,用于显示第二个视频。以下是修改后的代码示例: ```matlab function videoPlayerGUI % 创建一个GUI窗口 f = figure('Position',[200 200 1000 500],'MenuBar','none','ToolBar','none','NumberTitle','off','Name','视频播放器'); % 创建一个按钮,用于选择要播放的第一个视频文件 uicontrol(f,'Style','pushbutton','String','选择视频文件1','Position',[20 20 120 40],'Callback',@selectVideo1Callback); % 创建一个按钮,用于选择要播放的第二个视频文件 uicontrol(f,'Style','pushbutton','String','选择视频文件2','Position',[20 80 120 40],'Callback',@selectVideo2Callback); % 创建两个图像区域,用于显示第一个和第二个视频 imgAxes1 = axes('Parent',f,'Units','pixels','Position',[170 60 400 400]); imgAxes2 = axes('Parent',f,'Units','pixels','Position',[590 60 400 400]); % 定义全局变量,用于存储第一个和第二个视频对象 global vidObj1 vidObj2; % 定义回函数,用于选择要播放的第一个视频文件 function selectVideo1Callback(~,~) [fileName,pathName] = uigetfile({'*.avi;*.mp4','Video Files (*.avi,*.mp4)'},'选择要播放的第一个视频文件'); if ~(isequal(fileName,0) || isequal(pathName,0)) % 如果选择了文件,则创建第一个视频对象 vidObj1 = VideoReader(fullfile(pathName,fileName)); % 显示第一个视频的第一帧 frame1 = readFrame(vidObj1); imshow(frame1,'Parent',imgAxes1); % 开始播放第一个视频 playVideo1; end end % 定义回函数,用于选择要播放的第二个视频文件 function selectVideo2Callback(~,~) [fileName,pathName] = uigetfile({'*.avi;*.mp4','Video Files (*.avi,*.mp4)'},'选择要播放的第二个视频文件'); if ~(isequal(fileName,0) || isequal(pathName,0)) % 如果选择了文件,则创建第二个视频对象 vidObj2 = VideoReader(fullfile(pathName,fileName)); % 显示第二个视频的第一帧 frame2 = readFrame(vidObj2); imshow(frame2,'Parent',imgAxes2); % 开始播放第二个视频 playVideo2; end end % 定义回函数,用于播放第一个视频 function playVideo1 while hasFrame(vidObj1) frame1 = readFrame(vidObj1); imshow(frame1,'Parent',imgAxes1); pause(1/vidObj1.FrameRate); end end % 定义回函数,用于播放第二个视频 function playVideo2 while hasFrame(vidObj2) frame2 = readFrame(vidObj2); imshow(frame2,'Parent',imgAxes2); pause(1/vidObj2.FrameRate); end end end ``` 这段代码会创建一个带有两个图像区域的 GUI 界面,用于显示第一个和第二个视频。当用户点击“选择视频文件1”或“选择视频文件2”按钮时,会弹出文件选择对话框,用户可以选择要播放的视频文件。如果选择了文件,则程序会创建一个视频对象,并开始播放视频。在播放视频时,程序会不停地读取视频帧并显示在对应的图像区域中,直到视频播放结束。 希望这段代码对您有所帮助,如果还有其他问题,请随时问我。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值