Sample code for 30+ languages & platforms
Pascal (Lazarus/Delphi)

HTTP GET -- Read Response from Stream

See more REST Examples

Demonstrates how to send an HTTP GET for a web page, and then read the response from a Stream. The purpose is to fulfill a situation such as the following: "I have a URL and just want the <head> </head> portion of the HTML. This would avoid having to download a potentially enormous web page just to get at header information, such as the <styles>."

Chilkat Pascal (Lazarus/Delphi) Downloads

Pascal (Lazarus/Delphi)
program ChilkatDemo;

// Demonstrates using the Chilkat Pascal wrapper via the C bridge DLL.
// Builds as a console application under Lazarus (FPC) or Delphi.

{$IFDEF FPC}
  {$MODE DELPHI}
{$ENDIF}
{$APPTYPE CONSOLE}

uses
  {$IFDEF UNIX}
  cthreads,
  {$ENDIF}
  SysUtils,
  CkDllLoader,
  Chilkat.Task,
  Chilkat.Rest,
  Chilkat.StringBuilder,
  Chilkat.Url,
  Chilkat.Stream;

// ---------------------------------------------------------------------------

procedure RunDemo;
var
  success: Boolean;
  rest: TRest;
  url: TUrl;
  bAutoReconnect: Boolean;
  responseStatusCode: Integer;
  errResponse: string;
  bodyStream: TStream;
  readResponseBodyTask: TTask;
  sbBody: TStringBuilder;
  exitLoop: Boolean;
  bodyText: string;
  maxWaitMs: Integer;

begin
  success := False;

  //  This example requires the Chilkat API to have been previously unlocked.
  //  See Global Unlock Sample for sample code.

  rest := TRest.Create;

  //  In this example, we'll get the web page at http://www.nytimes.com/pages/business/index.html
  //  The domain is "www.nytimes.com", and the path is "/pages/business/index.html"

  //  If we have only the full URL to begin with, it can be loaded into the Chilkat URL object to
  //  access the parts:
  url := TUrl.Create;
  url.ParseUrl('http://www.nytimes.com/pages/business/index.html');

  bAutoReconnect := True;
  success := rest.Connect(url.Host,url.Port,url.Ssl,bAutoReconnect);

  //  Send the GET request (This sends the GET request, but does not read the response.)
  success := rest.SendReqNoBody('GET',url.Path);
  if (success <> True) then
    begin
      WriteLn(rest.LastErrorText);
      Exit;
    end;

  //  Read the response header.
  responseStatusCode := rest.ReadResponseHeader();
  if (responseStatusCode < 0) then
    begin
      WriteLn(rest.LastErrorText);
      Exit;
    end;

  WriteLn('Response status code = ' + responseStatusCode);

  //  We expect a 200 response status.
  if (responseStatusCode <> 200) then
    begin

      //  If the response status code is not 200, we could check for a redirect status code and 
      //  then follow it, read the entire response (as shown here), or just call rest.Disconnect
      errResponse := rest.ReadRespBodyString();
      if (rest.LastMethodSuccess <> True) then
        begin
          WriteLn(rest.LastErrorText);
        end
      else
        begin
          WriteLn(errResponse);
        end;

      Exit;
    end;

  bodyStream := TStream.Create;
  //  Set a 10 second read timeout for the stream. 
  //  (Give up if no data arrives within 10 seconds after calling a read method.)
  bodyStream.ReadTimeoutMs := 10000;

  //  Create a background thread task to read the response body (which feeds
  //  it to the bodyStream object.)
  readResponseBodyTask := rest.ReadRespBodyStreamAsync(bodyStream,True);

  //  Start the task. 
  success := readResponseBodyTask.Run();

  //  Read the HTTP response body until the "</head>" is seen, or until
  //  the end-of-stream is reached.

  sbBody := TStringBuilder.Create;
  exitLoop := False;
  while not exitLoop and (bodyStream.EndOfStream <> True) do
    begin

      bodyText := bodyStream.ReadString();
      if (bodyStream.LastMethodSuccess = True) then
        begin
          sbBody.Append(bodyText);
          if (sbBody.Contains('</head>',False)) then
            begin
              exitLoop := True;
            end;
        end
      else
        begin
          exitLoop := True;
        end;

    end;

  //  Cancel the remainder of the task...
  readResponseBodyTask.Cancel();

  readResponseBodyTask.Free;

  //  Ensure we're disconnected from the server.
  maxWaitMs := 50;
  rest.Disconnect(maxWaitMs);

  WriteLn('----');
  WriteLn(sbBody.GetAsString());
  WriteLn('----');
  WriteLn('Successfully received the body up to the desired point.');


  rest.Free;
  url.Free;
  bodyStream.Free;
  sbBody.Free;

end;

// ---------------------------------------------------------------------------

begin

  try
    RunDemo;
  except
    on E: Exception do
      WriteLn('Unhandled exception: ', E.ClassName, ': ', E.Message);
  end;

  WriteLn;
  {$IFDEF MSWINDOWS}
  WriteLn('Press Enter to exit...');
  ReadLn;
  {$ENDIF}
end.