PDA

Ver la Versión Completa : [Sintaxis] HttpRequest


Fito
1 de noviembre de 2021, 14:04
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:


01 variables-conexion global.

02 winhttp pic x(128) value "WinHttp.WinHttpRequest.5.1".

02 oWS usage object reference COM.
02 SRC pic x(1024).
02 MSG pic x(1024).

02 metodo pic x(1024) value "POST".

02 autenticacion pic x(1024) value "http://157.230.55.48:5000/api/v1/auth/login".

02 arti-alta pic x(1024) value "http://157.230.55.48:5000/api/v1/erp/articles/sync".

02 clave pic x(30) value "XXXXXXXXX".

02 credenciales.
03 pic x(7) value "Bearer ".
03 token pic x(1024).

02 RH1 pic x(1024).
02 RH2 pic x(1024).

02 url pic x(1024) value "http://157.230.55.48:5000/api/v1/erp/".

02 modo pic x(1024) value "FALSE".

02 respuesta pic x(8192).

02 envio-r.
03 pic x(19) value "d:\sernick\prueba1".
03 archivo-json.
04 pic x(5) value "temp".
04 arch-json-time pic 9(8).
04 pic x(5) value ".json".
02 redefines envio-r.
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)


PROCEDURE DIVISION.

#include "copys\declara-com.cpy".

comienzo.
invoke COM "CREATE-OBJECT" using winhttp returning oWS.

invoke oWS "OPEN" using metodo autenticacion modo.

move "Authorization" to RH1.
move clave to RH2.
invoke oWS "setRequestHeader" using RH1 RH2.

invoke oWS "send".

invoke oWS "get-Responsetext" returning respuesta.

set oWS to null.

invoke json "Clear".

invoke json "Load" USING respuesta.

invoke json "StringOf" using "token" returning token.

invoke grdLista "AddItem" using respuesta.

exit program.

Con esto pido el token...


WORKING-STORAGE SECTION.
01 wsend.
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"'.
02 pic x(115) value ',"nc":"0","fa":"0","dum":"UN","v":{"a":"21","f":false},"um":{"UN":{"e":"1","k":"UN","n":"UNIDAD"}}}}'.

PROCEDURE DIVISION.

#include "copys\declara-com.cpy".

comienzo.
invoke COM "CREATE-OBJECT" using winhttp returning oWS.

invoke oWS "OPEN" using metodo arti-alta modo.

move "Authorization" to RH1.
move credenciales to RH2.
invoke oWS "setRequestHeader" using RH1 RH2.

invoke grdLista "AddItem" using credenciales.

move "Content-Type" to RH1.
move "application/json" to RH2.
invoke oWS "setRequestHeader" using RH1 RH2.

invoke oWS "send" using wsend.

invoke oWS "get-Responsetext" returning respuesta.

set oWS to null.

invoke grdLista "AddItem" using respuesta.

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 (https://social.msdn.microsoft.com/Forums/en-US/aa53644b-42bd-4312-aa02-51830e773264/post-file-http-using-visual-foxpro?forum=visualfoxprogeneral)


filecontent = FileToStr("Movies.txt")
loHTTP = CREATEOBJECT("WinHttp.WinHttpRequest.5.1")
loHTTP.Open("POST", "http://myip:8080/upload/", .F.)
loHTTP.SetRequestHeader("content-type", "text/plain") && or other mime types for other file types.
loHTTP.SetRequestHeader("content-disposition", 'attachment; filename="Movies.txt"')
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ó


comienzo.
invoke COM "CREATE-OBJECT" using winhttp returning oWS.

invoke oWS "OPEN" using metodo arti-alta modo.

move "Authorization" to RH1.
move credenciales to RH2.
invoke oWS "setRequestHeader" using RH1 RH2.

invoke grdLista "AddItem" using credenciales.

move "Content-Type" to RH1.
move "application/json" to RH2.
invoke oWS "setRequestHeader" using RH1 RH2.

move "Content-Disposition" to RH1.
move spaces to RH2.
string 'attachment; filename="' delimited by size
envio delimited by size
'"' delimited by size
into RH2
end-string.
invoke oWS "setRequestHeader" using RH1 RH2.

invoke oWS "send" using wjson.

invoke oWS "get-Responsetext" returning respuesta.

set oWS to null.

invoke grdLista "AddItem" using respuesta.

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
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
WORKING-STORAGE SECTION.
01 wsend.
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"'.
02 pic x(115) value ',"nc":"0","fa":"0","dum":"UN","v":{"a":"21","f":false},"um":{"UN":{"e":"1","k":"UN","n":"UNIDAD"}}}}'.

PROCEDURE DIVISION.

#include "copys\declara-com.cpy".

comienzo.
invoke COM "CREATE-OBJECT" using winhttp returning oWS.

invoke oWS "OPEN" using metodo arti-alta modo.

move "Authorization" to RH1.
move credenciales to RH2.
invoke oWS "setRequestHeader" using RH1 RH2.

invoke grdLista "AddItem" using credenciales.

move "Content-Type" to RH1.
move "application/json" to RH2.
invoke oWS "setRequestHeader" using RH1 RH2.

invoke oWS "send" using wsend.

invoke oWS "get-Responsetext" returning respuesta.

set oWS to null.

invoke grdLista "AddItem" using respuesta.

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:


string
' Sub FuncionEnviarArticulo() ' vbCRLF
' Dim RespEstado , respuesta , success ' vbCRLF
' Dim wsend , metodo arti-alta modo ' vbCRLF
' Dim RH1 , RH2 ' vbCRLF

' set WinHttpReq = CreateObject("WinHttp.WinHttpRequest.5.1") ' vbCRLF

' ' vbCRLF

' WinHttpReq.Open "POST", "metodo & arti-alta ",modo) ' vbCRLF
' ' vbCRLF
' RH1 = "Authorization" ' vbCRLF
' RH2 = "credenciales" ' vbCRLF

' WinHttpReq.setRequestHeader ( RH1 , RH2 ) ' vbCRLF

' RH1 = "Content-Type" ' vbCRLF
' RH2 = "application/json" ' vbCRLF

' WinHttpReq.setRequestHeader ( RH1 , RH2 ) ' vbCRLF

' set json = CreateObject("Chilkat_9_5_0.JsonObject") ' vbCRLF
' success = json.LoadFile("plu.txt") ' vbCRLF * archivo con formato json ya creado
' wsend = json.emit ' vbCRLF *> variable con el registro json
* ' msgbox success ' vbCRLF *> 1 correcto 0 error


' WinHttpReq.Send(wsend) ' vbCRLF *> envia los bloques

' WinHttpReq.WaitForResponse() ' vbCRLF

' respuesta = WinHttpReq.ResponseText ' vbCRLF

' msgbox respuesta ' vbCRLF

' RespEstado = WinHttpReq.Status ' vbCRLF

' Estado = RespEstado ' vbCRLF *> estado transferencia de bloques




' End Sub ' vbCRLF
delimited by size into scriptCode1
end string
INVOKE scriptControl1 "Reset".

invoke scriptControl1 "AddCode" using scriptCode.

invoke scriptControl1 "ExecuteStatement" using "FuncionEnviarArticulo".