目录
delphi版HTTP/1. 1 405 Method Not Allowed的终极解释及Http(s)请求的常见错误
5.2、Read time out错误 :读取超时错误:即客户端协议http请求无误,但服务器协议找不到对应端口8086时,会报此错误。
delphi版HTTP/1. 1 405 Method Not Allowed的终极解释及Http(s)请求的常见错误
一、概念
1.1、这个提示的意思
HTTP/1.1的客户端请求Method,,按照互联网工程任务组(IETF)的 Hypertext Transfer Protocol Bis(httpbis)工作小组提交 IESG通过的现实标准,HTTP已从HTTP/0.9、HTTP/1.0、HTTP/1.1、HTTP/2,发展到HTTP/3,HTTP/2成为当今HTTP的现实标准,它完整包含了HTTP/1.1,无非就那几种:GET、POST、HEAD、PUT、OPTIONS、DELETE、TREACE、CONNECT 8 种请求方法,最常用的是Head、Get、Post。
其次,这个错误提示,它是客户端的提示,是说,客户端用HTTP/1. 1协议版本请求服务器端的Web服务器(比如IIS或Apache)或应用服务器中间件时,Web服务器或应用服务器中间件所提供的服务,不允许客户端进行访问。并非开发者那么弱智,错误使用了这几种请求方法。
1.2、璧瑶互联网上的常用说法
类似“将出错页面表单的method=“post”改为“get”即可”......不一而举。
二、排错方法
2.1、检查Web服务器或应用服务器中间件所提供的服务
当物理服务器上,Web服务器和应用服务器中间件并存运行时,且开通了SSL支持运行HTTPs时,当调用http而非https或公用运行80端口时,最容易混淆,是哪个逻辑服务器在提供服务。
这时,会让客户端误判本案的错误提示。
2.2、检查客户端的HTTP(s)请求类型
同2.1,客户端应当完全匹配服务端所提供的服务,否则,也会造成本案的错误提示。
三、案例
比如:物理服务器开放了80、8085、8086端口,逻辑服务器:Web服务器IIS上跑http跑80端口和https跑默认的443端口和已重定向的8080端口,应用服务器中间件MySvr同时支持http跑8085、https跑8086端口。
请求同一个资源:http://www.cpuofbs.com:8085/image/a.txt
此时,稍有不慎,开发者开发客户端App时,在用Head或Get方法,获取或下载服务器端的数据时,很容易误用http(s)及其端口的匹配:
什么原因呢:是因为 窗体组件,使用的是SSL的IO处理器:
IdHttp.IOHandler := IdSSLIOHandlerSocketOpenSSL1;
四、小结
当“资源提供者”(比如http://www.cpuofbs.com:8085/image/a.txt)和“请求的Http(s)协议”(比如IdHttp.IOHandler)不相匹配时,才会提示“HTTP/1. 1 405 Method Not Allowed”错误。
五、Http(s)请求的常见错误:
5.1、404错误 :资源没有找到,即无此资源。
在http的8085端口下Web服务器IIS并未提供该服务,它是由应用服务器中间件MySvr提供的服务,但资源的文件aaa.txt物理不存在:
资源的文件存在,但https的服务提供者(应用服务器中间件MySvr)并未提供该/API路径(image)下的文件服务:
5.2、Read time out错误 :读取超时错误:即客户端协议http请求无误,但服务器协议找不到对应端口8086时,会报此错误。
5.3、class EIdosSLUnderlyingCryptoError with message Error connecting error with SSL错误 :用SSL错误连接,意思是客户端以Https协议请求服务器资源,但服务端找不到对应请求的端口8085:
错误的具体描述为:error: 1408F 10B:SSL routines:SSL3_ GET_ RECORD:wrong version number:即端口错误的意思。
六、常见的HTTP状态码: | |||
状态码
| 错误类型 | 一般的解决方案 | 典型错误码示例 |
200 - OK | 处理成功 | ||
204 - No Content | 处理成功,无返回Body | ||
400 - Bad Request | 协议或者参数非法 | 请根据接口返回的详细信息检查您的程序 | PARAM_ERROR |
401 - Unauthorized | 签名验证失败 | 请检查签名参数和方法是否都符合签名算法要求 | SIGN_ERROR |
403 - Forbidden | 权限异常 | 请开通商户号相关权限。请联系产品或商务申请 | NO_AUTH |
404 - Not Found | 请求的资源不存在 | 请商户检查需要查询的id或者请求URL是否正确 | ORDER_NOT_EXIST |
429 - Too Many Requests | 请求超过频率限制 | 请求未受理,请降低频率后重试 | RATE_LIMITED |
500 - Server Error | 系统错误 | 按具体接口的错误指引进行重试 | SYSTEM_ERROR |
502 - Bad Gateway | 服务下线,暂时不可用 | 请求无法处理,请稍后重试 | SERVICE_UNAVAILABLE |
503 - Service Unavailable | 服务不可用,过载保护 | 请求无法处理,请稍后重试 | SERVICE_UNAVAILABLE |
七、Http(s) API调用常见错误码:
错误码 | 错误消息 | HTTP状态码 | 描述 |
---|---|---|---|
AccessDenied | Access denied. | 403Forbidden | 无权限访问对应的资源。 |
InappropriateJSON | The JSON you provided was well-formed and valid, but not appropriate forthis operation. | 400 Bad Request | 请求中的JSON格式正确,但语义上不符合要求。如缺少某个必需项,或值类型不匹配等。出于兼容性考虑,对于所有无法识别的项应直接忽略,不应该返回这个错误。 |
InternalError | We encountered an internal error Please try again. | 500 Internal Server Error | 所有未定义的其他错误。在有明确对应的其他类型的错误时(包括通用的和服务自定义的)不应该使用。 |
InvalidAccessKeyId | The Access Key ID you provided doesnot exist in our records. | 403Forbidden | Access Key ID不存在。 |
InvalidHTTPAuthHeader | The Access Key ID you provided does notexist in our records. | 400 BadRequest | Authorization头域格式错误。 |
InvalidHTTPRequest | There was an error in the body of your HTTP request. | 400 Bad Request | HTTP body格式错误。例如不符合指定的Encoding等。 |
InvalidURI | Could not parse the specified URI. | 400 Bad Request | URI形式不正确。例如一些服务定义的关键词不匹配等。对于ID不匹配的问题,应定义更加具体的错误码,如NoSuchKey。 |
MalformedJSON | The JSON you provided was not well-formed. | 400 BadRequest | JSON格式不合法。 |
InvalidVersion | The API version specified was invalid. | 404 NotFound | URI的版本号不合法。 |
OptInRequired | A subscription for the service is required. | 403Forbidden | 没有开通对应的服务。 |
PreconditionFailed | The specified If-Match header doesn’tmatch the ETag header. | 412PreconditionFailed | 详见Etag。 |
RequestExpired | Request has expired. Timestamp date is <Data>. | 400 BadRequest | 请求超时。要改成x-bce-date。若请求中只有Date,需将Date转成datetime。 |
IdempotentParameterMismatch | The request uses the same client token asa previous, but non-identical request. | 403Forbidden | clientToken对应的API参数不一样。 |
SignatureDoesNotMatch | The request signature we calculated does not match the signature you provided. Check yourSecret Access Key and signing method. Consultthe service documentation for details. | 400 Bad Request | Authorization头域中附带的签名和服务端验证不一致。 |
八、Http(s) API调用状态码大全:
状态码 | 编码 | 错误码说明 |
---|---|---|
100 | Continue | 继续请求。 这个临时响应用来通知客户端,它的部分请求已经被服务器接收,且仍未被拒绝。 |
101 | Switching Protocols | 切换协议。只能切换到更高级的协议。 例如,切换到HTTP的新版本协议。 |
201 | Created | 创建类的请求完全成功。 |
202 | Accepted | 已经接受请求,但未处理完成。 |
203 | Non-Authoritative Information | 非授权信息,请求成功。 |
204 | NoContent | 请求完全成功,同时HTTP响应不包含响应体。 在响应OPTIONS方法的HTTP请求时返回此状态码。 |
205 | Reset Content | 重置内容,服务器处理成功。 |
206 | Partial Content | 服务器成功处理了部分GET请求。 |
300 | Multiple Choices | 多种选择。请求的资源可包括多个位置,相应可返回一个资源特征与地址的列表用于用户终端(例如:浏览器)选择。 |
301 | Moved Permanently | 永久移动,请求的资源已被永久的移动到新的URI,返回信息会包括新的URI。 |
302 | Found | 资源被临时移动。 |
303 | See Other | 查看其它地址。 使用GET和POST请求查看。 |
304 | Not Modified | 所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。 |
305 | Use Proxy | 所请求的资源必须通过代理访问。 |
306 | Unused | 已经被废弃的HTTP状态码。 |
400 | BadRequest | 非法请求。 建议直接修改该请求,不要重试该请求。 |
401 | Unauthorized | 在客户端提供认证信息后,返回该状态码,表明服务端指出客户端所提供的认证信息不正确或非法。 |
402 | Payment Required | 保留请求。 |
403 | Forbidden | 请求被拒绝访问。 返回该状态码,表明请求能够到达服务端,且服务端能够理解用户请求,但是拒绝做更多的事情,因为该请求被设置为拒绝访问,建议直接修改该请求,不要重试该请求。 |
404 | NotFound | 所请求的资源不存在。 建议直接修改该请求,不要重试该请求。 |
405 | MethodNotAllowed | 请求中带有该资源不支持的方法。 建议直接修改该请求,不要重试该请求。 |
406 | Not Acceptable | 服务器无法根据客户端请求的内容特性完成请求。 |
407 | Proxy Authentication Required | 请求要求代理的身份认证,与401类似,但请求者应当使用代理进行授权。 |
408 | Request Time-out | 服务器等候请求时发生超时。 客户端可以随时再次提交该请求而无需进行任何更改。 |
409 | Conflict | 服务器在完成请求时发生冲突。 返回该状态码,表明客户端尝试创建的资源已经存在,或者由于冲突请求的更新操作不能被完成。 |
410 | Gone | 客户端请求的资源已经不存在。 返回该状态码,表明请求的资源已被永久删除。 |
411 | Length Required | 服务器无法处理客户端发送的不带Content-Length的请求信息。 |
412 | Precondition Failed | 未满足前提条件,服务器未满足请求者在请求中设置的其中一个前提条件。 |
413 | Request Entity Too Large | 由于请求的实体过大,服务器无法处理,因此拒绝请求。为防止客户端的连续请求,服务器可能会关闭连接。如果只是服务器暂时无法处理,则会包含一个Retry-After的响应信息。 |
414 | Request-URI Too Large | 请求的URI过长(URI通常为网址),服务器无法处理。 |
415 | Unsupported Media Type | 服务器无法处理请求附带的媒体格式。 |
416 | Requested range not satisfiable | 客户端请求的范围无效。 |
417 | Expectation Failed | 服务器无法满足Expect的请求头信息。 |
422 | UnprocessableEntity | 请求格式正确,但是由于含有语义错误,无法响应。 |
429 | TooManyRequests | 表明请求超出了客户端访问频率的限制或者服务端接收到多于它能处理的请求。建议客户端读取相应的Retry-After首部,然后等待该首部指出的时间后再重试。 |
500 | InternalServerError | 表明服务端能被请求访问到,但是不能理解用户的请求。 |
501 | Not Implemented | 服务器不支持请求的功能,无法完成请求。 |
502 | Bad Gateway | 充当网关或代理的服务器,从远端服务器接收到了一个无效的请求。 |
503 | ServiceUnavailable | 被请求的服务无效。 建议直接修改该请求,不要重试该请求。 |
504 | ServerTimeout | 请求在给定的时间内无法完成。客户端仅在为请求指定超时(Timeout)参数时会得到该响应。 |
505 | HTTP Version not supported | 服务器不支持请求的HTTP协议的版本,无法完成处理。 |
本博客相关:
《delphi Restful:客户端实现的四种方式及其比较》
https://blog.youkuaiyun.com/pulledup/article/details/104132753
喜欢的话,就在下面点个赞、收藏就好了,方便看下次的分享: