感谢

解决方案 »

  1.   

    用TNMHTTP控件的Head方法,并自动将信息保存在TNMHTTP的Header属性
    <TNMHTTP>.Head(url);
    通过<TNMHTTP>.Header取到标题信息Get方法得到网页文件内容和cookie信息分别存在Body和CookieIn 属性
      

  2.   

    首先谢killme2008
    比如我想发送这个头信息访问163.com的80端口:
       delphi6的User-Agent 是Mozilla/3.0 (compatible; indy)
    我要在访问时改变这个上传的参数:
        'User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)'
    用TNMHTTP就办不到的
    我试过用winsock就访问不了80端口的东东,晕在此贴段代码出请高手指教(在VC,VB 发送报头很容易办到)//1、建立Socket
    meminfo.Clear;
    skt:=socket(AF_INET,SOCK_STREAM,0);
    if(skt=INVALID_SOCKET)Then
    begin
    memInfo.Lines.Add('Error:Create Winsock Failed');
    exit;
    end;
    //2、连接主机
    ZeroMemory(@addr,sizeof(addr));
    Addr.sin_family:=AF_INET;
    //Addr.sin_addr.S_addr :=inet_addr(edtHost.Text);
    Addr.sin_addr.S_addr:=inet_addr(Pchar(edtHost.Text));
    //开放80端口
    addr.sin_port:=htons(80);
    Re:=connect(skt,addr,sizeof(addr));
    if(Re<>0)then
    begin
    memInfo.Lines.Add('Connect to Server Failed!');
    exit;
    end;  StrSend := 'GET www.163.com HTTP/1.1' + #13+#10;
      StrSend := StrSend + 'HOST: 163.com + #13+#10;
      StrSend := StrSend + 'Accept: text/plain' + #13+#10;
      StrSend := StrSend +'Accept: application/html'+#13+#10;
      StrSend := StrSend +'Accept: text/html'+#13+#10;
      StrSend := StrSend +'Accept: image/gif'+#13+#10;
      StrSend := StrSend +'Accept: */*'+#13+#10;
      StrSend := StrSend +'Accept -Encoding: gzip'+#13+#10;
      StrSend := StrSend +'User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)'+#13+#10;
      StrSend := StrSend +'Content-type: application/x-www-form-urlencoded'+#13+#10;
      StrSend := StrSend +#13+#13;
    //3、发送信息
    GETMem(BufSend,1024);
    ZeroMemory(BufSend,1024);
    Info:=StrSend+#10;
    StrPCopy(BufSend,info);
    Re:=Send(skt,Bufsend^,Length(BufSend),0);
    if(Re=SOCKET_ERROR)then
    begin
    memInfo.Lines.Add('Send Data Failed!');
    exit;
    end;
    //5、读取主机返回信息
    GetMem(BufRev,1024);
    Repeat
    ZeroMemory(BufRev,1024);
    re:=recv(skt,BufRev^,1024,0);
    Info:=Strpas(bufRev);
    memInfo.Lines.Add(Info);
    Until re=0;
    memInfo.Lines.Add('FINISH!');
    FreeMem(BufSend);
    FreeMem(BufRev);
    //6、关闭socket连接
    closesocket(skt);
      

  3.   

    需要这么麻烦吗?
    建议你发HTTP/1.0的请求,而不是1.1的.关键的就是这么一串,其它的使用缺省值,除非有必要..'GET www.163.com HTTP/1.1'+#13#10+#13#10
    使用TClientSocket,非阻塞方式就可以了..
      

  4.   

    HTTP协议关键地方,
    1,请求头用两个回车换行结尾.即#13#10#13#10
    2,请求头用#13#10分隔为多行.从第二行开始是参数行,使用'名称-值'对的方式,
    参数名与值之间':'+空格 分隔.
    3,参数行可以扩展,加入应用程序需要的参数名和值..另一方面,很多参数值可以省略.
    ..
      

  5.   

    哦..上面写错了..
    'GET www.163.com HTTP/1.1'+#13#10+#13#10应该改成
    'GET www.163.com HTTP/1.0'+#13#10+#13#10
    HTTP1.1协议要严格些,另有几个参数是必须的.