请求url写的没错,但还是报404错误

2023-11-22 19:59
文章标签 请求 错误 404 url 没错

本文主要是介绍请求url写的没错,但还是报404错误,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

请求url写的没错,但还是报404错误

 

我们常见404是请求的url写错了,导致找不到请求路径,所以报404,但是还有一种情况会报404,你知道嘛?

1. 问题描述

客户端请求的url没有问题,后台接口也成功调用,并且后台接口没有任何报错信息。客户端浏览器chrome中可见404错误。在Preview中,可发现请求url不是原本我请求的url。

2. 看代码,引出问题

@Controller
@RequestMapping(value = "/cms/v1/module/business_script")
public class BusinessScriptController {@RequestMapping(value = "/{code}/runWithDownload", method = RequestMethod.POST)public void runWithDownload(@PathVariable String code,@RequestBody(required = false) Map args) {ServletRequestAttributes attrs = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();HttpServletResponse response = attrs.getResponse();// 该接口为下载接口, 此处省略一万行代码}
}

当我客户端访问 /cms/v1/module/business_script/test/runWithDownload 的时候,发现该接口已经成功调用,并且没有报任何错误,但是从浏览器中可以看到接口已经报404错误:

Headers信息

Preview信息

Response信息

3. 解决方案

  • 方案一
    接口方法上加上 @ResponseBody
@Controller
@RequestMapping(value = "/cms/v1/module/business_script")
public class BusinessScriptController {@ResponseBody@RequestMapping(value = "/{code}/runWithDownload", method = RequestMethod.POST)public void runWithDownload(@PathVariable String code,@RequestBody(required = false) Map args) {ServletRequestAttributes attrs = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();HttpServletResponse response = attrs.getResponse();// 该接口为下载接口, 此处省略一万行代码}
}

@ResponseBody是方法级的注解

  • 方案二
    将 @Controller 改为 @RestController
@RestController
@RequestMapping(value = "/cms/v1/module/business_script")
public class BusinessScriptController {@RequestMapping(value = "/{code}/runWithDownload", method = RequestMethod.POST)public void runWithDownload(@PathVariable String code,@RequestBody(required = false) Map args) {ServletRequestAttributes attrs = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();HttpServletResponse response = attrs.getResponse();// 该接口为下载接口, 此处省略一万行代码}
}

@RestController 相当于@Controller + @ResponseBody

  • 方案三
    在接收参数里加上 HttpServletResponse response
@Controller
@RequestMapping(value = "/cms/v1/module/business_script")
public class BusinessScriptController {@RequestMapping(value = "/{code}/runWithDownload", method = RequestMethod.POST)public void runWithDownload(HttpServletResponse response,@PathVariable String code,@RequestBody(required = false) Map args) {ServletRequestAttributes attrs = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();HttpServletResponse response = attrs.getResponse();// 该接口为下载接口, 此处省略一万行代码}
}

Spring对HttpServletResponse进行了包装,所以只要在接收参数里加上HttpServletResponse,再通过RequestContextHolder的方式获取到的HttpServletResponse也是包装后的对象。

4. 扩展

4.1 程序里如何获取和HttpServletRequest和HttpServletResponse

  • 通过接收参数方式
@RequestMapping(value = "/{code}/runWithDownload", method = RequestMethod.POST)
public void runWithDownload(HttpServletRequest request, HttpServletResponse response) {}
  • 通过注解方式
@Autowired  
private  HttpServletRequest request; @Autowired  
private  HttpServletResponse response;  
  • 上下文获取
    在web.xml配置监听器
<listener><listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>

程序中使用

ServletRequestAttributes attrs = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attrs.getRequest();
HttpServletResponse response = attrs.getResponse();

4.2 @RequestBody和@ ResponseBody解释的区别?

使用 @RequestMapping后,springmvc默认的是jsp那种解析视图的方式,返回值通常解析为跳转路径。
@ResponseBody是作用在方法上的,表示该方法的返回结果直接写入 HTTP response body 中,而不适用默认的视图解析方式。
@RequestBody是作用在形参列表上,用于将前台发送过来固定格式的数据【xml 格式或者 json等】封装为对应的 JavaBean 对象,封装时使用到的一个对象是系统默认配置的 HttpMessageConverter进行解析,然后封装到形参上。

4.3 # @Controller和@RestController的区别?

@RestController注解相当于@ResponseBody + @Controller合在一起的作用。

