请求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 获取请求参数的常用注解及用法

《SpringBoot获取请求参数的常用注解及用法》SpringBoot通过@RequestParam、@PathVariable等注解支持从HTTP请求中获取参数,涵盖查询、路径、请求体、头、C... 目录SpringBoot 提供了多种注解来方便地从 HTTP 请求中获取参数以下是主要的注解及其用法:1

深度解析Java @Serial 注解及常见错误案例

《深度解析Java@Serial注解及常见错误案例》Java14引入@Serial注解,用于编译时校验序列化成员,替代传统方式解决运行时错误,适用于Serializable类的方法/字段,需注意签... 目录Java @Serial 注解深度解析1. 注解本质2. 核心作用(1) 主要用途(2) 适用位置3

Debian 13升级后网络转发等功能异常怎么办? 并非错误而是管理机制变更

《Debian13升级后网络转发等功能异常怎么办?并非错误而是管理机制变更》很多朋友反馈,更新到Debian13后网络转发等功能异常,这并非BUG而是Debian13Trixie调整... 日前 Debian 13 Trixie 发布后已经有众多网友升级到新版本,只不过升级后发现某些功能存在异常,例如网络转

SpringBoot请求参数传递与接收示例详解

《SpringBoot请求参数传递与接收示例详解》本文给大家介绍SpringBoot请求参数传递与接收示例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋... 目录I. 基础参数传递i.查询参数(Query Parameters)ii.路径参数(Path Va

使用Python的requests库来发送HTTP请求的操作指南

《使用Python的requests库来发送HTTP请求的操作指南》使用Python的requests库发送HTTP请求是非常简单和直观的,requests库提供了丰富的API,可以发送各种类型的HT... 目录前言1. 安装 requests 库2. 发送 GET 请求3. 发送 POST 请求4. 发送

SpringBoot3匹配Mybatis3的错误与解决方案

《SpringBoot3匹配Mybatis3的错误与解决方案》文章指出SpringBoot3与MyBatis3兼容性问题,因未更新MyBatis-Plus依赖至SpringBoot3专用坐标,导致类冲... 目录SpringBoot3匹配MyBATis3的错误与解决mybatis在SpringBoot3如果

nginx配置错误日志的实现步骤

《nginx配置错误日志的实现步骤》配置nginx代理过程中,如果出现错误,需要看日志,可以把nginx日志配置出来,以便快速定位日志问题,下面就来介绍一下nginx配置错误日志的实现步骤,感兴趣的可... 目录前言nginx配置错误日志总结前言在配置nginx代理过程中,如果出现错误,需要看日志,可以把

python运用requests模拟浏览器发送请求过程

《python运用requests模拟浏览器发送请求过程》模拟浏览器请求可选用requests处理静态内容,selenium应对动态页面,playwright支持高级自动化,设置代理和超时参数,根据需... 目录使用requests库模拟浏览器请求使用selenium自动化浏览器操作使用playwright

SpringBoot监控API请求耗时的6中解决解决方案

《SpringBoot监控API请求耗时的6中解决解决方案》本文介绍SpringBoot中记录API请求耗时的6种方案,包括手动埋点、AOP切面、拦截器、Filter、事件监听、Micrometer+... 目录1. 简介2.实战案例2.1 手动记录2.2 自定义AOP记录2.3 拦截器技术2.4 使用Fi

Python错误AttributeError: 'NoneType' object has no attribute问题的彻底解决方法

《Python错误AttributeError:NoneTypeobjecthasnoattribute问题的彻底解决方法》在Python项目开发和调试过程中,经常会碰到这样一个异常信息... 目录问题背景与概述错误解读:AttributeError: 'NoneType' object has no at