在Delphi中,我使用Indy的TIdHTTPWebBrokerBridge
和TIdHTTP
通过HTTP发送/接收数据。在服务器上,我没有任何花哨的处理,我总是只用简单的内容流进行响应。如果有任何问题,我只会在响应内容中返回有关该问题的信息(例如身份验证失败,无效请求等)。因此,在客户端,我是否可以假定我向该服务器发出的每个成功请求始终具有200(确定)的响应代码?
我想知道,因为在客户端上,请求被包装在函数内部,这些函数仅返回 bool 值以确保请求成功。
在此函数内部:
IdHTTP.Get(SomeURL, AStream);
Result:= IdHTTP.ResponseCode = 200;
该函数处理所有可能获取数据的请求。如果请求中有任何问题,则此函数应返回False。在我的场景中,由于我总是在服务器上返回某种内容,因此在此函数中客户端是否总是会收到200的响应代码?
我想真正的问题是,如果我总是返回某种内容并处理服务器上的所有异常,那么服务器将始终为每个请求返回200的状态码吗?
最佳答案
要回答您的特定问题:
答案是是,因为TIdHTTPWebBrokerBridge
会包装TIdHTTPServer
,它始终将每个请求的默认响应代码设置为200,除非您自己用不同的值覆盖它,或者让服务器执行隐式回复不同响应代码的操作(例如使用302的Redirect()
或使用304的SmartServeFile()
),或遇到导致TIdHTTPServer
分配4xx或5xx错误响应代码的错误。
但是,总的来说,其他人告诉您的是正确的。在客户端,您应该处理任何可能的HTTP成功响应代码,而不仅仅是200个。不要对服务器实现做任何假设。
实际上,TIdHTTP
已经为您处理了。如果TIdHTTP
遇到被认为是错误代码的响应代码,它将在您的代码中引发EIdHTTPProtocolException
异常。因此,如果没有异常,请假定响应成功。您无需手动检查响应代码。
如果存在通常会引发异常的特定响应代码,但您不希望出现此异常,则可以在AIgnoreReplies
或TIdHTTP.Get()
的可选TIdHTTP.DoRequest()
参数中指定该值。或者,如果您正在使用最新的Indy 10 SVN修订版,则最近在hoNoProtocolErrorException
属性中添加了新的TIdHTTP.HTTPOptions
标志,因此对于任何响应代码都不会引发EIdHTTPProtocolException
异常。