FWRest - Método POST com JSON

Olá, primeiro "post" aqui!

Estou desenvolvendo uma comunicação entre o Protheus e a Loja Integrada VTEX, onde irei precisar utilizar metodos GET e POST.

Através do método GET eu consegui consumir informações normalmente.

Porém através do método POST eu não consegui, sempre é retornado o erro "400 Bad Request - O Conteúdo não é um arquivo JSON válido."

Segue o exemplo de como estou fazendo:

1° Exemplo *:

Local aArea := GetArea()
    // Variavel Local Caractere para receber a url base da API
    Local cUrlBase := 'https://api.awsli.com.br'
    // Variavel Local para receber o cabeçalho da conexão com a API
    Local aHeader := {}
    // Variavel Local Objeto para conexão com a API 
    Local oRestCli := nil
    // Variavel Local Caractere para receber os dados do cliente a ser enviado
    Local oObjJson := nil
    Local aJson := {}
    // Variavel Local Lógica para controle de retorno
    Local lRetorno := .F.
    Local nHandle := nil

    // Iniciando Parametros da Conexão
    oRestCli := FWRest():New(cUrlBase)

    // Concatenando caminho a urlbase 
    oRestCli:setPath('/v1/cliente')

    // Definindo dados do cabeçalho da conexão
    aadd(aHeader, "Content-Type: application/json; charset=UTF-8")
    aadd(aHeader, "User-Agent: Mozilla/5.0 (compatible; Protheus " + GetBuild() + ")")    
    aadd(aHeader, "Accept: */*")
    aadd(aHeader, "Authorization: chave_api CODIGO_CHAVE aplicacao CODIGO_CHAVE")

    oObjJson := JsonObject():New()
    oObjJson["email"] := "anderson-alves98@leanclean.com.br"
    oObjJson["nome"] := "Anderson Rafael Alves"
    oObjJson["sexo"] := "f"
    oObjJson["aceita_newsletter"] := .T.
    oObjJson["telefone_principal"] := "7727562476"
    oObjJson["telefone_comercial"] := nil
    oObjJson["telefone_celular"] := "77997596060"
    oObjJson["grupo_id"] := "1"
    oObjJson["tipo"] := "PF"
    oObjJson["cpf"] := "56845278849"
    oObjJson["rg"] := "359396525"
    oObjJson["razao_social"] := nil
    oObjJson["cnpj"] := nil
    oObjJson["ie"] := nil
    // Adicionando array de endereços
    aJson := {}
    aadd(aJson,JsonObject():new())
    aJson[1]["endereco"] := "Rua B"   
    aJson[1]["numero"] := "861"   
    aJson[1]["complemento"] := nil  
    aJson[1]["bairro"] := "Zabelê"   
    aJson[1]["cidade"] := "Vitória da Conquista"    
    aJson[1]["estado"] := "BA"  
    aJson[1]["cep"] := "45079442"
    aJson[1]["pais"] := "BRA" 
    aJson[1]["nome"] := "Residencia" 
    oObjJson["enderecos"] := JSonObject():New()
    oObjJson["enderecos"] := aJson
    oObjJson["data_nascimento"] := "1998-05-12"

    // Gravando arquivo no c: para teste
    FWAlertInfo(cValToChar(oObjJson), "JSON")
    nHandle := FCreate('C:\arquivo_teste_json.txt')
    FWrite(nHandle, cValToChar(oObjJson))
    FClose(nHandle) 

    // Setando parametros do post
    oRestCli:SetPostParams(oObjJson:ToJson())
    oRestCli:SetChkStatus(.F.)    

    // Tentando conectar na API para passar dados - MÉTODO POST
    if oRestCli:POST(aHeader)
        cError := ""
        nStatus := HTTPGetStatus(@cError)

        if nStatus >= 200 .And. nStatus <= 299
            if Empty(oRestCli:getResult())
                FWAlertInfo(nStatus, "Status HTTP")
            else
                FWAlertInfo(oRestCli:getResult(), "Resultado do POST")
            endif
        else
            FWAlertError(cError + oRestCli:GetLastError() + CRLF + oRestCli:getResult(), "ERRO!!!")
        endif
    else
        // Mensagem de erro
        FWAlertError('Não foi inserir o Cliente! Retorno do erro: ' + oRestCli:GetLastError() + CRLF + oRestCli:getResult(), 'ERRO!')
    endif

    nHandle := FCreate('c:\retorno_teste_json_LJBPOSTCLI_.txt')
    FWrite(nHandle, cValToChar(cError + CRLF + oRestCli:GetLastError() + CRLF + oRestCli:getResult()))
    FClose(nHandle) 

    RestArea(aArea)