  • 如果只是使用@RestController注解Controller,则Controller中的方法无法返回jsp页面,或者html,配置的视图解析器 InternalResourceViewResolver不起作用,返回的内容就是Return 里的内容。

  • 如果需要返回到指定页面,则需要用 @Controller配合视图解析器InternalResourceViewResolver才行。如果需要返回JSON,XML或自定义mediaType内容到页面,则需要在对应的方法上加上@ResponseBody注解。

5. 友情链接

Spring框架:@RestController与@Controller

这篇关于请求url写的没错,但还是报404错误的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/412546

相关文章

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

Anaconda 中遇到CondaHTTPError: HTTP 404 NOT FOUND for url的问题及解决办法

最近在跑一个开源项目遇到了以下问题,查了很多资料都大(抄)同(来)小(抄)异(去)的,解决不了根本问题,费了很大的劲终于得以解决,记录如下: 1、问题及过程: (myenv) D:\Workspace\python\XXXXX>conda install python=3.6.13 Solving environment: done.....Proceed ([y]/n)? yDownloa

【经验交流】修复系统事件查看器启动不能时出现的4201错误

方法1,取得『%SystemRoot%\LogFiles』文件夹和『%SystemRoot%\System32\wbem』文件夹的权限(包括这两个文件夹的所有子文件夹的权限),简单点说,就是使你当前的帐户拥有这两个文件夹以及它们的子文件夹的绝对控制权限。这是最简单的方法,不少老外说,这样一弄,倒是解决了问题。不过对我的系统,没用; 方法2,以不带网络的安全模式启动,运行命令行,输入“ne

Java http请求示例

使用HttpURLConnection public static String httpGet(String host) {HttpURLConnection connection = null;try {URL url = new URL(host);connection = (HttpURLConnection) url.openConnection();connection.setReq

SQL2005 性能监视器计数器错误解决方法

【系统环境】 windows 2003 +sql2005 【问题状况】 用户在不正当删除SQL2005后会造成SQL2005 性能监视器计数器错误,如下图 【解决办法】 1、在 “开始” --> “运行”中输入 regedit,开启注册表编辑器,定位到 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVer

10 Source-Get-Post-JsonP 网络请求

划重点 使用vue-resource.js库 进行网络请求操作POST : this.$http.post ( … )GET : this.$http.get ( … ) 小鸡炖蘑菇 <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-w

ssm 之事务管理出现错误

JDBC Connection will not be managed by Spring 项目采用的是分布式架构,分别有controller,service,solr三个服务器,之间通过dubbo进行调用,经过测试发现事务配置完以后不能通过spring进行管理,其中两条insert和一条update语句都执行完毕,异常并没有使得事务进行回滚,通过调取debug日志发现“JDBC Conn

Unstructured cannot write mode RGBA as JPEG 错误解决

Unstructured cannot write mode RGBA as JPEG 错误解决 0. 错误详细1. 解决方法 0. 错误详细 Image Extraction Error: Skipping the failed imageTraceback (most recent call last):File "/root/miniconda3/envs/learn-y

收藏:解决 pip install 出现 error: subprocess-exited-with-error 错误的方法

在使用 pip 安装 Python 包时,有时候会遇到 error: subprocess-exited-with-error 错误。这种错误通常是由于 setuptools 版本问题引起的。本文将介绍如何解决这一问题 当你使用 pip install 安装某个 Python 包时,如果 setuptools 版本过高或过低,可能会导致安装过程出错,并出现类似以下错误信息:error: subpr

插件:清理maven错误缓存.bat

插件:https://pan.baidu.com/s/1nHIxHoo1C4MvFlW7QbZe5Q?pwd=7zenhttps://pan.baidu.com/s/1nHIxHoo1C4MvFlW7QbZe5Q?pwd=7zen没错误缓存时: 有错误缓存时: