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

ETrade Renew Access Token

See more ETrade Examples

Renews an ETrade OAuth access token.

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.Hashtable,
  Chilkat.FileAccess,
  Chilkat.HttpResponse,
  Chilkat.StringBuilder,
  Chilkat.JsonObject,
  Chilkat.Http;

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

procedure RunDemo;
var
  success: Boolean;
  http: THttp;
  jsonToken: TJsonObject;
  resp: THttpResponse;
  sbRespBody: TStringBuilder;
  hashTab: THashtable;
  accessToken: string;
  accessTokenSecret: string;
  json: TJsonObject;
  fac: TFileAccess;

begin
  success := False;

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

  http := THttp.Create;

  http.OAuth1 := True;
  http.OAuthVerifier := '';
  http.OAuthConsumerKey := 'ETRADE_CONSUMER_KEY';
  http.OAuthConsumerSecret := 'ETRADE_CONSUMER_SECRET';

  //  Load the access token previously obtained via the OAuth1 Authorization
  jsonToken := TJsonObject.Create;
  success := jsonToken.LoadFile('qa_data/tokens/etrade.json');
  if (success <> True) then
    begin
      WriteLn('Failed to load OAuth1 token');
      Exit;
    end;

  http.OAuthToken := jsonToken.StringOf('oauth_token');
  http.OAuthTokenSecret := jsonToken.StringOf('oauth_token_secret');

  resp := THttpResponse.Create;
  success := http.HttpNoBody('GET','https://api.etrade.com/oauth/renew_access_token',resp);
  if (success = False) then
    begin
      WriteLn(http.LastErrorText);
      Exit;
    end;

  //  Make sure a successful response was received.
  if (resp.StatusCode <> 200) then
    begin
      WriteLn(resp.StatusLine);
      WriteLn(resp.Header);
      WriteLn(resp.BodyStr);
      Exit;
    end;

  //  If successful, the resp.BodyStr contains something like this:
  //  oauth_token=%3TiQRgQCRGPo7Xdk6G8QDSEzX0Jsy6sKNcULcDavAGgU%3D&oauth_token_secret=%7RrC9scEpzcwSEMy4vE7nodSzPLqfRINnTNY4voczyFM%3D
  WriteLn(resp.BodyStr);

  sbRespBody := TStringBuilder.Create;
  resp.GetBodySb(sbRespBody);
  if (sbRespBody.ContentsEqual('Access Token has been renewed',False)) then
    begin
      //  The documentation at https://apisb.etrade.com/docs/api/authorization/renew_access_token.html
      //  indicates that the response should be as described above.  However, the response received when
      //  trying to refresh a non-expired token was "Access Token has been renewed"
      WriteLn('Keeping the same access token, but it''s renewed...');
      Exit;
    end;

  hashTab := THashtable.Create;
  hashTab.AddQueryParams(resp.BodyStr);

  accessToken := hashTab.LookupStr('oauth_token');
  accessTokenSecret := hashTab.LookupStr('oauth_token_secret');

  //  The access token + secret is what should be saved and used for
  //  subsequent REST API calls.
  WriteLn('Access Token = ' + accessToken);
  WriteLn('Access Token Secret = ' + accessTokenSecret);

  //  Save this access token for future calls.
  //  Just in case we need user_id and screen_name, save those also..
  json := TJsonObject.Create;
  json.AppendString('oauth_token',accessToken);
  json.AppendString('oauth_token_secret',accessTokenSecret);

  fac := TFileAccess.Create;
  fac.WriteEntireTextFile('qa_data/tokens/etrade.json',json.Emit(),'utf-8',False);

  WriteLn('Success.');


  http.Free;
  jsonToken.Free;
  resp.Free;
  sbRespBody.Free;
  hashTab.Free;
  json.Free;
  fac.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.