2° Exemplo *:

Local aArea := GetArea()
    Local cUrl      := "https://api.awsli.com.br"
    Local cResource := "/v1/cliente"
    Local aHeader   := {} 
    Local cHeadRet  := '' 
    Local nTimeOut  := 120 
    Local oObjJson := nil
    Local _cResult := nil
    Local nHandle := nil

    oObjJson := JsonObject():New()
    oObjJson["email"] := "anderson-alves98@leanclean.com.br"
    oObjJson["nome"] := "Anderson Rafael Alves"
    oObjJson["sexo"] := "f"
    oObjJson["aceita_newsletter"] := .T.
    oObjJson["telefone_principal"] := "7727562476"
    oObjJson["telefone_comercial"] := nil
    oObjJson["telefone_celular"] := "77997596060"
    oObjJson["grupo_id"] := "1"
    oObjJson["tipo"] := "PF"
    oObjJson["cpf"] := "56845278849"
    oObjJson["rg"] := "359396525"
    oObjJson["razao_social"] := nil
    oObjJson["cnpj"] := nil
    oObjJson["ie"] := nil
    // Adicionando array de endereços
    aJson := {}
    aadd(aJson,JsonObject():new())
    aJson[1]["endereco"] := "Rua B"   
    aJson[1]["numero"] := "861"   
    aJson[1]["complemento"] := nil  
    aJson[1]["bairro"] := "Zabelê"   
    aJson[1]["cidade"] := "Vitória da Conquista"    
    aJson[1]["estado"] := "BA"  
    aJson[1]["cep"] := "45079442" 
    aJson[1]["pais"] := "BRA" 
    aJson[1]["nome"] := "Residencia" 
    oObjJson["enderecos"] := JSonObject():New()
    oObjJson["enderecos"] := aJson
    oObjJson["data_nascimento"] := "1998-05-12"

    // Gravando arquivo no c: para teste
    FWAlertInfo(cValToChar(oObjJson), "JSON")
    nHandle := FCreate('C:\arquivo_teste_json_LJBHTPTCLI_.txt')
    FWrite(nHandle, cValToChar(oObjJson))
    FClose(nHandle) 

    // Definindo dados do cabeçalho da conexão
    aadd(aHeader, "Content-Type: application/json; charset=UTF-8")
    aadd(aHeader, "User-Agent: Mozilla/5.0 (compatible; Protheus " + GetBuild() + ")")    
    aadd(aHeader, "Accept: */*")
    aadd(aHeader, "Authorization: chave_api CODIGO_CHAVE aplicacao CODIGO_CHAVE")

    _cResult  := HTTPPost(cUrl + cResource, "",cValToChar(oObjJson),nTimeOut,aHeader,@cHeadRet) 

    nHandle := FCreate('C:\retorno_teste_json_LJBHTPTCLI_.txt')
    FWrite(nHandle, cValToChar(_cResult))
    FClose(nHandle) 

    if !empty( _cResult )
        FWAlertInfo(cValToChar(_cResult), "HTTPS POST OK")
    else
        FWAlertInfo(cValToChar(_cResult), "HTTPS POST FAILED")
    endif    
    RestArea(aArea)

Os dados da pessoa acima são ficticios. A chave foi suprimida por motivos obvios.

A questão é que de ambas as formas, inclusive montando o JSON "na mão" em uma variável com o conteúdo STRING gera o mesmo erro. Eu andei pesquisando bastante e acho que talvez seja algo relacionado ao charset, mas não solucionei ainda.enter code here

compartilhar
  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do TOTVS DevForum!

1 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags advpl json rest post get ou faça a sua própria pergunta.