在Delphi中,我使用Indy的TIdHTTPWebBrokerBridge
加上TIdHTTP
来通过HTTP发送/接收数据。在服务器上,我没有任何花哨的处理,我总是只回应一个简单的内容流。如果有任何问题,我只会在响应内容中返回有关该问题的信息(例如身份验证失败,请求无效等)。那么,在客户端,我可以假设我对此服务器发出的每个成功请求的响应代码总是为200(OK)吗?
我想知道因为在客户端上,请求被包装在函数中,这些函数只返回一个布尔值以表示请求是否成功。
在此功能内:
IdHTTP.Get(SomeURL, AStream);
Result:= IdHTTP.ResponseCode = 200;
此函数处理可能获取数据的任何请求。如果请求中存在任何问题,则此函数应返回False。在我的场景中,由于我总是在服务器上返回某种内容,客户端总是会在此函数中收到200的响应代码吗?
我想真正的问题是,如果我总是返回某种内容并处理服务器上的所有异常,那么服务器是否总是会向每个请求返回200的状态代码?
答案 0 :(得分:17)
“每个成功的HTTP请求总是返回状态码200吗?”
请参阅w3.org: HTTP/1.1 Status Code Definitions
(RFC 2616
)
答案是否。所有2xx都被认为是成功的。 这可能取决于使用的HTTP method。
你的网络服务器应用程序成功后总是会返回200吗?这也可能取决于请求方法和它打算为客户端发出的信号。 e.g。
PUT
方法(重点是我的):
如果修改了现有资源,则 200 (确定)或 204 (否) 内容)响应代码应该被发送以表示成功 完成请求。
POST
方法:
POST方法执行的操作可能不会产生资源 可以通过URI识别。在这种情况下, 200 (确定)或 204 (No Content)是适当的响应状态,具体取决于是否 或不响应包括描述结果的实体。
如果已在源服务器上创建资源,则为响应 应该 201 (已创建)并包含描述 请求的状态,并引用新资源和位置 标题(见第14.30节)。对此方法的回应不是 可缓存,除非响应包含适当的Cache-Control或 过期标题字段。但是, 303 (见其他)响应可以 用于指示用户代理检索可缓存的资源。
正如您可以从RCF
学到的,每个应该的方法都有自己的成功状态代码,具体取决于实现。
你的另一个问题:
“我可以假设我对此服务器发出的每个成功请求的响应代码总是为200(OK)吗?”
如果您的 Web服务器总是以状态200响应,您总是期望期望状态代码200.您的Web服务器应用程序控制它的响应返回客户端。
也就是说,状态代码200是成功HTTP请求的标准响应(实际响应取决于所使用的请求方法),在Web服务器的现实世界中,应该设置为成功请求时默认,除非另有说明(如Remy's answer中所述)。
答案 1 :(得分:9)
回答您的具体问题:
我可以假设每次成功请求到此服务器的响应代码总是为200(OK)吗?
答案是是,因为TIdHTTPWebBrokerBridge
包装TIdHTTPServer
,它总是将每个请求的默认响应代码设置为200,除非您自己用不同的值覆盖它或者让您的服务器执行隐式回复不同响应代码的内容(例如Redirect()
使用302,或SmartServeFile()
使用304),或遇到导致TIdHTTPServer
分配的错误4xx或5xx错误响应代码。
然而,总的来说,其他人告诉你的是真的。在客户端,您应该处理任何可能的HTTP成功响应代码,而不仅仅是200。不要对服务器实现做任何假设。
事实上,TIdHTTP
已经为您处理了这个问题。如果TIdHTTP
遇到它认为是错误代码的响应代码,则会在您的代码中引发EIdHTTPProtocolException
异常。因此,如果您没有得到异常,则假设响应成功。您无需手动检查响应代码。
如果某个特定的响应代码通常会引发异常,但您不希望这样做,则可以在AIgnoreReplies
或TIdHTTP.Get()
的可选TIdHTTP.DoRequest()
参数中指定该值。或者,如果您使用的是最新的Indy 10 SVN修订版,则最近会在hoNoProtocolErrorException
属性中添加一个新的TIdHTTP.HTTPOptions
标记,因此不会针对任何属性引发EIdHTTPProtocolException
异常响应代码。
答案 2 :(得分:2)
成功回复是2xx List_of_HTTP_status_codes
答案 3 :(得分:1)
我做了以下事情。直接处理所有200`s和LOG异常。工作,而不是一个非200 - 除了未经授权和超时(密码或有时无法使用的服务器)。但很多/所有回复都将被考虑用于各种主流应用。
while (iRedo < 3) do begin
s := Self.HTTPComponent.Get( sUrl );
if self.HTTPComponent.ResponseCode = 200 then begin
break;
end;
// IDEIA - log what happend if not 200
logWhatHappend( s, HTTPComponent ); // then log content, headers, etc
inc( iRedo ); sleep( 5 );
end;