He visto esta pregunta varias veces aquí, pero nunca con el carácter ".
Para aclarar, este no es mi código que está generando el error, esto es lo que obtengo de una API.
Mi primer intento:
Uso https://reqbin.com/ y la solicitud funciona perfectamente ( lo que hice )
Mi segundo intento:
Decido mover esto para que se ejecute mediante programación para usarlo en el desarrollo.
En ios hay una aplicación llamada scriptable que te permite ejecutar javascript
documentos para su objeto de solicitud
yo uso el codigo
let req = new Request("https://support.readaloud.app/ttstool/createParts"); req.method = "post"; req.headers = {"Content-Type": "application/json" }; var data = '[{"voiceId":"Amazon British English (Brian)","ssml":"<speak version=\"1.0\" xml:lang=\"en-GB\">' + "Hello" + '</speak>"}]'; req.body = JSON.stringify(data); let res = await req.loadString(); Donde res debería responder con ["id"] como reqbin
Lamentablemente no lo hace y vuelve
SyntaxError: Unexpected token " in JSON at position 0 at JSON.parse (<anonymous>) at createStrictSyntaxError (/home/ec2-user/readaloud/webservices/node_modules/body-parser/lib/types/json.js:160:10) at parse (/home/ec2-user/readaloud/webservices/node_modules/body-parser/lib/types/json.js:83:15) at /home/ec2-user/readaloud/webservices/node_modules/body-parser/lib/read.js:128:18 at AsyncResource.runInAsyncScope (node:async_hooks:201:9) at invokeCallback (/home/ec2-user/readaloud/webservices/node_modules/raw-body/index.js:231:16) at done (/home/ec2-user/readaloud/webservices/node_modules/raw-body/index.js:220:7) at IncomingMessage.onEnd (/home/ec2-user/readaloud/webservices/node_modules/raw-body/index.js:280:7) at IncomingMessage.emit (node:events:538:35) at endReadableNT (node:internal/streams/readable:1345:12)Si puedes ayudar te lo agradecería mucho.
Gracias
El error se debe a que el analizador JSON está muy desactualizado y no es compatible con JSON, donde el tipo de datos de nivel superior es una cadena. (La especificación original para JSON solo permitía objetos y matrices, pero se cambió para permitir cualquier tipo de datos).
Sin embargo, no debería enviar un texto JSON donde el elemento de nivel superior es una cadena en primer lugar.
var data = '[{"voiceId":"Amazon British English (Brian)","ssml":"<speak version=\"1.0\" xml:lang=\"en-GB\">' + "Hello" + '</speak>"}]';
Aquí está construyendo manualmente una cadena de JSON (aunque tiene errores porque algunas comillas no se escapan correctamente).
req.body = JSON.stringify(data);
Y luego crea una cadena de JSON que representa la cadena anterior.
No hagas eso. Cree una estructura de datos de JavaScript regular (es decir, una matriz), no una cadena.
Luego, convierta la matriz a JSON con JSON.stringify .
También recomiendo aplicar los mismos principios a la creación de XML (es decir, no mezclar cadenas).
const doc = document.implementation.createDocument(null, "speak"); const speak = doc.documentElement; speak.setAttribute("version", "1.0"); speak.setAttribute("xml:lang", "en-GB"); speak.appendChild(doc.createTextNode("Hello")); const xml = new XMLSerializer().serializeToString(speak); const data = [{ voiceId: "Amazon British English (Brian)", ssml: xml }]; const json = JSON.stringify(data); console.log(json);intente establecer la variable sin comillas y arréglela un poco para que quede así
var data = [{"voiceId":"Amazon British English (Brian)","ssml":"<speak version=\"1.0\" xml:lang=\"en-GB\">Hello</speak>" }];let req = new Request("https://support.readaloud.app/ttstool/createParts"); req.method = "POST"; req.headers = {"Content-Type": "application/json" }; var data = [ { "voiceId":"Amazon British English (Brian)", "ssml":"<speak version=\"1.0\" xml:lang=\"en-GB\">" + "Hello" + "</speak>" }] req.body = JSON.stringify(data); let res = await req.loadString(); console.log(res);