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: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

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, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, 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: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

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, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, 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: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

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, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, 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: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

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, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, 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