Paso de variables por POST con xmlhttprequest


([N4] gontorre) #1

Buenas tardes

Estoy intentando hacer una petición a un webservice de un proveedor al que tengo que pasar 2 variables por POST.

¿Cual es la manera de pasar las variables del tipo key=12345ABC&codArt=xxxxx?

He probado con Content-Type “application/x-www-form-urlencoded” y pasando en los datos del Send la cadena key=12345ABC&codArt=xxxxx pero me da error

Con CURL me funciona, pero directamente desde Velneo no.

Gracias y un saludo


([N3] pacosatu) #2

Hola Gonzalo.

Es muy extraño que con CURL funcione y con XMLHttpRequest no.
De todas formas ¿Quién devuelve el error? el servicio web o el API de vClient.
Si es el servicio web consulta el Nº de error en la documentación del API.

Comprueba el contenido del Request que envía CURL para reproducirlo exactamente con XmlHttpRequest.

El código javascript debería ser algo tan sencillo como esto:

var xhr = new XMLHttpRequest()
// OPEN. Abrimos la conexión (comprueba que cURL esté bien construida)
xhr.open("POST", cURL, false);
// Cabecera
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded")
// SEND. Enviamos los parámetros => cParametros = "variable1=valor1&variable2=valor2"
xhr.send(cParametros)

Además ten en cuenta que valor1 y valor2 de cParametros deben ir codificados para los caracteres que no son alfanuméricos (con encodeURIComponent).

Saludos
Paco Satué


([N4] gontorre) #3

Buenos días Paco y gracias por contestar

El código que tengo es prácticamente igual a lo que me dices:

importClass("XMLHttpRequest");
var cURL = theRoot.varToString("XHR_URL")
var cDatos = theRoot.varToString("XHR_DATA")
var lAsincrono = false
var xhr = new XMLHttpRequest()
xhr.timeout = 15000
xhr.open("POST", cURL, lAsincrono, "", "");
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded")
xhr.send(cDatos)

En XHR_URL paso la url del servicio que es del tipo “http://webservice.xxxxx.net:8080/WEBSERVICE/getStock.php

En XHR_DATA tengo la cadena con los parámetros en la forma “key=XXXXXXXXXXXXXXX&codArticulo=YYYYY”. Tanto la clave como el código de artículo están formados sólo por letras y dígitos. No entiendo a lo que te refieres con que los valores tienen que ir codificados con encodeURIComponent.

El WS me responde, pero en el json de respuesta pone simplemente {“errorID”:-1,errorTxt:null}

Según la documentación -1 es que el producto no existe, pero con esos mismos parámetros con CURL me contesta con el stock actual.

El código en PHP que me dan como ejemplo es:

$url = "http://webservice.xxxxxxxx.net:8080/WEBSERVICE/getStock.php";
$key = "123456789ABCDEFGHIKJ";
$codArticulo = 'A0004193';
// The data to send to the API
$postData = array(
'key' => $key,
'codArticulo' => $codArticulo
);
$ch = curl_init();
$timeout = 5; // set to zero for no timeout
curl_setopt ($ch, CURLOPT_URL, $url);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
curl_setopt ($ch, CURLOPT_POSTFIELDS ,$postData);
$file_contents = curl_exec($ch);
curl_close($ch);

Un saludo


([N1] cristianvg2003) #4

gontorre, te simplifico un poco la vida => https://github.com/Heavyblade/vajax


([N4] gontorre) #5

Hola de nuevo

He estado haciendo pruebas con SoapUI e inicialmente me daba la misma respuesta. He conseguido que me funcione marcando la casilla “Post QueryString” que hace que los parámetros vayan en el cuerpo del mensaje.

¿Se puede hacer esto mismo con xmlhttprequest?

Gracias y un saludo


([N4] gontorre) #6

Muchas gracias Cristian

Voy a probar y os cuento.

Un saludo


([N4] gontorre) #7

Buenas tardes Cristian

Estoy probando la clase vAjax y me encuentro un problema fruto de mi desconocimiento de javascript.

En las funciones success y error, ¿que es la variable data?

¿Como puedo pasar el contenido de esas variables a mis variables locales XHR_SALIDA y XHR_STATUS?

Un saludo


([N4] gontorre) #8

Hola a todos

Sigo enganchado con este tema que me tiene desesperado.

He hecho pruebas con SoapUI y consigo que me responda el ws correctamente. La petición que me genera es:

POST http://webservice.xxxxx.net:8080/WEBSERVICE/getStock.php HTTP/1.1
Accept-Encoding: gzip,deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 45
Host: webservice.xxxxx.net:8080
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)

Así me responde {“stock”:72}

Si no se me escapa nada, esto sería equivalente a:

importClass("XMLHttpRequest");

var http = new XMLHttpRequest();
var url = "http://webservice.xxxxx.net:8080/WEBSERVICE/getStock.php";
var params = "Key=HUODEWHGFOLEW7HYTU29&codArticulo=A0002697";

http.open("POST", url, false);
http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
http.setRequestHeader("Content-Length", params.length)
http.send(params);

alert(http.responseText);

Pero el caso es que desde Velneo me responde siempre {“errorID”:-1,“errorTxt”:null}

Es como si no recibiera los parámetros correctamente.

Llevo toda la mañana buscando ejemplos por internet y según todo lo que leo me debería funcionar.

¿Alguna idea de por donde seguir?

Gracias


([N4] gontorre) #9

¡Aaaaaaargh!

Casi me da vergüenza decir dónde estaba el problema. Resulta que el primer parámetro es “key” en vez de “Key”.

Lo puse tal cual estaba en la documentación del WS y ni se me había ocurrido que pudiera ser eso. De hecho pensaba que las minúsculas y mayúsculas no influían en los nombres de las variables.

¡Para pegarse un tiro!


([N3] pacosatu) #10

Hola Gonzalo.

Me alegro que hayas resuelto el problema.
Esto confirma lo “endeble” que muchas veces es la informática, que a pesar de disponer de herramientas de última generación, un solo byte puede echar al traste todo un sistema. Al final siempre interviene el elemento humano y arregla lo que la máquina es incapaz de deducir, que la K debe ser una k.

No te peges un tiro, esto solo confirma que construir peticiones REST es simple y llanamente crear un String de puro texto, con una determinada estructura que llamamos REQUEST y que enviamos al servidor usando el protocolo HTTP.

Saludos
Paco Satué