[分享]可以用POST方法访问HTTPS的函数

hsfzxjy 2013-07-17 08:29:55
前些日子,我一直被如何用TIdHTTP控件访问HTTPS弄得焦头烂额,最后终于受不了了,决定自己写一个。我调用了WinINet.DLL的API,效果还不错:

uses WinINet, Windows, Sysutils, Classes, IDURI;

procedure Post(url, data:string;res:TStream);
var
hInt,hConn,hreq:HINTERNET;
buffer:PChar;
dwRead, dwFlags:cardinal;
port: Word;
uri: TIdURI;
proto, host, path: string;
begin
uri := TIdURI.Create(url);
host := uri.Host;
path := uri.Path + uri.Document;
proto := uri.Protocol;
uri.Free;
if UpperCase(proto) = 'HTTPS' then
begin
port := INTERNET_DEFAULT_HTTPS_PORT;
dwFlags := INTERNET_FLAG_SECURE;
end
else
begin
port := INTERNET_INVALID_PORT_NUMBER;
dwFlags := INTERNET_FLAG_RELOAD;
end;
hInt := InternetOpen('Delphi',INTERNET_OPEN_TYPE_PRECONFIG,nil,nil,0);
hConn := InternetConnect(hInt,PChar(host),port,nil,nil,INTERNET_SERVICE_HTTP,0,0);
hreq := HttpOpenRequest(hConn,'POST',PChar(Path),'HTTP/1.1',nil,nil,dwFlags,0);
GetMem(buffer, 65536);
if HttpSendRequest(hReq,nil,0,PChar(data),Length(data)) then
begin
dwRead:=0;
repeat
InternetReadFile(hreq,buffer,65536,dwRead);
if dwRead<>0 then
res.Write(buffer^, dwRead);
until dwRead=0;
end;
InternetCloseHandle(hreq);
InternetCloseHandle(hConn);
InternetCloseHandle(hInt);
FreeMem(buffer);
end;

详见:http://download.csdn.net/detail/hsfzxjy/5772195
...全文
5725 41 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
41 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_33887097 2016-01-29
  • 打赏
  • 举报
回复
xe十Windows10不行,无数据追返回
日总是我哥 2014-11-08
  • 打赏
  • 举报
回复
这是d2009以下版本编译的?
feihu980 2013-08-30
  • 打赏
  • 举报
回复
支持啊,终于找到能用的了,用idhttp去get老是出错
hsfzxjy 2013-08-06
  • 打赏
  • 举报
回复
努力学习中
雄牛 2013-08-04
  • 打赏
  • 举报
回复
你好,大虾 我是http://bbs.csdn.net/topics/39051862的楼主, 请问你给的代码如何调用?谢了 我的所有坐标点信息都保存在 PointNote1:Array of TPointNote; TPointNote的定义如下: TPointNote=record X:Integer; Y:Integer; Color:TColor; end;
雄牛 2013-08-04
  • 打赏
  • 举报
回复
上面的地址可以, 之前那个不行是因为URL少了个4
雄牛 2013-08-04
  • 打赏
  • 举报
回复
引用 37 楼 HSFZXJY 的回复:
[quote=引用 35 楼 cowbo 的回复:] 你好,大虾 我是http://bbs.csdn.net/topics/39051862的楼主, 请问你给的代码如何调用?谢了 我的所有坐标点信息都保存在 PointNote1:Array of TPointNote; TPointNote的定义如下: TPointNote=record X:Integer; Y:Integer; Color:TColor; end;
还有你的帖子肿么404了。。[/quote] http://bbs.csdn.net/topics/390518624 可以打开的 复制了再粘贴到地址栏. 你回复过的
hsfzxjy 2013-08-04
  • 打赏
  • 举报
回复
引用 35 楼 cowbo 的回复:
你好,大虾 我是http://bbs.csdn.net/topics/39051862的楼主, 请问你给的代码如何调用?谢了 我的所有坐标点信息都保存在 PointNote1:Array of TPointNote; TPointNote的定义如下: TPointNote=record X:Integer; Y:Integer; Color:TColor; end;
还有你的帖子肿么404了。。
hsfzxjy 2013-08-04
  • 打赏
  • 举报
