请求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

相关文章

SpringBoot排查和解决JSON解析错误(400 Bad Request)的方法

《SpringBoot排查和解决JSON解析错误(400BadRequest)的方法》在开发SpringBootRESTfulAPI时,客户端与服务端的数据交互通常使用JSON格式,然而,JSON... 目录问题背景1. 问题描述2. 错误分析解决方案1. 手动重新输入jsON2. 使用工具清理JSON3.

如何解决Druid线程池Cause:java.sql.SQLRecoverableException:IO错误:Socket read timed out的问题

《如何解决Druid线程池Cause:java.sql.SQLRecoverableException:IO错误:Socketreadtimedout的问题》:本文主要介绍解决Druid线程... 目录异常信息触发场景找到版本发布更新的说明从版本更新信息可以看到该默认逻辑已经去除总结异常信息触发场景复

Python struct.unpack() 用法及常见错误详解

《Pythonstruct.unpack()用法及常见错误详解》struct.unpack()是Python中用于将二进制数据(字节序列)解析为Python数据类型的函数,通常与struct.pa... 目录一、函数语法二、格式字符串详解三、使用示例示例 1:解析整数和浮点数示例 2:解析字符串示例 3:解

CentOS 7 YUM源配置错误的解决方法

《CentOS7YUM源配置错误的解决方法》在使用虚拟机安装CentOS7系统时,我们可能会遇到YUM源配置错误的问题,导致无法正常下载软件包,为了解决这个问题,我们可以替换YUM源... 目录一、备份原有的 YUM 源配置文件二、选择并配置新的 YUM 源三、清理旧的缓存并重建新的缓存四、验证 YUM 源

python web 开发之Flask中间件与请求处理钩子的最佳实践

《pythonweb开发之Flask中间件与请求处理钩子的最佳实践》Flask作为轻量级Web框架,提供了灵活的请求处理机制,中间件和请求钩子允许开发者在请求处理的不同阶段插入自定义逻辑,实现诸如... 目录Flask中间件与请求处理钩子完全指南1. 引言2. 请求处理生命周期概述3. 请求钩子详解3.1

python3 pip终端出现错误解决的方法详解

《python3pip终端出现错误解决的方法详解》这篇文章主要为大家详细介绍了python3pip如果在终端出现错误该如何解决,文中的示例方法讲解详细,感兴趣的小伙伴可以跟随小编一起了解一下... 目录前言一、查看是否已安装pip二、查看是否添加至环境变量1.查看环境变量是http://www.cppcns

python进行while遍历的常见错误解析

《python进行while遍历的常见错误解析》在Python中选择合适的遍历方式需要综合考虑可读性、性能和具体需求,本文就来和大家讲解一下python中while遍历常见错误以及所有遍历方法的优缺点... 目录一、超出数组范围问题分析错误复现解决方法关键区别二、continue使用问题分析正确写法关键点三

Ubuntu上手动安装Go环境并解决“可执行文件格式错误”问题

《Ubuntu上手动安装Go环境并解决“可执行文件格式错误”问题》:本文主要介绍Ubuntu上手动安装Go环境并解决“可执行文件格式错误”问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未... 目录一、前言二、系统架构检测三、卸载旧版 Go四、下载并安装正确版本五、配置环境变量六、验证安装七、常见

正则表达式r前缀使用指南及如何避免常见错误

《正则表达式r前缀使用指南及如何避免常见错误》正则表达式是处理字符串的强大工具,但它常常伴随着转义字符的复杂性,本文将简洁地讲解r的作用、基本原理,以及如何在实际代码中避免常见错误,感兴趣的朋友一... 目录1. 字符串的双重翻译困境2. 为什么需要 r?3. 常见错误和正确用法4. Unicode 转换的

Spring Boot Controller处理HTTP请求体的方法

《SpringBootController处理HTTP请求体的方法》SpringBoot提供了强大的机制来处理不同Content-Type​的HTTP请求体,这主要依赖于HttpMessageCo... 目录一、核心机制:HttpMessageConverter​二、按Content-Type​处理详解1.