目录
405-方法不被允许(Method not allowed)
415-不支持的媒体类型(Unsupported Media Type)
今天主要讨论的是4**错误及引起该错误最常见的原因。细心!!!
400-坏请求(Bad request)
原因:1.参数名称或参数类型不匹配,导致无法封装;参数个数不会影响!!!
2.前端提交的不是正确的json字符串类型
解决方案:
1.对照字段名称,类型保证一致性
2.使用stringify将前端传递的对象转化为字符串data: JSON.stringify(param)
401-未授权 (Unauthorized)
原因:1.token过期
2.客户端没传token,或授权失败未通过身份认证
403-资源不可用(Forbidden)
服务器理解客户的请求,但拒绝处理它,该请求不该重发给服务器。通常由于服务器上文件或目录的权限设置导致的WEB访问错误。
原因:1.IIS或者apache设置访问权限不当 栗子
解决方案:
1.1.httpd.cnof 或 YOUR_WEB_SITE.conf 中 选项中确保 Require all granted
1.2.httpd.cpnf 或 YOUR_WEB_SITE.conf 中 User 和 Group 选项确保是 www
1.3.YOUR_WEB_SITE.conf 中的 DocumentRoot
选项中,有没有 index 文件,没有要添加或者更换目录
404-网页不存在(NOT FOUND)
原因:路径写错、该接口不存在
405-方法不被允许(Method not allowed)
原因:方法类型用错,一般情况只要修改请求方式就可以了,post方法写成get或反之,post方法如果没有提交内容,用get即可。
http请求方式如下:OPTIONS( 选项 ) :查找适用于一个特定网址资源的通讯选择。 在不需执行具体的涉及数据传输的动作情况下, 允许客户端来确定与资源相关的选项以及 / 或者要求, 或是一个服务器的性能。
- GET( 获取 ) :检索由网址资源所确定的信息,如获取一个特定的网页或图片。这是最常用的方法。
- HEAD( 头 ) :除了服务器只反馈标头信息而不是网址资源所确定的信息本身外, 基本同于 GET ( 获取 ) 。 可用于获取一个请求所要求的响应实体的元信息 ( metainformation) ,而不需传输响应实体本身。 经常用来测试超文本链接的有效性, 可达性, 和最近的修改。
- POST( 投寄 ) :将数据提交到 Web 服务器,如 1 )在电子公告板,新闻组中,或向 邮件名单发送信息, 2 )提供输入数据 - 通常由一个公共网关接口(CGI) 表, 到 一个数据处理进程, 3 )直接将记录添加到一个数据库中。
- PUT( 放置 ) :将一个具体网址的数据设置( 置入 / 替换)成客户提交的新数据。例如,将新的网页上载给服务器。
- DELETE( 删除 ) :删除与网址资源相关的数据。例如,删除网页。
- TRACE( 跟踪 ) :运行请求信息的一个远程应用层回送。 实际上是一个 'ping', 用以测试 Web 服务器正在从客户端接收什么数据。
- CONNECT( 连接 ) :保留以便通过代理服务器和隧道一起使用(如 SSL )。这种方法只在 HTTP 1.1 版中定义, 而在先前的 1.0 版中却没有。
406-非可接受的(Not Acceptable)
一般指客户端浏览器不接受所请求页面的MIME类型,再说白点就是后台的返回结果前台无法解析。
请求头(Request Headers)中看到请求信息是json格式,响应头(Response Hraders)中却发现返回信息的格式是“text/html”,前台无法解析,需将结果转换成json格式返回给前台。
在ssm框架中使用的@ResponseBody注解或将返回值变成json形式返回到前台页面
原因:1.json所依赖的jar包不存在,如果想要使用@ResponseBody返回json格式,就需要加载这三个包:jackson-core、jackson-databind和jackson-annotations
2.后缀是html不能响应json数据
解决方案:
1.如果是maven项目的话,可以将以下依赖导入pom文件中:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.7.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.7.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.7.3</version>
</dependency>
<!--json转化器,它可以将结果转化-->
<bean id="mappingJacksonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/json;charset=UTF-8</value>
</list>
</property>
</bean>
注意:spring和jackson版本
如果是使用的spring 4.0.*的话,可以引入jackson1.9.*的包,
如果是使用的spring4.1.*的话,可以引入jackson2.7.*的。
2.在做伪静态化过程中,常以.html结尾的后缀,当做post请求时,不能响应json格式,这是spring官方做出的处理:
可以加一个后缀改为.action。如:
这时访问方式变为:
3.一般我们是配置在mvc配置文件中需要配置<mvc:annotation-driven />, 所以我们只要修改下这里就行,修改配置代码如下:
<mvc:annotation-driven content-negotiation-manager="contentNegotiationManager" />
<!-- 以.html为后缀名访问,默认返回数据类型是 text/html, 所以要修改返回的数据类型 -->
<bean id="contentNegotiationManager" class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
<property name="mediaTypes">
<map>
<entry key="html" value="application/json;charset=UTF-8"/>
</map>
</property>
</bean>
406和415放在一起讨论
415-不支持的媒体类型(Unsupported Media Type)
碰到个415的错误,特此记录一下
原因:1.发送HTTP报文的请求头中的Content-Type有关,很大可能是没带Content-Type字段,或发送数据格式与Content-Type定义数据格式不符。
客户端向服务器发送数据,客户端不告诉服务器发送什么格式的数据,服务器可能直接拒识。
解决方案:
1.根据实际情况加上Content-Type即解决
415和406比较
官方定义
状态码 | 官方定义 |
---|---|
415 | 对于当前请求的方法和所请求的资源,请求中提交的实体并不是服务器中所支持的格式,因此请求被拒绝。 |
406 | 请求的资源的内容特性无法满足请求头中的条件,因而无法生成响应实体。 除非这是一个 HEAD 请求,否则该响应就应当返回一个包含可以让用户或者浏览器从中选择最合适的实体特性以及地址列表的实体。实体的格式由 Content-Type 头中定义的媒体类型决定。浏览器可以根据格式及自身能力自行作出最佳选择。但是,规范中并没有定义任何作出此类自动选择的标准。 |
(1)Accept代表发送端(客户端)希望接受的数据类型。
比如:Accept:text/xml,代表客户端希望接受的数据类型是xml类型。
发送数据格式与Accept定义不符报406。
(2)Content-Type代表发送端(客户端|服务器)发送的实体数据的数据类型。
比如:Content-Type:text/html,代表发送端发送的数据格式是html。
发送类型没说明(没发送Content-Type)或发送数据格式与Content-Type定义数据格式不符报415。
408-请求超时 (Request Timeout)
请求发送到该网站服务器(即请求加载网页)花的时间比该网站的服务器准备等待的时间要长。
剩下的遇到再补充吧
411-所需长度(Length Required )
412-先决条件失败(Precondition Failed)
413 请求实体太大(Request Entity Too Large)
414 请求URI太长(Request-URI Too Long)
416 不能满足所请求的范围(Requested Range Not Stisfiable)
417 期望失败(Expectation Failed)