Estoy haciendo una Parse.Cloud.httpRequest usando el método POST para recuperar un token de una API en una función de código en la nube de Back4App llamada 'retrieveToken'.
Parse.Cloud.define("retrieveToken", async(request) => { Parse.Cloud.httpRequest({ method: 'POST', url: 'https://.......', headers: { 'Content-Type': 'application/json;charset=utf-8' }, body: { "auth": { "identity": { "methods": [ "password" ], "password": { "user": { "name": "...", "password": "...", "domain": { "name": "..." } } } }, "scope": { "project": { "id": "..." } } } } }).then(function(httpResponse) { console.log('Token retrieved successfully, Status Code: ', httpResponse.status, ',\n', httpResponse.text); }, function(httpResponse) { console.error('Failed to retrieve token, retrieveToken: ', httpResponse.status, ',\n', httpResponse.text); }); }); Funciona bien si elimino "project": {"id": "..."} del 'alcance' del cuerpo JSON de httpRequest.
Sin embargo, me devuelve 'indefinido' si no elimino ese fragmento de código.
Tengo que mantener ese fragmento de código allí porque la API me devolverá un token de nivel de proyecto solo si especifico la identificación del proyecto. De lo contrario, obtendré un token de nivel global, que no se puede usar en mi caso.
La API funciona perfectamente con/sin la identificación del proyecto especificada en Postman.
Ya me he quedado aquí por un día entero y todavía no puedo resolverlo. ¿Dónde estoy haciendo mal y cómo puedo obtener la respuesta correcta de Parse.Cloud.httpRequest con la identificación del proyecto especificada?
Encontré que la longitud del contenido de las respuestas es bastante diferente con/sin la identificación del proyecto especificada usando Postman.
'content-length' = 6752 Bytes sin la identificación del proyecto especificada
'content-length' = 16896 Bytes con la identificación del proyecto especificada
¿Por casualidad el 'indefinido' fue causado por el límite de tamaño de respuesta? Si este es el motivo, ¿cómo puedo obtener la respuesta correcta? ¿Puedo recibir solo el encabezado?
Parte del problema ocurre porque no devuelve la respuesta http. Prueba esto:
Parse.Cloud.define("retrieveToken", (request) => { return Parse.Cloud.httpRequest({ method: 'POST', url: 'https://.......', headers: { 'Content-Type': 'application/json;charset=utf-8' }, body: { "auth": { "identity": { "methods": [ "password" ], "password": { "user": { "name": "...", "password": "...", "domain": { "name": "..." } } } }, "scope": { "project": { "id": "..." } } } } }).then(function(httpResponse) { console.log('Token retrieved successfully, Status Code: ', httpResponse.status, ',\n', httpResponse.text); return httpResponse; }, function(httpResponse) { console.error('Failed to retrieve token, retrieveToken: ', httpResponse.status, ',\n', httpResponse.text); return httpResponse; }); });Este problema se resolvió agregando una variable de entorno a mi servidor Back4App.
NODE_OPTIONS="--max-http-header-size=16384"Conocí el problema exacto (desbordamiento de encabezado) usando el siguiente código:
Parse.Cloud.define("retrieveToken", async(request) => { return Parse.Cloud.httpRequest({ method: 'POST', url: 'https://.......', headers: { 'Content-Type': 'application/json;charset=utf-8' }, body: { "auth": { "identity": { "methods": [ "password" ], "password": { "user": { "name": "...", "password": "...", "domain": { "name": "..." } } } }, "scope": { "project": { "id": "..." } } } } }); });Solo el código anterior me devolvió el error a continuación, y todos los demás códigos me devolvieron 'indefinido':
[Error]: Parse Error: Header overflow (Code: 141, Version: 1.19.2)FYI: estoy llamando a esta API
https://iam.ap-southeast-1.myhuaweicloud.com/v3/auth/tokens