【问题标题】:How to GET (i.e read) https response via idHTTP. Typically REST authorization如何通过 idHTTP 获取(即读取)https 响应。通常是 REST 授权
【发布时间】:2014-02-24 12:37:58
【问题描述】:

我需要通过链接“https://mysite.sexy/sessionid?login=abc&password=abc”进行授权,并且我将 TidHttp 和 TIdSSLIOHandlerSocketOpenSSL 都连接了。

我发送一个查询:

http.get("https://mysite.sexy/sessionid?login=abc&password=abc");

但几秒钟后,我没有得到任何响应,而是得到了这个异常:“HTTP/1.1 401 Unauthorized.

我在网上搜索并得到了以下解决方案:

http.Request.UserName :=  'abc';
http.Request.Password := 'abc';
http.Request.UserAgent := 'Mozilla/5.0 (X11; U; Linux i686; cs-CZ; rv:1.7.12) Gecko/20050929';

但无论如何它仍然无济于事。但是,通过 Chrome 浏览器的网站响应不会作为异常发生,只会以 JSON 格式检索错误代码和描述:

{"Code":4,"Desc":"无效的用户登录名或密码"}

所以这个响应是我正在等待的,但只得到异常和线程停止。 请指点! 德尔福 XE3。

【问题讨论】:

标签: delphi ssl http-headers delphi-xe3 idhttp


【解决方案1】:

这对 Indy 来说是正常的。它会为不成功的响应(如 401)引发异常。如果您真的对响应文本感兴趣,您需要捕获异常并然后检查响应文本。 (通常情况下,您不会,因为仅响应代码就可以告诉您您需要知道的一切。)当您遇到异常时,响应文本将位于异常的 ErrorMessage 属性中。

try
  x := http.get("https://mysite.sexy/sessionid?login=abc&password=abc");
except
  on E: EIdHTTPProtocolException do begin
    if E.ErrorCode = 401 then
      x := E.ErrorMessage
    else
      raise;
  end;
end;

设置请求对象的授权属性显然没有帮助,因为您的服务器不使用标准 HTTP 身份验证。否则,Indy 将处理 401 响应并自动重新发送带有密码的请求。

【讨论】:

  • 哦,我离它太近了;)我只是用来检查 E.ErrorCode 而不是 ErrorMessage。通过调试模式可以看出,SSLIO 本身包含所有内容,包括标题和 html 正文。我只是不知道如何得到它。好吧,这解决了问题,但如果出现其他标题而不是401,可能会导致一些问题。我只需要处理这些问题......
  • 仅供参考,TIdHTTP 在内部处理 401 和 407,每次触发 OnSelect(Proxy)AuthorizationOn(Proxy)Authorization 事件,直到超过 TIdHTTP.MaxAuthRetries。您还需要确保在TIdHTTP.HTTPOptions 属性中启用了hoInProcessAuth 标志。
猜你喜欢
  • 2012-05-09
  • 2015-04-12
  • 2011-06-25
  • 2018-10-15
  • 1970-01-01
  • 1970-01-01
  • 2014-03-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多