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).
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);
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.
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.
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.