在获取请求中嵌套http发布请求

时间:2019-01-08 08:30:55

标签: javascript json

我想做的是从API端点获取数据并将其显示在表单的输入字段中,然后从输入字段捕获密码并将整个json发布到我的端点 我尝试嵌套HTTP请求,但get可以正常工作,但其中的post部分不能正常工作

这是我的代码

const http = new XMLHttpRequest();
http.open("GET", "http://localhost:3000/api/mqtt", true);
http.onreadystatechange = function () {
    if (http.readyState == 4 && http.status == 200) {
        console.log(http.responseText);
        var respond = JSON.parse(http.responseText);
        console.log("respond is" + respond);
        document.getElementById('broker-address').value = respond.ip;
        document.getElementById('broker-port').value = respond.port;
        document.getElementById('client-id').value = respond.client_id;
        document.getElementById('username').value = respond.username;
        document.getElementById('topic-prefix').value = respond.prefix;
        var param = document.getElementById('password').value;

        http.open("POST", "http://localhost:3000/api/mqtt");
        http.setRequestHeader("Content-Type", "application/json");

        var data = {    
            ip: respond.client_id,
            port: respond.port,
            client_id: respond.client_id,
            username: respond.username,
            password: param, // POST only
            prefix: respond.prefix
        };

        var json = JSON.stringify(data);
        http.send(json);
   }
}
http.send(); 

我得到的错误是

VM4287:1 Uncaught SyntaxError: Unexpected token O in JSON at position 0
    at JSON.parse (<anonymous>)
    at XMLHttpRequest.http.onreadystatechange 

我的GET响应看起来像这样

  {"ip":"arduinoClient",
"port":"1883",
"client_id":"arduinoClient",
"username":"user1",
"password":null,
"prefix":"gos-lan-test/fx4t/pwr/node/mr/mod-1/"}

我在这里做错什么了,还有更好的主意吗? 谢谢

1 个答案:

答案 0 :(得分:0)

我发现问题是因为Get请求运行两次,一次是为了获取第一个get响应,这是我在问题中发布的JSON的可解析文本,第二次是在发布请求之后返回了响应“ OK”,它不能被解析为json对象的字符串,将引发此错误 可以通过一个简单的if条件来解决问题,该条件可以防止如果response为“ OK”或将GET和POST请求分开进行解析