Cobol Foro

Cobol Foro (https://www.cobolforo.es/index.php)
-   PowerCOBOL (ActiveX, v4 - v11) (https://www.cobolforo.es/forumdisplay.php?f=9)
-   -   [Sintaxis] HttpRequest (https://www.cobolforo.es/showthread.php?t=1393)

Fito 1 de noviembre de 2021 14:04

HttpRequest
 
1 Archivos Adjunto(s)
Hola Amigos:

Estoy haciendo una aplicación para conectar mi sistema a un servicio web (Conquer) para vendedores (notas de pedido, cobranzas, etc).

Estoy usando HttpRequest. logro hacer la conexión, pedir el token, pero después tengo que enviar un archivo json con la tabla de artículos.

Les voy pasando código:

Código COBOL:
  1.  01  variables-conexion global.
  2.  
  3.      02 winhttp          pic x(128) value "WinHttp.WinHttpRequest.5.1".
  4.  
  5.      02 oWS usage object reference COM.
  6.      02 SRC              pic x(1024).
  7.      02 MSG              pic x(1024).
  8.  
  9.      02 metodo           pic x(1024) value "POST".
  10.      
  11.      02 autenticacion    pic x(1024) value "http://157.230.55.48:5000/api/v1/auth/login".
  12.      
  13.      02 arti-alta        pic x(1024) value "http://157.230.55.48:5000/api/v1/erp/articles/sync".
  14.      
  15.      02 clave            pic x(30)  value "XXXXXXXXX".
  16.  
  17.      02 credenciales.
  18.         03               pic x(7) value "Bearer ".
  19.         03 token         pic x(1024).
  20.          
  21.      02 RH1              pic x(1024).
  22.      02 RH2              pic x(1024).
  23.      
  24.      02 url              pic x(1024) value "http://157.230.55.48:5000/api/v1/erp/".
  25.      
  26.      02 modo             pic x(1024) value "FALSE".
  27.  
  28.      02 respuesta        pic x(8192).
  29.      
  30.      02 envio-r.
  31.         03                      pic x(19) value "d:\sernick\prueba1".
  32.         03 archivo-json.
  33.            04                   pic x(5) value "temp".
  34.            04 arch-json-time    pic 9(8).
  35.            04                   pic x(5) value ".json".
  36.      02 redefines envio-r.
  37.         03 envio                pic x(37).
Estas son las variables que uso. El campo clave es la clave para pedir el token (no a pongo acá porque le pertenece al cliente)

Código COBOL:
  1.  PROCEDURE       DIVISION.
  2.  
  3.  #include "copys\declara-com.cpy".
  4.  
  5.  comienzo.
  6.      invoke COM "CREATE-OBJECT" using winhttp returning oWS.
  7.  
  8.      invoke oWS "OPEN" using metodo autenticacion modo.
  9.  
  10.      move "Authorization"         to RH1.
  11.      move clave                   to RH2.
  12.      invoke oWS "setRequestHeader" using RH1 RH2.
  13.  
  14.      invoke oWS "send".
  15.      
  16.      invoke oWS "get-Responsetext" returning respuesta.
  17.  
  18.      set oWS           to null.
  19.  
  20.      invoke json "Clear".
  21.      
  22.      invoke json "Load" USING respuesta.
  23.      
  24.      invoke json "StringOf" using "token" returning token.
  25.      
  26.      invoke grdLista "AddItem" using respuesta.
  27.  
  28.      exit program.
Con esto pido el token...

Código COBOL:
  1.  WORKING-STORAGE SECTION.
  2.  01  wsend.
  3.      02       pic x(115) value '{"000001":{"k":"1","rk":"1","b":"0","d":"CREMOSO LA LACTEO","i":"","n":"CREMOSO LA LACTEO","ld":"CREMOSO LA LACTEO"'.
  4.      02       pic x(115) value ',"nc":"0","fa":"0","dum":"UN","v":{"a":"21","f":false},"um":{"UN":{"e":"1","k":"UN","n":"UNIDAD"}}}}'.
  5.  
  6.  PROCEDURE       DIVISION.
  7.  
  8.  #include "copys\declara-com.cpy".
  9.  
  10.  comienzo.
  11.      invoke COM "CREATE-OBJECT" using winhttp returning oWS.
  12.  
  13.      invoke oWS "OPEN" using metodo arti-alta modo.
  14.  
  15.      move "Authorization"         to RH1.
  16.      move credenciales            to RH2.
  17.      invoke oWS "setRequestHeader" using RH1 RH2.
  18.  
  19.      invoke grdLista "AddItem" using credenciales.
  20.  
  21.      move "Content-Type"          to RH1.
  22.      move "application/json"      to RH2.
  23.      invoke oWS "setRequestHeader" using RH1 RH2.
  24.  
  25.      invoke oWS "send" using wsend.
  26.      
  27.      invoke oWS "get-Responsetext" returning respuesta.
  28.  
  29.      set oWS           to null.
  30.  
  31.      invoke grdLista "AddItem" using respuesta.
  32.  
  33.      exit program.
Acá trato de enviar el json de artículos. En esta prueba que les muestro el json lo cargo en una variable, pero la idea es poder enviar el archivo.

Si lo hago con Postman no tengo problemas, pero no sé traducir al cobol eso

Ahí les paso la imagen de pantalla del Postman.
En el body, selecciono binary y me pide el archivo. Ahora cómo hacerlo en Cobol no pude...

Saludos

Fito...

Kuk 1 de noviembre de 2021 18:21

@Fito, mira esto a ver: Post File HTTP using visual foxpro

Código VB:
  1. filecontent = FileToStr("Movies.txt")
  2. loHTTP = CREATEOBJECT("WinHttp.WinHttpRequest.5.1")    
  3. loHTTP.Open("POST", "http://myip:8080/upload/", .F.)
  4. loHTTP.SetRequestHeader("content-type", "text/plain") && or other mime types for other file types.
  5. loHTTP.SetRequestHeader("content-disposition", 'attachment; filename="Movies.txt"')
  6. loHTTP.Send(filecontent)

Fito 1 de noviembre de 2021 22:29

Hola Kuk:

Por lo que veo, en el método SEND va el contenido del archivo no el nombre.

Lo que me parece raro es que si es así que va el contenido, para qué le decimos el nombre del archivo en el Header.

Voy a probar así y comento.

Muchas Gracias.

Saludos.

Fito...

---------- Post añadido el 1 de noviembre de 2021 a las 21:36 ----------

Kuk, sos un genio...

Así funcionó

Código COBOL:
  1.  comienzo.
  2.      invoke COM "CREATE-OBJECT" using winhttp returning oWS.
  3.  
  4.      invoke oWS "OPEN" using metodo arti-alta modo.
  5.  
  6.      move "Authorization"         to RH1.
  7.      move credenciales            to RH2.
  8.      invoke oWS "setRequestHeader" using RH1 RH2.
  9.  
  10.      invoke grdLista "AddItem" using credenciales.
  11.  
  12.      move "Content-Type"          to RH1.
  13.      move "application/json"      to RH2.
  14.      invoke oWS "setRequestHeader" using RH1 RH2.
  15.  
  16.      move "Content-Disposition"   to RH1.
  17.      move spaces                  to RH2.
  18.      string 'attachment; filename="' delimited by size
  19.             envio                    delimited by size
  20.             '"'                      delimited by size
  21.         into RH2
  22.      end-string.
  23.      invoke oWS "setRequestHeader" using RH1 RH2.
  24.  
  25.      invoke oWS "send" using wjson.
  26.      
  27.      invoke oWS "get-Responsetext" returning respuesta.
  28.  
  29.      set oWS           to null.
  30.  
  31.      invoke grdLista "AddItem" using respuesta.
  32.  
  33.      exit program.

En el campo envío tengo el nombre del archivo json y en el campo wjson tengo metido el contenido del json.

El json lo genero con chilkat (tengo un post paralelo donde Fastpho me ha dado todas las soluciones). El activex de chilkat tiene un método para cargar en un string todo el contenido del json, pero me encuentro con el límite de 8192 caracteres, así que por ahora lo que hago es leer el archivo line sequential e ir cargando el string.

Lo que sigo sin entender por qué en la cabecera le digo que adjunto el archivo json y después en el body en vez de hacer referencia al archivo, tengo que meter el contenido.

Brillante amigo.

Saludos

Fito...

Kuk 2 de noviembre de 2021 09:54

Cita:

Citación del post de Fito (Mensaje 7226)
Lo que sigo sin entender por qué en la cabecera le digo que adjunto el archivo json y después en el body en vez de hacer referencia al archivo, tengo que meter el contenido.

Hola compañero. La verdad es que yo tampoco, este campo no es mi punto fuerte.
Lo importante es que funciona :teclea:

fastpho 2 de noviembre de 2021 15:52

Cita:

Citación del post de Fito (Mensaje 7224)
Código COBOL:
  1.  WORKING-STORAGE SECTION.
  2.  01  wsend.
  3.      02       pic x(115) value '{"000001":{"k":"1","rk":"1","b":"0","d":"CREMOSO LA LACTEO","i":"","n":"CREMOSO LA LACTEO","ld":"CREMOSO LA LACTEO"'.
  4.      02       pic x(115) value ',"nc":"0","fa":"0","dum":"UN","v":{"a":"21","f":false},"um":{"UN":{"e":"1","k":"UN","n":"UNIDAD"}}}}'.
  5.  
  6.  PROCEDURE       DIVISION.
  7.  
  8.  #include "copys\declara-com.cpy".
  9.  
  10.  comienzo.
  11.      invoke COM "CREATE-OBJECT" using winhttp returning oWS.
  12.  
  13.      invoke oWS "OPEN" using metodo arti-alta modo.
  14.  
  15.      move "Authorization"         to RH1.
  16.      move credenciales            to RH2.
  17.      invoke oWS "setRequestHeader" using RH1 RH2.
  18.  
  19.      invoke grdLista "AddItem" using credenciales.
  20.  
  21.      move "Content-Type"          to RH1.
  22.      move "application/json"      to RH2.
  23.      invoke oWS "setRequestHeader" using RH1 RH2.
  24.  
  25.      invoke oWS "send" using wsend.
  26.      
  27.      invoke oWS "get-Responsetext" returning respuesta.
  28.  
  29.      set oWS           to null.
  30.  
  31.      invoke grdLista "AddItem" using respuesta.
  32.  
  33.      exit program.
Acá trato de enviar el json de artículos. En esta prueba que les muestro el json lo cargo en una variable, pero la idea es poder enviar el archivo.

Si lo hago con Postman no tengo problemas, pero no sé traducir al cobol eso

Ahí les paso la imagen de pantalla del Postman.
En el body, selecciono binary y me pide el archivo. Ahora cómo hacerlo en Cobol no pude...

Saludos

Fito...

Podrias probar algo como esto directamente codigo no probado :piti:

Código VB:
  1. string
  2.                            '   Sub FuncionEnviarArticulo()                                      ' vbCRLF
  3.                           '        Dim RespEstado  , respuesta , success                       ' vbCRLF  
  4.                           '        Dim wsend , metodo arti-alta modo                           ' vbCRLF  
  5.                            '        Dim RH1 , RH2                                               ' vbCRLF                           
  6.  
  7.                            '        set WinHttpReq = CreateObject("WinHttp.WinHttpRequest.5.1") ' vbCRLF
  8.  
  9.                            '                                                                    ' vbCRLF
  10.  
  11.                            '     WinHttpReq.Open "POST", "metodo & arti-alta ",modo)             ' vbCRLF
  12.                           '                                                                    ' vbCRLF                          
  13.                           '        RH1 =   "Authorization"                                     ' vbCRLF                          
  14.                            '        RH2 =   "credenciales"                                      ' vbCRLF                          
  15.                            
  16.                            '     WinHttpReq.setRequestHeader ( RH1 , RH2 )                      ' vbCRLF                           
  17.  
  18.                            '        RH1 =   "Content-Type"                                      ' vbCRLF                          
  19.                            '        RH2 =   "application/json"                                  ' vbCRLF                          
  20.                            
  21.                            '     WinHttpReq.setRequestHeader ( RH1 , RH2 )                      ' vbCRLF                           
  22.                          
  23.                            '         set json = CreateObject("Chilkat_9_5_0.JsonObject")        ' vbCRLF
  24.                           '         success = json.LoadFile("plu.txt")                         ' vbCRLF * archivo con formato json ya creado  
  25.                           '         wsend = json.emit                                          ' vbCRLF *> variable con el registro json  
  26. *                          '         msgbox success                                             ' vbCRLF *> 1 correcto 0 error
  27.  
  28.  
  29.                            '     WinHttpReq.Send(wsend)                                         ' vbCRLF  *> envia los bloques      
  30.  
  31.                            '     WinHttpReq.WaitForResponse()                                   ' vbCRLF
  32.  
  33.                            '     respuesta = WinHttpReq.ResponseText                             ' vbCRLF
  34.  
  35.                            '          msgbox respuesta                                           ' vbCRLF
  36.                          
  37.                            '         RespEstado =  WinHttpReq.Status                            ' vbCRLF
  38.                          
  39.                            '         Estado   =  RespEstado                                     ' vbCRLF *> estado transferencia de bloques
  40.                          
  41.                            
  42.  
  43.                            
  44.                            '   End Sub                                                          ' vbCRLF                  
  45.                     delimited by size into scriptCode1
  46.                      end string
  47.       INVOKE scriptControl1 "Reset".
  48.      
  49.       invoke scriptControl1 "AddCode" using scriptCode.
  50.  
  51.       invoke scriptControl1 "ExecuteStatement" using "FuncionEnviarArticulo".


La franja horaria es GMT +2. Ahora son las 13:54.

Powered by: vBulletin, Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.