metodo post com json x matriz

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Abel
Usuário Nível 3
Usuário Nível 3
Mensagens: 332
Registrado em: 14 Mar 2012 13:16
Localização: sao paulo / sp

metodo post com json x matriz

Mensagem por Abel »

ola pessoal, to tentando conectar a uma API para mandar email mas to com dificuldade na parte da matriz
se alguem puder me ajudar.

Exemplo de corpo de solicitação - manual
{
"from": "email address",
"to": "recipient email address",
"subject": "subject in string format",
"content": "plain / text content",
"html_content": "html content",
"attachments": [
{
"name": "test.gif",
"type": "image/gif",
"content": "The Base64 encoded content of the attachment."
},
{
"name": "test.pdf",
"type": "application/pdf",
"content": "The Base64 encoded content of the attachment."
}
]
}


minha rotina - nao consigo anexar o arquivo no email
ahash["from"] := "xxxxx@xxxxx.com.br" // de
ahash["to"] := "destino@gmail.com" // para
ahash["subject"] := "assunto do email "
ahash["content"] := "vamos la"
ahash["html_content"]:= "ola este é um teste "
ahash["attachments"] := {"name:aulas.prn.pdf","type:application/pdf","content:The Base64 encoded content of the attachment."}
//
cJson := hb_jsonEncode(ahash, .t.)

Try
oOle := CreateObject("MSXML2.XMLHTTP")
Catch
oOle := CreateObject("Microsoft.XMLHTTP")
END

oOle:Open( "POST", "https://api.turbo-smtp.com/api/mail/send", .t. )
oOle:SetRequestHeader( "content-type", "application/json; charset=utf-8")
oOle:SetRequestHeader( "Authorization", rA_SMTP )
//
oOle:Send(cJson)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20416
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

metodo post com json x matriz

Mensagem por JoséQuintas »

Apenas se descuidou da parte onde entra array numérico, e não por nome.
Usando a cabeça.... anexos são array, ok, fez isso... mas....

Código: Selecionar todos

