POST para REST como form-data

Amigos, bom dia!

Alguém já fez algum POST com ADVPL e ao invés de usar Raw, usar form-data?

Via postman ou insomnia foi tranquilo configurar, mas não sei como fazer em ADVPL.

Uso o FwRest, mas não vi nenhuma forma de fazer isso. Mesmo usando o SetPath. Alguém já passou por isso?

Agradeço desde já.

Gente, vi que poderia add no Content-type, mas mesmo assim não funcionou.

Esse é o trecho do cPostPArms que precisa ser enviado:



cPostParms := 'Content-Disposition: form-data; name="str_json"' + CRLF + CRLF
cPostParms += 'VALUE' + CRLF

Parece que na montagem no BodyJson() está quebrando a estrutura do postparam.
Tente serializar esse json, isto é, deixar sem as quebras de linha pois será uma unica string sendo passada como valor do parametro “str_json”. Da maneira como está, cada quebra de linha identifica um novo valor do parâmetro

No final desse documento tem informações sobre o envio com form-data

https://tdn.totvs.com/display/tec/HTTPPost

Fizemos uma implementação nesta semana e funcionou corretamente utilizando somente um CRLF entre o nome do parâmetro e o valor. Consumindo uma API .net de um fornecedor

Vou tentar com o HTTPPost. Talvez seja uma limitação do FwRest. Vocês só adicionou no Header o content-type e nos parâmetros também e funcionou? Vou testar…

No header adicionamos os 2:
aadd(aHeadOut,‘User-Agent: Mozilla/4.0 (compatible; Protheus ‘+GetBuild()+’)’)
aadd(aHeadOut,‘Content-Type: multipart/form-data’)

E nos valores:
cPostParms := ‘Content-Disposition: form-data; name=“someParam”’ + CRLF
cPostParms += ‘valorDoParametro’

sPostRet := HttpPost(cUrl,“”,cPostParms,nTimeOut,aHeadOut,@cHeadRet)

Tive retorno positivo com essa implementação.
Mas pode testar conforme a documentação, utilizando 2 CRLF seguidos

abs

Fala Rodrigo, boa tarde!
Posso publicar o meu fonte pra você fazer uma comparação com o seu aí por favor ?

Estou conseguindo comunicar a API, autentico, mas o JSON que estou enviando no body está inconsistente a API me retorna essa resposta:

{
“ZMI”: {
“CONTENT”: {
“ERRORS”: {
“ERROR”: {
“CODE”: 999,
“DESCRIPTION”: “Erro na conversão do JSON recebido”
}
}
}
}
}

Rodrigo,
Consegui mano…
Muito obrigado pela ajuda, vou postar o fonte aqui nesse tópico para ajudar outras pessoas caso tenham o mesmo problema.

Bom dia!

Estou com uma API que utiliza content-type form-data, poderia compartilhar seu fonte para que possa analisar a forma de envio do arquivo json?

Bom dia Alguem pode me enviar um fonte completo usando o form-data como exemplo? Estou com dificuldade de gerar uma rotina com essa configuração. O retorno que tenho "é necessário enviar do Json de dados".

Obrigado Pinheiro

adflpj@gmail.com

Boa tarde!

Conversando com o pessoal responsável pela classe FWRest, a mesma já possui o HttpPost encapsulada. Estava com o mesmo problema e conseguir resolver dessa forma.

aHeader := {"Content-Type: multipart/form-data"}

oRest := FWRest():New("Seu Endpoint")

oRest:SetPostParams(cBody)

oRest:Post(aHeader)

O cBody precisa ser no mesmo formato utilizada na documentação: https://tdn.totvs.com/display/tec/HTTPPost.

Exemplo:

cBody += 'Content-Disposition: form-data; name="Key"' + CHR(13)+CHR(10) + CHR(13)+CHR(10)

cBody += 'Value' + CHR(13)+CHR(10)

Observação: O Key precisa sempre ter duas quebras de linhas e o value uma quebra