Esta função permite consumir o método GET de uma API Rest a partir da estação de trabalho.
Importante
Sintaxe
HttpCGet( < cUrl >, [ cGetParms ], [ nTimeOut ], [ aHeadStr ], [ @cHeaderGet ] )
Parâmetros
Nome | Tipo | Descrição | Obrigatório | Referência |
|---|---|---|---|---|
cUrl | caractere | Indica o endereço HTTP com a pasta e o documento solicitado. | X | |
cGetParms | caractere | Indica uma string de parâmetros, do tipo GET, que serão enviados ao servidor HTTP através da URI. Caso não seja especificado, este parâmetro será considerado vazio (""). | ||
nTimeOut | numérico | Indica o tempo, em segundos, máximo de inatividade permitido durante a recepção do documento. Caso não seja especificado, o valor assumido será de 120 segundos. | ||
aHeadStr | vetor | Indica o array que contêm as strings que serão acrescentadas no header da requisição HTTP que será realizada. Utilizar "|" (pipes) para separação entre parâmetro e valor. | ||
cHeaderGet | caractere | Indica a string que conterá o header de resposta HTTP enviado pelo servidor requisitado. Observação: A variável deve ser declarada antes da chamada da função. | X |
Retorno
Nome | Tipo | Descrição |
|---|---|---|
cRet | caractere | Retorna a string que corresponde a requisição solicitada. |
Observações
Importante: Função disponível em versões iguais ou superiores a 7.00.111010P
- O parâmetro cGetParms representa um texto que será enviado via "Get". (Exemplo "param1=value1&m2=value2").
- Caso não seja retornado o documento antes do término do time-out, especificado na chamada da função, ou não seja possível localizar o servidor; seja por falha de resolução de DNS ou por erro de sintaxe ao especificar a URL, a função retornará nulo (NIL).
- Ao utilizar a função HTTPCGet(), pode-se especificar um Content-Type diferenciado para o conteúdo postado. Caso não seja especificado um Content-Type, alguns servidores tratam a informação postada como sendo um dado do tipo 'application/x-www-form-url', ou seja, seria o equivalente a um formulário HTML postado via browser. Desta forma, outros servidores poderão não reconhecer tal informação postada dessa forma. Para especificar que o conteúdo postado deve ser tratado como um Get de formulário HTTP, deve-se passar no parâmetro um elemento 'Content-Type: application/x-www-form-url'.
- Mais informações sobre Content-Type, acesse os links a seguir:
Exemplos
1-Consumindo uma API Rest de testes
Neste primeiro exemplo utilizaremos para testes um mini servidor Rest, capaz de responder os métodos GET e POST.
Mini servidor Rest
Pré-Requisitos: Nodejs e NPM
Salve em um diretório de sua escolha os dois arquivos a seguir, o package.json e o index.js.
{
"name": "sample_rest",
"version": "1.0.0",
"description": "simple rest",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "Mansano",
"license": "MIT",
"dependencies": {
"express": "^4.17.3"
}
}
var express = require("express");
var bodyParser = require('body-parser')
var app = express()
let port = 3333
// POST - Recebe JSON e retorna o campo "template" deste JSON como resposta
app.post('/postJson', bodyParser.json(), (req, res, next) => {
console.log("/postJson => " + req.body.template);
res.json({"post_send":req.body.template});
});
// GET - Recebe e retorna o mesmo JSON
app.get("/getJson", (req, res, next) => {
console.log("/getJson => " + JSON.stringify(req.query))
res.json(req.query)
});
app.listen(port, () => {
console.log(`Server running on port: ${port}`);
});
Neste mesmo diretório abra a linha de comando:
- Instale as dependencias do mini servidor Rest através do comando:
npm install
- Para iniciá-lo:
node index.js
- Será exibida a mensagem:
Server running on port: 3333
Este fonte, na linguagem TLPP, envia o conteúdo de uma variavel do tipo JSON para o metodo GET de uma API de teste
#include "protheus.ch"
// Funcao envia o conteudo de uma variavel do tipo JSON
// para o metodo GET de uma API de teste
Function u_HttpCGet()
Local cUrl := "http://localhost:3333/getJson"
// JSON para testes de envio
Local oGetPar := {"template":"AQAAABQAAACEAQAAAQASAAMAZAAAAAAAgAEAAH2CDU7keLcCA0aog19vXa0IXbXH4eUkOvWEDD2PBqXwZedxxCkWflZytlYal4QsDC35NggrdNniVZ2aL69I7KOXAkV9WIwC0tAFfDlf7hZeZ2UY/54FkRNF5bxw27e7O3L/xwxENHNOtqF5YH9tI2H2Z*x1buX23HMAbykimzyAcGMsx9Ng/jq1v7lFVXkbiM2RgutC5JwyZC14EhwrviEEsBh67NCWALkGNb*/FG7uJ8Tk/J4ohXtcqN5BoES8aeWHGeWOPLs0GWKjb8Tf8gnOq8r9OHHpyye2qeTv7UjV/sHShe7ey2LhZVVJ9gQfrzr975wlm9mlkTZxSjpWiI9iAa3CWZQORGKKLVPUPhWw6Idyq/sVS5BtVeJgPmRLSh4UYLOQ3Dh4CUnQ9ApbofC6KSdRXVVg8j5CZdyVS56WkBTF*lCa8NW/Y2B1ain*sc2eo/H7IqKvjHmO9Qe37PwVGTSSDId2PDQol7BbYYk2EpsOzC933RDp1vTaOxD1sQ"}
Local cGetPar := oGetPar:toJson() // Converte JSON pra texto
Local nTimeOut := 2 // Segundos
Local aHeaderStr:= {}
Local cHeaderRet:= ""
Local cResponse := ""
Local cErro := ""
Local cMsgAlert := "HttpCGet()"
aAdd(aHeaderStr,"Content-Type| application/json")
aAdd(aHeaderStr,"Content-Length| " + Alltrim(Str(Len(cGetPar))) )
cResponse := HttpCGet( cUrl , cGetPar , nTimeOut , aHeaderStr , @cHeaderRet )
cMsgAlert += VarInfo("Header:", cHeaderRet )
cMsgAlert += VarInfo("Retorno:", cResponse )
cMsgAlert += VarInfo("Erro:", HTTPGetStatus(cErro) )
cMsgAlert += VarInfo("Erro:", cErro )
MsgAlert(cMsgAlert)
Return
Fonte sendo executado via WebApp com o WebAgent ativo.
2-Consumindo uma API externa
Neste segundo exemplo será consumido uma API enviando o Content-Type text/xml.
#INCLUDE "TOTVS.CH"
User Function tstCGet()
Local cUrl := "endereço do get"
Local cGetPar := "String com parâmetros a ser enviado na URL"
Local nTimeOut := 2 //Segundos
Local aHeaderStr:= {}
Local cHeaderRet:= ""
Local cResponse := ""
Local cErro := ""
aAdd(aHeaderStr,"Content-Type| text/xml; charset=utf-8" )
aAdd(aHeaderStr,"Content-Length| " + Alltrim(Str(Len(cGetPar))) )
cResponse := HttpCGet( cUrl , cGetPar , nTimeOut , aHeaderStr , @cHeaderRet )
VarInfo("Header:", cHeaderRet)
VarInfo("Conteudo:" ,cResponse)
VarInfo("Erro:", HTTPGetStatus(cErro) )
VarInfo("Erro:", cErro )
Return
