Versão atual:

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

Versão (1):

Ver a versão formatada

FWRest - Método POST com JSON

Comentário

new question