请问如何用Socket API post网页并获得返回串? 就像用idHttp的post一样。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 调用GetURLContent就可以了。function FormatHead(Method, SvrIP: string; strURL: string; SvrPort: integer): string;begin Result:= Method + ' /'+ strURL +' HTTP/1.1'#13#10; //Get Head Result:= Result + 'Referer: http://' + SvrIP; if SvrPort <> 80 then Result:= Result + ':' + IntToStr(SvrPort); Result:= Result + '/' + strURL + #13#10; Result:= Result + 'User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0; MyIE 3.01)'#13#10; Result:= Result + 'Host: ' + SvrIP; if SvrPort <> 80 then Result:= Result + ':' + IntToStr(SvrPort); Result:= Result + ''#13#10; Result:= Result + 'Connection: Close'#13#10; Result:= Result + 'Cache-Control: no-cache'#13#10; Result:= Result + #13#10;end;function GetURLContent(SvrIP: string; SvrPort: integer; strURL: string): string;var m_wsData: TWSAData; m_Host: PHostEnt; m_addr: sockaddr_in; m_Buf : array[0..1023] of char; m_iLen: integer; m_strTmp: string; FSocket: TSocket;begin Result:= ''; WSAStartUp(MAKEWORD(2, 2), m_wsData); FSocket:= Socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); m_Host:= GetHostByName(PChar(SvrIP)); if m_Host = nil then exit; FillChar(m_addr, SizeOf(m_addr), 0); m_addr.sin_family:= AF_INET; m_addr.sin_Port := htons(SvrPort); m_addr.sin_addr.S_addr:= PDWORD(PDWORD(m_Host.h_addr)^)^; Connect(FSocket, m_addr, SizeOf(m_addr)); m_strTmp:= FormatHead('POST', SvrIP, strURL, SvrPort); //Send data to server Send(FSocket, PChar(m_strTmp)^, Length(m_strTmp), 0); while true do begin m_iLen:= Recv(FSocket, m_Buf, SizeOf(m_Buf), 0); if (m_iLen < 1) then break; SetString(m_strTmp, m_Buf, m_iLen); Result:= Result + m_strTmp; end; CloseSocket(FSocket); WSACleanUp;end; 十分感谢如果是要post http://www.abc.com/test/getusers.jsp userid=navy&password=123456GetURLContent的参数该如何填写呢? var sResult : string;begin sResult := FormatHead('POST', 'www.abc.com', 'http://www.abc.com/test/getusers.jsp?userid=navy&password=123456', 80);end; GetURLContent('www.abc.com', 80, 'test/getusers.jsp?userid=navy&password=123456'); var sResult : string; begin sResult := FormatHead('POST', 'www.abc.com', 'http://www.abc.com/test/getusers.jsp?userid=navy&password=123456', 80); end; 试过了,不行,主函数是GetURLContent吧 HTTP头域增加:Format('Content-Length: %d'#13#10, [Length('userid=navy&password=123456')])然后在HTTP头后面直接添加内容'userid=navy&password=123456'另外,1楼的代码当中,HTTP头缺少Accept域。 如果你的要求就只是要源代码的话,建议你到http://prj.csdn.net 这个不行吗?var sContent: String;begin sContent:= GetURLContent('www.abc.com', 80, 'test/getusers.jsp?userid=navy&password=123456'); //...end;我就用这个下载文件的。不是所有的域都是必须的,可以省略一些。 把 post 改成 get 就ok了相信也能下载文件 不过如果文件大于1024 就要再改一下吧 寻求一种方法,使Dephi可以无须安装就调用Matlab进行绘图(答对加分) 请问,什么地方有InfoPower for BDS2006下载? Socket技术交流 TTable中,当TableName里含有空格时,怎么办?????? 一个Project中的Form有限制吗? 有关异常处理的问题! 控制DBGrid,挑战高手! 备份 讨论一下开发管理系统用哪种数据库?大家说点理由(分不够可加) combobox有没有只能选,不能编辑的只读属性啊? excel导入到sql server 数据如何筛选判断啊 如何实现组合查询功能
SvrPort: integer): string;
begin
Result:= Method + ' /'+ strURL +' HTTP/1.1'#13#10; //Get Head
Result:= Result + 'Referer: http://' + SvrIP; if SvrPort <> 80 then
Result:= Result + ':' + IntToStr(SvrPort); Result:= Result + '/' + strURL + #13#10;
Result:= Result + 'User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0; MyIE 3.01)'#13#10;
Result:= Result + 'Host: ' + SvrIP; if SvrPort <> 80 then
Result:= Result + ':' + IntToStr(SvrPort); Result:= Result + ''#13#10;
Result:= Result + 'Connection: Close'#13#10;
Result:= Result + 'Cache-Control: no-cache'#13#10; Result:= Result + #13#10;
end;function GetURLContent(SvrIP: string; SvrPort: integer; strURL: string): string;
var
m_wsData: TWSAData;
m_Host: PHostEnt;
m_addr: sockaddr_in;
m_Buf : array[0..1023] of char;
m_iLen: integer;
m_strTmp: string;
FSocket: TSocket;
begin
Result:= ''; WSAStartUp(MAKEWORD(2, 2), m_wsData); FSocket:= Socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
m_Host:= GetHostByName(PChar(SvrIP)); if m_Host = nil then
exit; FillChar(m_addr, SizeOf(m_addr), 0);
m_addr.sin_family:= AF_INET;
m_addr.sin_Port := htons(SvrPort);
m_addr.sin_addr.S_addr:= PDWORD(PDWORD(m_Host.h_addr)^)^; Connect(FSocket, m_addr, SizeOf(m_addr)); m_strTmp:= FormatHead('POST', SvrIP, strURL, SvrPort);
//Send data to server
Send(FSocket, PChar(m_strTmp)^, Length(m_strTmp), 0); while true do
begin
m_iLen:= Recv(FSocket, m_Buf, SizeOf(m_Buf), 0); if (m_iLen < 1) then break; SetString(m_strTmp, m_Buf, m_iLen);
Result:= Result + m_strTmp;
end; CloseSocket(FSocket);
WSACleanUp;
end;
userid=navy&password=123456GetURLContent的参数该如何填写呢?
sResult : string;
begin
sResult := FormatHead('POST', 'www.abc.com', 'http://www.abc.com/test/getusers.jsp?userid=navy&password=123456', 80);
end;
sResult : string;
begin
sResult := FormatHead('POST', 'www.abc.com', 'http://www.abc.com/test/getusers.jsp?userid=navy&password=123456', 80);
end; 试过了,不行,主函数是GetURLContent吧
Format('Content-Length: %d'#13#10, [Length('userid=navy&password=123456')])然后在HTTP头后面直接添加内容'userid=navy&password=123456'另外,1楼的代码当中,HTTP头缺少Accept域。
var
sContent: String;
begin
sContent:= GetURLContent('www.abc.com', 80, 'test/getusers.jsp?userid=navy&password=123456');
//...
end;我就用这个下载文件的。不是所有的域都是必须的,可以省略一些。
相信也能下载文件 不过如果文件大于1024 就要再改一下吧