"attachments": [
Isso significa que x[ "attachments" ] é o hash, e vai conter um array {}

Código: Selecionar todos

aHash[ "attachments" ] := {}

UmAnexo := hb_hash()
UmAnexo[ "name" ] := 
UmAnexo[ "type"  ] :=
UmAnexo[ "content" ] :=

AAdd( aHash[ "attachments" ], UmAnexo )
Aproveitando....
Uma função que postei por aqui, ShowJason() é pra ajudar isso.
José M. C. Quintas
Harbour 3.2, mingw, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (Linux/Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20416
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

metodo post com json x matriz

Mensagem por JoséQuintas »

showjson.png
Tä mais enxuta agora.

Código: Selecionar todos

PROCEDURE Main

   LOCAL aHash
   LOCAL x := [{ "from": "email address",] + ;
              [ "to": "recipient email address",] + ;
              [ "subject": "subject in string format",] + ;
              [ "content": "plain / text content",] + ;
              [ "html_content": "html content",] + ;
              [ "attachments": ] + ;
              "[" + ;
              [ { "name": "test.gif",] + ;
              [ "type": "image/gif",] + ;
              [ "content": "The Base64 encoded content of the attachment."] + ;
              [ },] + ;
              [ { ] + ;
              [ "name": "test.pdf",] + ;
              [ "type": "application/pdf",] + ;
              [ "content": "The Base64 encoded content of the attachment."] + ;
              [ }] + ;
              "]" + ;
              [ }]

   SetMode( 25, 80 )
   CLS
   aHash := hb_JsonDecode( x )
   ShowJSon( aHash, "" )

   Inkey(0)
   RETURN

FUNCTION ShowJson( aHash, cTxt )

   LOCAL oElement

   IF ValType( aHash ) $ "NCDL" .OR. aHash == NIL
      ? cTxt, aHash
   ELSEIF ValType( aHash ) == "A"
      FOR EACH oElement IN aHash
         ShowJson( oElement, cTxt + "[ " + Ltrim( Str( oElement:__EnumIndex ) ) + " ]" )
      NEXT
   ELSEIF ValType( aHash ) == "H"
      FOR EACH oElement IN aHash
            ShowJson( oElement, cTxt + '[ "' + hb_hKeyAt( aHash, oElement:__EnumIndex ) + '" ]' )
      NEXT
   ELSE
      ? cTxt, "***** nao identificado ***"
   ENDIF

   RETURN NIL
José M. C. Quintas
Harbour 3.2, mingw, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (Linux/Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Abel
Usuário Nível 3
Usuário Nível 3
Mensagens: 332
Registrado em: 14 Mar 2012 13:16
Localização: sao paulo / sp

metodo post com json x matriz

Mensagem por Abel »

Muito obrigado, Quintas !!!
deu certo envio, ainda não entendo muito bem de hash
mas usando a cada dia, vou aos poucos dominando esse assunto.

Att
ABEL
Abel
Usuário Nível 3
Usuário Nível 3
Mensagens: 332
Registrado em: 14 Mar 2012 13:16
Localização: sao paulo / sp

metodo post com json x matriz

Mensagem por Abel »

pessoal, o arquivo PDF esta chegando corrompido,
como eu converto ele para base64 ?

Obrigado desde já.
Abel
Avatar do usuário
Vlademiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 752
Registrado em: 11 Jul 2005 02:46

metodo post com json x matriz

Mensagem por Vlademiro »

Use hb_base64encode
Abel
Usuário Nível 3
Usuário Nível 3
Mensagens: 332
Registrado em: 14 Mar 2012 13:16
Localização: sao paulo / sp

metodo post com json x matriz

Mensagem por Abel »

Pessoal, continuo com dificuldades de mandar email usando API
agora estou testando smt2go.com

isso esta no exemplo de envio deles, e dizem para usar JSON
{
"api_key": "api-40246460336B11E6AA53F23C91285F72",
"to": ["Test Person <test@example.com>"],
"sender": "Test Persons Friend <test2@example.com>",
"subject": "Hello Test Person",
"text_body": "You're my favorite test person ever",
"html_body": "<h1>You're my favorite test person ever</h1>",
"custom_headers": [
{
"header": "Reply-To",
"value": "Actual Person <test3@example.com>"
}
],
"attachments": [
{
"filename": "test.pdf",
"fileblob": "--base64-data--",
"mimetype": "application/pdf"
},
{
"filename": "test.txt",
"fileblob": "--base64-data--",
"mimetype": "text/plain"
}
]
}
O Email estou conseguindo enviar, nao consigo enviar o anexo.
ele esta acusando erro no conteudo de fileblob, lendo vi que tenho que enviar arquivos codificados base64,
meu pdf abre normal na minha maquina, o que devo colocar nessa variavel ?

Obrigado mais uma vez.
Abel
Avatar do usuário
Vlademiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 752
Registrado em: 11 Jul 2005 02:46

metodo post com json x matriz

Mensagem por Vlademiro »

Abel,

Coloca o trecho do seu código de envio para a gente ver se acha a causa do problema.
Abel
Usuário Nível 3
Usuário Nível 3
Mensagens: 332
Registrado em: 14 Mar 2012 13:16
Localização: sao paulo / sp

metodo post com json x matriz

Mensagem por Abel »

vlademiro, descobri,

como estou usando uma API para enviar email, tenho que criar uma string criptografada pelo hb_base64encode e mandar ela no parametro da API

exemplos:
cString:=memoread("carro.pdf")
cString64:=Hb_base64encode(cString,len(cString))
aHash[ "attachments" ] := {}
UmAnexo := hb_hash()
UmAnexo[ "filename" ] := "carro.pdf" // nao consegui fazer enviar o anexo sem corromper.
UmAnexo[ "mimetype" ] := "application/pdf"
UmAnexo[ "fileblob" ] := "&cString64" // --base64-data--"
AAdd( aHash[ "attachments" ], UmAnexo )
//
cJson := hb_jsonEncode(ahash, .T.)
é como se esse codigo gerado fosse uma criptografia para o arquivo ser enviado por email.
o arquivo enviado é o mesmo que na minha maquina abre normalmente (pdf).

a dica acima serve para alguem que queira usar algo parecido.
Att
ABEL
Avatar do usuário
Vlademiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 752
Registrado em: 11 Jul 2005 02:46

metodo post com json x matriz

Mensagem por Vlademiro »

Valeu. Assim já fica aqui a dica.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20416
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

metodo post com json x matriz

Mensagem por JoséQuintas »

Porque isto:

Código: Selecionar todos

UmAnexo[ "fileblob" ] := "&cString64" 
e não isto:

Código: Selecionar todos

UmAnexo[ "fileblob" ] := cString64
José M. C. Quintas
Harbour 3.2, mingw, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (Linux/Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Abel
Usuário Nível 3
Usuário Nível 3
Mensagens: 332
Registrado em: 14 Mar 2012 13:16
Localização: sao paulo / sp

metodo post com json x matriz

Mensagem por Abel »

Jose Quintas,
tenho um costume de usar macro,
e sei que nao é aconselhavel,
preciso mudar esse habito.

Obrigado pela dica.
Att
ABEL
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20416
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

metodo post com json x matriz

Mensagem por JoséQuintas »

Tem muitos casos aonde os parênteses resolvem.

Código: Selecionar todos

use ( cPath + cFileName )
SET ALTERNATE TO ( cFileName )
SET PRINTER TO ( cFileName )
RUN ( "notepad.exe" + " " + "arquivo.txt" )
É questão de ir se acostumando e ver aonde realmente é necessário, ou se tem alternativa.
José M. C. Quintas
Harbour 3.2, mingw, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (Linux/Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Abel
Usuário Nível 3
Usuário Nível 3
Mensagens: 332
Registrado em: 14 Mar 2012 13:16
Localização: sao paulo / sp

metodo post com json x matriz

Mensagem por Abel »

Jose Quintas,

realmente nao tinha esse costume SET PRINTER TO ( cFileName )
é a mesma coisa que SET PRINTER TO &cFileName

e eu usando apenas macro
Valeu pela dica.
obrigado,

att,
ABEL
Responder