回复
引用 35 楼 cowbo 的回复:
你好,大虾 我是http://bbs.csdn.net/topics/39051862的楼主, 请问你给的代码如何调用?谢了 我的所有坐标点信息都保存在 PointNote1:Array of TPointNote; TPointNote的定义如下: TPointNote=record X:Integer; Y:Integer; Color:TColor; end;
哪有用一维数组储存一幅图的。。如果你用二维数组那我的算法就能用
山东蓝鸟贵薪 2013-08-02
  • 打赏
  • 举报
回复
努力学习中 一定要比你强
浩南_哥 2013-08-01
  • 打赏
  • 举报
回复
先收藏
「已注销」 2013-08-01
  • 打赏
  • 举报
回复
Wininet感觉不好使,多线程老是会出一点问题,还是喜欢直接用socket,直接发送请求数据
  • 打赏
  • 举报
回复
可以用,同样的URL,indy报http/1.1 400 bad request,搞不明白是控件问题,还是URL问题, 用这个类,可以返回结果,说明,不是URL或者网站问题,而是Indy支持https太弱了。
hsfzxjy 2013-07-27
  • 打赏
  • 举报
回复
引用 25 楼 zhuchuankun 的回复:
请用下面的URL验证这个自写的类,是否能返回一个xml文件, https://mws.amazonservices.com.cn/Orders/2011-01-01?Action=ListOrders&AWSAccessKeyId=AKIUGXGUQ&LastUpdatedAfter=2013-07-19T10:38:17.670Z&MaxResultsPerPage=100&Merchant=A36T9W62I&OrderStatus=Unshipped&SignatureMethod=HmacSHA256&SignatureVersion=2×tamp=2013-07-26T10:38:17.687Z&Version=2011-01-01&Signature=thNnmggU2XeMVZTxscSFEKSxa0%3D
OK
  • 打赏
  • 举报
回复
如果能返回xml文件,那么访问https网址,能得到xml文件的流。
  • 打赏
  • 举报
回复
请用下面的URL验证这个自写的类,是否能返回一个xml文件, https://mws.amazonservices.com.cn/Orders/2011-01-01?Action=ListOrders&AWSAccessKeyId=AKIUGXGUQ&LastUpdatedAfter=2013-07-19T10:38:17.670Z&MaxResultsPerPage=100&Merchant=A36T9W62I&OrderStatus=Unshipped&SignatureMethod=HmacSHA256&SignatureVersion=2×tamp=2013-07-26T10:38:17.687Z&Version=2011-01-01&Signature=thNnmggU2XeMVZTxscSFEKSxa0%3D
ksjxqy 2013-07-27
  • 打赏
  • 举报
回复
引用 22 楼 truexf 的回复:
wininet无源码。除了问题不好整。。indy和ics都有源码,我还是更倾向使用,特别是些服务端ssl的时候,需要各种ca证书啥的,wininet不灵活。至于openssl的两个dll,不应该是困扰吧。网上下载,或自己下载下来编译一下也不复杂。
你调用的socket api也没有源码的,出了问题咋整?
hsfzxjy 2013-07-27
  • 打赏
  • 举报
回复
引用 28 楼 u011512342 的回复:

var value: DWORD;

value = SECURITY_FLAG_IGNORE_CERT_CN_INVALID or
        SECURITY_FLAG_IGNORE_CERT_DATE_INVALID or
        SECURITY_FLAG_IGNORE_UNKNOWN_CA or
        SECURITY_FLAG_IGNORE_CERT_WRONG_USAGE;

WinHttpSetOption(hreq, WINHTTP_OPTION_SECURITY_FLAGS, @value, SizeOf(value));
设置一下option,就能正常访问证书有问题的站点了
谢谢,学习了
ksjxqy 2013-07-27
  • 打赏
  • 举报
回复

var value: DWORD;

value = SECURITY_FLAG_IGNORE_CERT_CN_INVALID or
        SECURITY_FLAG_IGNORE_CERT_DATE_INVALID or
        SECURITY_FLAG_IGNORE_UNKNOWN_CA or
        SECURITY_FLAG_IGNORE_CERT_WRONG_USAGE;

WinHttpSetOption(hreq, WINHTTP_OPTION_SECURITY_FLAGS, @value, SizeOf(value));
设置一下option,就能正常访问证书有问题的站点了
山东蓝鸟贵薪 2013-07-26
  • 打赏
  • 举报
回复
感谢分享,努力学习中
加载更多回复(21)

1,594

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