delphi - 如何通过 idHTTP 获取(即读取)https 响应。通常是 REST 授权

标签 delphi ssl http-headers delphi-xe3 idhttp

我需要通过链接“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":"Invalid user login or password"}

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

最佳答案

这对 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 响应并自动使用密码重新发送请求。

关于delphi - 如何通过 idHTTP 获取(即读取)https 响应。通常是 REST 授权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21988015/

相关文章:

delphi - 在Delphi中对Double数组的动态数组进行排序

sql - Delphi中从sql server表动态创建弹出菜单树

ajax - 如何检查WebBrowser是否已完全完成?

http - 设置请求 header : Connection

delphi - 简单的 TListView 保存文件和从文件加载(仅保存列字符串值)

android - Android 的 SSL 问题

amazon-web-services - 如何将我的 http 网站转为 https

java - 如何在 Tomcat 8 和 Java 8 中重新启用 SSLv3

http - CORS Access-Control-Max-Age 被忽略

ios - 设置 "Content-Encoding: gzip"时 AFNetworking 无法恢复下载