プロジェクト

全般

プロフィール

redmine.org の Rest_api_with_delphi の日本語訳です。

Delphi での REST API の使用法

ここでは Delphi で Redmine REST API をどのように使用するかを示した 2 つの簡単なプロシージャを記述しています。 この例では ICS component THttpCli を使用しています。

//チケットの作成
procedure AddIssue;
var
  xmlStream     : TMemoryStream;
  tempArray     : array[0..10000] of char;
  xmlIssue      : String;
  apiAccessKey  : String;
  HttpClient    : THttpCli;
begin
  apiAccessKey := 'a1234567abcde12121a11a123456a12a12ab123ab'; // サンプル用 API キー
  xmlStream := TMemoryStream.Create; // XML stream の作成

  // Http Client コンポーネントの作成とセット
  HttpClient := THttpCli.Create(nil);
  HttpClient.ContentTypePost := 'text/xml';
  HttpClient.URL:= 'http://localhost:3000/issues.xml?key='+apiAccessKey;
  try
    xmlIssue :=
        '<?xml version="1.0"?>' +
        '<issue>' +
        '  <project_id>1</project_id>'+
        '  <tracker_id>1</tracker_id>'+
        '  <status_id>1</status_id>'+
        '  <priority_id>1</priority_id>'+
        '  <author_id>1</author_id>'+
        '  <start_date>2011-10-09</start_date>'+
        '  <subject>Created in DELPHI</subject>'+
        '  <description>Issue created in DELPHI using Redmine REST API</description>'+
        '  <custom_fields type="array">' + // adding custom fields
        '       <custom_field id="1">'+
        '           <value>12121212</value>'+
        '       </custom_field>'+
        '       <custom_field id="2">'+
        '           <value>2010-10-09</value>'+
        '       </custom_field>'+
        '  </custom_fields>'+
        '</issue>';

    // xmlIssue を stream に書き込む 
    FillChar( temparray, SizeOf( temparray ), #0 );
    strpcopy( temparray, xmlIssue );
    xmlStream.Write( temparray, length(xmlIssue) );
    xmlStream.Seek( 0, soFromBeginning);

    // xml stream のセットとデータの送信
    HttpClient.SendStream:=xmlStream;
    try
      HttpClient.Post;
    except
      raise;
    end;
  finally
    xmlStream.Free;
    HttpClient.Free;
  end;
end;

// チケット一覧
procedure GetIssue(issueId: String);
var
  apiAccessKey: String;
  HttpClient: THttpCli;
  xmlIssue: TXMLDocument;
begin
    Memo.Lines.Clear; // 結果を表示するために TMemo を使っている
    apiAccessKey := 'a1234567abcde12121a11a123456a12a12ab123ab'; // サンプル用 API キー

    xmlIssue := TXMLDocument.Create(Self); //Creating XML document. Self = TForm

    // Http Client コンポーネントの作成とセット
    HttpClient := THttpCli.Create(nil);
    HttpClient.ContentTypePost := 'text/xml';
    HttpClient.URL:= 'http://localhost:3000/issues/'+issueId+'.xml?key='+apiAccessKey;

    HttpClient.RcvdStream := TStringStream.Create(''); // Stream の作成
    try
      try
        // チケットを取得して、 TMemo に格納されたプロパティのいくつかを表示
        HttpClient.Get;
        xmlIssue.LoadFromStream(HttpClient.RcvdStream);
        xmlIssue.Active := True;

        Memo.Lines.Add('Id = ' + xmlIssue.DocumentElement.ChildNodes['id'].NodeValue);
        Memo.Lines.Add('Project id = ' + xmlIssue.DocumentElement.ChildNodes['project'].AttributeNodes['id'].NodeValue);
        Memo.Lines.Add('Project Name = ' + xmlIssue.DocumentElement.ChildNodes['project'].AttributeNodes['name'].NodeValue);
        Memo.Lines.Add('Tracker id = ' + xmlIssue.DocumentElement.ChildNodes['tracker'].AttributeNodes['id'].NodeValue);
        Memo.Lines.Add('Tracker name = ' + xmlIssue.DocumentElement.ChildNodes['tracker'].AttributeNodes['name'].NodeValue);
      Except
        raise;
      end;
    finally
      HttpClient.Free;
      xmlIssue.Free;
    end;
end;

{{fnlist}}