{"id":1787,"date":"2026-07-17T18:00:44","date_gmt":"2026-07-17T21:00:44","guid":{"rendered":"https:\/\/code4delphi.com.br\/blog\/?p=1787"},"modified":"2026-07-17T18:00:45","modified_gmt":"2026-07-17T21:00:45","slug":"api-rest-com-delphi-e-tms-xdata-primeiros-passos","status":"publish","type":"post","link":"https:\/\/code4delphi.com.br\/blog\/api-rest-com-delphi-e-tms-xdata-primeiros-passos\/","title":{"rendered":"API REST com Delphi e TMS XData: primeiros passos"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">O TMS XData \u00e9 um framework para Delphi que permite criar servidores HTTP\/HTTPS e disponibilizar dados por meio de APIs REST utilizando o formato JSON. Com ele, podemos desenvolver aplica\u00e7\u00f5es multicamadas, criar endpoints personalizados e centralizar regras de neg\u00f3cio de forma simples e organizada. Saiba mais no <a href=\"https:\/\/www.tmssoftware.com\/site\/xdata.asp?utm_source=chatgpt.com\">site oficial do TMS XData<\/a>.<\/p>\n\n\n\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_81 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title ez-toc-toggle\" style=\"cursor:pointer\">Sum\u00e1rio<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Alternar tabela de conte\u00fado\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 eztoc-toggle-hide-by-default' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/code4delphi.com.br\/blog\/api-rest-com-delphi-e-tms-xdata-primeiros-passos\/#Criando_a_aplicacao\" >Criando a aplica\u00e7\u00e3o<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/code4delphi.com.br\/blog\/api-rest-com-delphi-e-tms-xdata-primeiros-passos\/#Acessando_a_API\" >Acessando a API<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/code4delphi.com.br\/blog\/api-rest-com-delphi-e-tms-xdata-primeiros-passos\/#Criando_uma_Service\" >Criando uma Service<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/code4delphi.com.br\/blog\/api-rest-com-delphi-e-tms-xdata-primeiros-passos\/#Criando_o_endpoint\" >Criando o endpoint<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/code4delphi.com.br\/blog\/api-rest-com-delphi-e-tms-xdata-primeiros-passos\/#Implementando_a_Service\" >Implementando a Service<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/code4delphi.com.br\/blog\/api-rest-com-delphi-e-tms-xdata-primeiros-passos\/#Testando_o_endpoint\" >Testando o endpoint<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/code4delphi.com.br\/blog\/api-rest-com-delphi-e-tms-xdata-primeiros-passos\/#Links_uteis\" >Links \u00fateis<\/a><\/li><\/ul><\/nav><\/div>\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Criando_a_aplicacao\"><\/span>Criando a aplica\u00e7\u00e3o<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Neste exemplo, vamos mostrar uma maneira simples de iniciar com o XData e criar nossa primeira API REST com Delphi.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para isso, utilizaremos apenas quatro componentes:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>TXDataServer<\/strong><\/li>\n\n\n\n<li><strong>TSparkleHttpSysDispatcher<\/strong><\/li>\n\n\n\n<li>Dois componentes <strong>TButton<\/strong>, utilizados para iniciar e parar o servidor<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"388\" height=\"295\" src=\"https:\/\/code4delphi.com.br\/blog\/wp-content\/uploads\/2026\/07\/Componentes-1.png\" alt=\"\" class=\"wp-image-1793\" srcset=\"https:\/\/code4delphi.com.br\/blog\/wp-content\/uploads\/2026\/07\/Componentes-1.png 388w, https:\/\/code4delphi.com.br\/blog\/wp-content\/uploads\/2026\/07\/Componentes-1-300x228.png 300w\" sizes=\"auto, (max-width: 388px) 100vw, 388px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Com essa estrutura, j\u00e1 temos uma API pronta para ser executada. Basta iniciar a aplica\u00e7\u00e3o e clicar no bot\u00e3o <strong>Start<\/strong>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Acessando_a_API\"><\/span>Acessando a API<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Para descobrir o endere\u00e7o da API, selecione o componente <code><strong>XDataServer1 <\/strong><\/code>e verifique sua propriedade <strong>BaseUrl<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Neste exemplo, utilizaremos o seguinte endere\u00e7o:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#f6f6f4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>http:\/\/localhost:8000\/tms\/xdata<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki dracula-soft\" style=\"background-color: #282A36\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F6F6F4\">http:<\/span><span style=\"color: #7B7F8B\">\/\/localhost:8000\/tms\/xdata<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"361\" height=\"600\" src=\"https:\/\/code4delphi.com.br\/blog\/wp-content\/uploads\/2026\/07\/Pegar-URL.png\" alt=\"\" class=\"wp-image-1795\" srcset=\"https:\/\/code4delphi.com.br\/blog\/wp-content\/uploads\/2026\/07\/Pegar-URL.png 361w, https:\/\/code4delphi.com.br\/blog\/wp-content\/uploads\/2026\/07\/Pegar-URL-181x300.png 181w\" sizes=\"auto, (max-width: 361px) 100vw, 361px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Copie esse endere\u00e7o, abra o navegador e acesse a URL. O resultado ser\u00e1 uma resposta JSON, indicando que nossa API j\u00e1 est\u00e1 em execu\u00e7\u00e3o:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"362\" height=\"179\" src=\"https:\/\/code4delphi.com.br\/blog\/wp-content\/uploads\/2026\/07\/Resposta-api-inicio.png\" alt=\"\" class=\"wp-image-1796\" srcset=\"https:\/\/code4delphi.com.br\/blog\/wp-content\/uploads\/2026\/07\/Resposta-api-inicio.png 362w, https:\/\/code4delphi.com.br\/blog\/wp-content\/uploads\/2026\/07\/Resposta-api-inicio-300x148.png 300w\" sizes=\"auto, (max-width: 362px) 100vw, 362px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Criando_uma_Service\"><\/span>Criando uma Service<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">O pr\u00f3ximo passo \u00e9 criar uma <strong>Service<\/strong>, onde ficar\u00e3o dispon\u00edveis os endpoints e as regras de neg\u00f3cio da nossa API. O XData possui um Wizard que facilita esse processo. No Delphi, acesse:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#f6f6f4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>File > New > Other...<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki dracula-soft\" style=\"background-color: #282A36\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F286C4\">File<\/span><span style=\"color: #F6F6F4\"> &gt; <\/span><span style=\"color: #F286C4\">New<\/span><span style=\"color: #F6F6F4\"> &gt; Other...<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"499\" height=\"478\" src=\"https:\/\/code4delphi.com.br\/blog\/wp-content\/uploads\/2026\/07\/File-New-Other.png\" alt=\"\" class=\"wp-image-1797\" srcset=\"https:\/\/code4delphi.com.br\/blog\/wp-content\/uploads\/2026\/07\/File-New-Other.png 499w, https:\/\/code4delphi.com.br\/blog\/wp-content\/uploads\/2026\/07\/File-New-Other-300x287.png 300w\" sizes=\"auto, (max-width: 499px) 100vw, 499px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Na tela seguinte, selecione:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#f6f6f4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>TMS XData > TMS XData Service<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki dracula-soft\" style=\"background-color: #282A36\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F6F6F4\">TMS XData &gt; TMS XData Service<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"786\" height=\"521\" src=\"https:\/\/code4delphi.com.br\/blog\/wp-content\/uploads\/2026\/07\/image-8.png\" alt=\"\" class=\"wp-image-1798\" srcset=\"https:\/\/code4delphi.com.br\/blog\/wp-content\/uploads\/2026\/07\/image-8.png 786w, https:\/\/code4delphi.com.br\/blog\/wp-content\/uploads\/2026\/07\/image-8-300x199.png 300w, https:\/\/code4delphi.com.br\/blog\/wp-content\/uploads\/2026\/07\/image-8-768x509.png 768w\" sizes=\"auto, (max-width: 786px) 100vw, 786px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Informe o nome da Service. Para este exemplo, utilizaremos o nome <strong>Clientes<\/strong>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"559\" height=\"443\" src=\"https:\/\/code4delphi.com.br\/blog\/wp-content\/uploads\/2026\/07\/image-11.png\" alt=\"\" class=\"wp-image-1802\" srcset=\"https:\/\/code4delphi.com.br\/blog\/wp-content\/uploads\/2026\/07\/image-11.png 559w, https:\/\/code4delphi.com.br\/blog\/wp-content\/uploads\/2026\/07\/image-11-300x238.png 300w\" sizes=\"auto, (max-width: 559px) 100vw, 559px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Ao finalizar o Wizard, dois novos arquivos ser\u00e3o adicionados ao projeto:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#f6f6f4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>ClientesService.pas\nClientesServiceImplementation.pas<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki dracula-soft\" style=\"background-color: #282A36\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F6F6F4\">ClientesService.pas<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">ClientesServiceImplementation.pas<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"277\" height=\"170\" src=\"https:\/\/code4delphi.com.br\/blog\/wp-content\/uploads\/2026\/07\/image-12.png\" alt=\"\" class=\"wp-image-1805\"\/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Criando_o_endpoint\"><\/span>Criando o endpoint<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A unit <strong>ClientesService <\/strong>possui a interface utilizada pela nossa Service. Nela, vamos criar o m\u00e9todo <strong>GetNome<\/strong>, que receber\u00e1 o c\u00f3digo de um cliente e retornar\u00e1 seu nome.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#f6f6f4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>unit ClientesService;\n\ninterface\n\nuses\n  XData.Service.Common;\n\ntype\n  &#91;ServiceContract&#93;\n  IClientesService = interface(IInvokable)\n    &#91;'{66A6C40C-C18C-4261-8D25-32EACD91102C}'&#93;\n    &#91;HttpGet&#93;\n    function GetNome(Id: Integer): string;\n  end;\n\nimplementation\n\ninitialization\n  RegisterServiceType(TypeInfo(IClientesService));\n\nend.<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki dracula-soft\" style=\"background-color: #282A36\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F286C4\">unit<\/span><span style=\"color: #F6F6F4\"> ClientesService;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">interface<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">uses<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">  XData.Service.Common;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">type<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">  &#91;ServiceContract&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">  IClientesService = <\/span><span style=\"color: #F286C4\">interface<\/span><span style=\"color: #F6F6F4\">(IInvokable)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    &#91;<\/span><span style=\"color: #DEE492\">&#39;<\/span><span style=\"color: #E7EE98\">{66A6C40C-C18C-4261-8D25-32EACD91102C}<\/span><span style=\"color: #DEE492\">&#39;<\/span><span style=\"color: #F6F6F4\">&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    &#91;HttpGet&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #F286C4\">function<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">GetNome<\/span><span style=\"color: #F6F6F4\">(Id: <\/span><span style=\"color: #F286C4\">Integer<\/span><span style=\"color: #F6F6F4\">): <\/span><span style=\"color: #F286C4\">string<\/span><span style=\"color: #F6F6F4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">  <\/span><span style=\"color: #F286C4\">end<\/span><span style=\"color: #F6F6F4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">implementation<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">initialization<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">  RegisterServiceType(TypeInfo(IClientesService));<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">end<\/span><span style=\"color: #F6F6F4\">.<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">O atributo <strong>[ServiceContract]<\/strong> identifica a interface como um contrato de servi\u00e7o. J\u00e1 o atributo <strong>[HttpGet]<\/strong> determina que o m\u00e9todo ser\u00e1 disponibilizado por meio de uma requisi\u00e7\u00e3o HTTP do tipo <strong>GET<\/strong>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Implementando_a_Service\"><\/span>Implementando a Service<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A unit <strong>ClientesServiceImplementation <\/strong>\u00e9 respons\u00e1vel pela implementa\u00e7\u00e3o da interface. \u00c9 nessa classe que podemos receber os par\u00e2metros, aplicar nossas regras de neg\u00f3cio, acessar o banco de dados e gerar a resposta da API.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#f6f6f4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>unit ClientesServiceImplementation;\n\ninterface\n\nuses\n  System.SysUtils,\n  XData.Server.Module,\n  XData.Service.Common,\n  ClientesService;\n\ntype\n  &#91;ServiceImplementation&#93;\n  TClientesService = class(TInterfacedObject, IClientesService)\n  private\n    &#91;HttpGet&#93;\n    function GetNome(Id: Integer): string;\n  end;\n\nimplementation\n\nfunction TClientesService.GetNome(Id: Integer): string;\nbegin\n  Result := 'Cliente teste com Id: ' + Id.ToString;\nend;\n\ninitialization\n  RegisterServiceType(TClientesService);\n\nend.<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki dracula-soft\" style=\"background-color: #282A36\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F286C4\">unit<\/span><span style=\"color: #F6F6F4\"> ClientesServiceImplementation;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">interface<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">uses<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">  System.SysUtils,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">  XData.Server.<\/span><span style=\"color: #F286C4\">Module<\/span><span style=\"color: #F6F6F4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">  XData.Service.Common,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">  ClientesService;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">type<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">  &#91;ServiceImplementation&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">  TClientesService = <\/span><span style=\"color: #F286C4\">class<\/span><span style=\"color: #F6F6F4\">(TInterfacedObject, IClientesService)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">  <\/span><span style=\"color: #F286C4\">private<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    &#91;HttpGet&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">    <\/span><span style=\"color: #F286C4\">function<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">GetNome<\/span><span style=\"color: #F6F6F4\">(Id: <\/span><span style=\"color: #F286C4\">Integer<\/span><span style=\"color: #F6F6F4\">): <\/span><span style=\"color: #F286C4\">string<\/span><span style=\"color: #F6F6F4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">  <\/span><span style=\"color: #F286C4\">end<\/span><span style=\"color: #F6F6F4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">implementation<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">function<\/span><span style=\"color: #F6F6F4\"> <\/span><span style=\"color: #62E884\">TClientesService.GetNome<\/span><span style=\"color: #F6F6F4\">(Id: <\/span><span style=\"color: #F286C4\">Integer<\/span><span style=\"color: #F6F6F4\">): <\/span><span style=\"color: #F286C4\">string<\/span><span style=\"color: #F6F6F4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">begin<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">  <\/span><span style=\"color: #F286C4\">Result<\/span><span style=\"color: #F6F6F4\"> := <\/span><span style=\"color: #DEE492\">&#39;<\/span><span style=\"color: #E7EE98\">Cliente teste com Id: <\/span><span style=\"color: #DEE492\">&#39;<\/span><span style=\"color: #F6F6F4\"> + Id.ToString;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">end<\/span><span style=\"color: #F6F6F4\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">initialization<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F6F6F4\">  RegisterServiceType(TClientesService);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F286C4\">end<\/span><span style=\"color: #F6F6F4\">.<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Neste exemplo, o m\u00e9todo <strong>GetNome <\/strong>retorna apenas uma string com o c\u00f3digo recebido. Em uma aplica\u00e7\u00e3o real, poder\u00edamos utilizar o par\u00e2metro para consultar um cliente no banco de dados e retornar suas informa\u00e7\u00f5es.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Testando_o_endpoint\"><\/span>Testando o endpoint<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Para testar, execute a aplica\u00e7\u00e3o e clique no bot\u00e3o <strong>Start<\/strong>. Depois, acesse no navegador o endpoint <strong>ClientesService\/GetNome<\/strong>, informando o par\u00e2metro <strong>Id<\/strong>:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#f6f6f4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#f6f6f4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>http:\/\/localhost:8000\/tms\/xdata\/ClientesService\/GetNome?Id=10<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M4.5 12.75l6 6 9-13.5\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6\"><\/path><\/svg><\/span><pre class=\"shiki dracula-soft\" style=\"background-color: #282A36\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F6F6F4\">http:<\/span><span style=\"color: #7B7F8B\">\/\/localhost:8000\/tms\/xdata\/ClientesService\/GetNome?Id=10<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">A API retornar\u00e1 o seguinte JSON:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"573\" height=\"145\" src=\"https:\/\/code4delphi.com.br\/blog\/wp-content\/uploads\/2026\/07\/Resulta-final.png\" alt=\"\" class=\"wp-image-1813\" srcset=\"https:\/\/code4delphi.com.br\/blog\/wp-content\/uploads\/2026\/07\/Resulta-final.png 573w, https:\/\/code4delphi.com.br\/blog\/wp-content\/uploads\/2026\/07\/Resulta-final-300x76.png 300w\" sizes=\"auto, (max-width: 573px) 100vw, 573px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Com poucos componentes e duas units, j\u00e1 criamos uma API REST funcional com Delphi e TMS XData. A partir dessa estrutura, podemos adicionar novos endpoints, integrar bancos de dados e implementar as regras de neg\u00f3cio necess\u00e1rias para nossas aplica\u00e7\u00f5es.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Links_uteis\"><\/span>Links \u00fateis<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/github.com\/Code4Delphi\/XData-Basic\" target=\"_blank\" rel=\"noreferrer noopener\">C\u00f3digo-fonte completo do exemplo<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/www.tmssoftware.com\/site\/xdata.asp?utm_source=chatgpt.com\" target=\"_blank\" rel=\"noreferrer noopener\">Site oficial e download do TMS XData<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/doc.tmssoftware.com\/biz\/xdata\/guide\/index.html?utm_source=chatgpt.com\" target=\"_blank\" rel=\"noreferrer noopener\">Documenta\u00e7\u00e3o oficial<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/www.youtube.com\/watch?v=cwb6_SKbB6A&amp;list=PLLHSz4dOnnN2Xlf7OX47cF20gbmz9-9z0\" target=\"_blank\" rel=\"noreferrer noopener\">V\u00eddeo de instala\u00e7\u00e3o e primeiros passos com XData<\/a> <\/li>\n\n\n\n<li><a href=\"https:\/\/www.youtube.com\/playlist?list=PLLHSz4dOnnN39OimL44gj6CthKx54MNlY\" target=\"_blank\" rel=\"noreferrer noopener\">Curso de Delphi Web com XData<\/a><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>O TMS XData \u00e9 um framework para Delphi que permite criar servidores HTTP\/HTTPS e disponibilizar dados&#46;&#46;&#46;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_exactmetrics_skip_tracking":false,"footnotes":""},"categories":[1,98],"tags":[168,167,101],"class_list":["post-1787","post","type-post","status-publish","format-standard","hentry","category-geral","category-tms","tag-api-rest-deslphi","tag-delphi-api","tag-xdata"],"_links":{"self":[{"href":"https:\/\/code4delphi.com.br\/blog\/wp-json\/wp\/v2\/posts\/1787","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/code4delphi.com.br\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/code4delphi.com.br\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/code4delphi.com.br\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/code4delphi.com.br\/blog\/wp-json\/wp\/v2\/comments?post=1787"}],"version-history":[{"count":18,"href":"https:\/\/code4delphi.com.br\/blog\/wp-json\/wp\/v2\/posts\/1787\/revisions"}],"predecessor-version":[{"id":1816,"href":"https:\/\/code4delphi.com.br\/blog\/wp-json\/wp\/v2\/posts\/1787\/revisions\/1816"}],"wp:attachment":[{"href":"https:\/\/code4delphi.com.br\/blog\/wp-json\/wp\/v2\/media?parent=1787"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/code4delphi.com.br\/blog\/wp-json\/wp\/v2\/categories?post=1787"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/code4delphi.com.br\/blog\/wp-json\/wp\/v2\/tags?post=1787"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}