【问题标题】:Keep HTTP- Connection in pascal?以帕斯卡保持 HTTP 连接?
【发布时间】:2015-09-26 05:50:11
【问题描述】:

我想让一个程序自动访问这个网站http://ringzer0team.com/ 我需要的一切(用户,通行证,csfr)我有,但是如何保持HTTP - 连接在帕斯卡?我使用http://posttestserver.com/ 来测试帖子的方法。 这是我的代码。当我检查 login.html 文件时。它说 HTTP_CONNECTION = close 所以我想知道如何保持它。

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs,StdCtrls, httpsend,synacode; 



procedure TForm1.Button2Click(Sender: TObject);
  var
    URL: string;
    Params: string;
    Response: TMemoryStream;
    i:longint;
    S:ansistring;
    cs:string;
  begin
    httpClient:= THTTPSend.Create;
    if httpClient.HTTPMethod('GET', 'http://ringzer0team.com/login') then
    httpClient.Document.SaveToFile('1.txt');
    httpClient.Free;
    system.assign(fi,'1.txt');
    reset(fi);
    for i:=1 to 62 do readln(fi,S);
    cs:=copy(S,21,32);
    system.close(fi);
    Response := TMemoryStream.Create;
    try
        URL := 'http://posttestserver.com/post.php?dump&html';
        Params := 'username=' + EncodeURLElement('user') + '&' + 'password=' + EncodeURLElement('pass') + '&' + 'csrf=' + EncodeURLElement(cs);
        system.assign(fi,'text');
        if HttpPostURL(URL, Params, Response) then Response.SaveToFile('login.html');
    finally
    Response.Free;
    end;
   end;

【问题讨论】:

    标签: freepascal lazarus httpconnection synapse


    【解决方案1】:

    我可以建议您使用更简单的方法。看: 首先,复制我的“解析器”函数:http://pastebin.com/u7C2xM67

    其次,您不必将服务器答案作为文件保存到您的电脑,因为可以这样做: 从http://pastebin.com/dxHLYERq 复制我的函数“GetHTTPStr”并将其用作

    someStringVariable := GetHttpStr(httpClient)
    

    使用“解析器”函数,您也可以获得 csrf-token。就像

    //我使用“res”变量作为“response”字符串,只需将res:string变量设置为res:=GetHttpStr(httpClient)

    cs := parser(res, "var _", ";");
    

    //现在 cs 看起来像 6a5b8e94 = 'token_here' 并从自己那里获取令牌

    cs := parser(cs, #39, #39); //#39 is a code of symbol '
    

    所以我们从 ' 到 ' 解析并获取我们需要的令牌

    要将数据发布到服务器,您可以使用 httpClient.HTTPMethod 函数。 首先,您需要将您的帖子数据放入请求正文中,您可以使用

    var params:string; //your post data, it must have view like param1=value1&param2=value2 
    httpClient.Document.Write(Pointer(params)^, Length(params)); //it adds your data into request body
    

    现在您可以使用 httpClient.HTTPMethod('POST','ringzer.com/login'); 发送您的请求

    不要忘记在每次发送 POST 请求时更改请求 content-type 标头。可以通过httpClient.mimeType := 'application/x-www-form-urlencoded'; 完成 如果你做了 POST-request 并且想在将来使用 httpsend-object 来做 get-request,你应该把它改回text/html

    回答您的问题,如果您想发出非关闭请求,您可以向 httpsend-object 添加标头:

    httpClient.Headers.Add('Connection: keep-alive'); //Headers has a tstringlist type
    

    不要忘记在每次请求后使用httpClient.clear;清除httpsend-object

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多