2013-02-28 68 views
11

在Delphi中,我使用Indy的TIdHTTPWebBrokerBridgeTIdHTTP通过HTTP发送/接收数据。在服务器上,我没有任何花哨的处理,我总是用一个简单的内容流来回应。如果有任何问题,我只会在响应内容中返回有关该问题的信息(如身份验证失败,无效请求等)。那么,在客户端,我可以假设每次成功的请求都会有200(OK)的响应代码?每个成功的HTTP请求是否总是返回状态码200?

我想知道,因为在客户端上,请求被封装在函数中,这些函数只返回一个布尔值来请求成功。

在这个函数:

IdHTTP.Get(SomeURL, AStream); 
Result:= IdHTTP.ResponseCode = 200; 

这个函数处理这有可能获取数据的任何一个请求。如果请求中有任何问题,该函数应返回False。在我的情况下,由于我总是返回服务器上的某种内容,客户端是否总是会在此函数中收到200的响应代码?

我想真正的问题是,如果我总是回到某种形式的内容和处理服务器上的所有异常,然后将服务器总是返回200状态码每个请求?

回答

9

为了回答您的具体问题:

我可以假设,每一个成功的请求我做到这台服务器总是会有200(OK)响应代码?

答案是,因为TIdHTTPWebBrokerBridge包装TIdHTTPServer,它总是将默认响应码200为每个请求,除非你有不同的价值自己覆盖它,或者你的服务器做一些隐含回复使用不同的响应代码(如使用302的Redirect()或使用304的SmartServeFile()),或遇到错误,导致TIdHTTPServer分配4xx或5xx错误响应代码。

但是,一般来说,别人告诉你的是真的。在客户端,你应该处理任何可能的HTTP成功响应代码,而不仅仅是200个。不要对服务器实现做任何假设。

实际上,TIdHTTP已经为您处理。如果TIdHTTP遇到它认为是错误代码的响应代码,它会在您的代码中产生一个EIdHTTPProtocolException异常。因此,如果您没有发现异常情况,请假定响应成功。您不需要手动检查响应代码。

如果存在通常会引发异常但您不想要的特定响应代码,则可以在参数TIdHTTP.Get()TIdHTTP.DoRequest()的可选AIgnoreReplies参数中指定该值。或者,如果您使用的是最新的Indy 10 SVN修订版,则最近会在TIdHTTP.HTTPOptions属性中添加新的hoNoProtocolErrorException标志,因此不会为任何响应代码引发EIdHTTPProtocolException异常。

+0

我接受你的回答,因为它直接针对我的确切场景,而不是一般的HTTP标准。其他答案虽然非常真实,但假设服务器根据标准响应各种不同的响应,但我的服务器不是标准的。事实上,我故意让安全措施难以工作。 – 2013-03-01 00:14:52

+0

加上你是一个宝贵的资源,因为你是Indy团队的一员:D – 2013-03-01 00:36:37

2

成功resposes是2XX List_of_HTTP_status_codes

+0

是的,我正在看同一个链接,但我的意思是,我使用它的方式是否有可能得到200以外的东西?我能否假设2xx范围内的任何成功?我的所有测试都返回200,我想知道它不是200的可能性。 – 2013-02-28 20:46:14

+0

可能性取决于您的计划使用情况,可以在发布和休息的环境中找到不是200的示例。例如http://bitworking.org/projects/atom/rfc5023.html#crwp – bummi 2013-02-28 20:58:49

+0

所以答案是我应该检查代码是否在200..299范围内,而不是仅仅是200? – 2013-02-28 21:04:29

17

“是否每一个成功的HTTP请求总是返回状态代码200?”

w3.org: HTTP/1.1 Status Code DefinitionsRFC 2616

答案是没有。所有2xx都被认为是成功的。 这可能取决于使用的HTTP method

应该 Web服务器应用程序始终在成功时返回200?这也可能取决于请求方法和它打算给客户端的信号。例如

PUT方法(重点是矿):

如果现有的资源被修改,无论是(OK)或(否 内容)响应代码SHOULD被发送表示成功 完成请求。

POST方法:

由POST方法可能不会导致资源 可以通过URI标识的行动。在这种情况下,(OK)或 (无内容)是合适的响应状态,取决于 是否响应包括描述结果的实体。

如果资源已经在源服务器上创建的,则响应 应该是(创建)和包含其描述请求的 状态,指的是新的资源的实体,和一个位置 表头(见14.30节)。除非响应中包含适当的Cache-Control或Expires标头字段,否则对此方法的响应不是可缓存的,可以是 。但是,(请参阅其他)响应可能是 ,用于指示用户代理检索可缓存资源。

你可以从RCF好好学习,天天方法应该有它自己的成功状态码,这取决于实现。

您的其他问题:

“我认为每一个成功的请求我做这个服务器总是会有200(OK)响应代码?”

可以总是期望的状态码200,如果你 Web服务器总是与状态200.你的Web服务器应用控制它返回给客户端什么反应响应。

这就是说,状态代码200是用于成功的HTTP请求标准响应(实际的响应将取决于所使用的请求方法),并在web服务器的现实世界中,应设置为默认在除非另有说明(如Remy's answer中所述)。

+3

+1的全面描述 – bummi 2013-02-28 22:33:27

+0

感谢您的完美解释,但请参阅我刚刚接受的Remy的答案,而不仅仅是因为它是特定的到我的确切场景。 – 2013-03-01 00:16:51

+4

@Jerry,NP,你应该选择最适合你的答案。雷米给你一个很好的答案,并从我这里得到了+1。我的答案对所有的HTTP服务器都是通用的,事实上,如果你的客户端使用IdHTTP并且服务器是TIdHTTPServer就不重要了。无论如何,你应该始终尊重RCF。很多'应该'呃? :) – kobik 2013-03-01 16:01:49

1

我做了以下。处理所有200和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; 
相关问题