从Dialogflow中的实现发出HTTP POST请求

时间:2018-09-28 12:09:18

标签: dialogflow

我正在编写用于生成PDF的处理程序。该API接受带有JSON数据的POST请求,并返回到生成的PDF的链接。该意图触发此代码,但答案未添加到代理中。请求是否可能不会转发到目的地?该API似乎未收到任何请求。知道如何解决这个问题吗?

function fillDocument(agent) {
    const name = agent.parameters.name;
    const address = agent.parameters.newaddress;
    const doctype = agent.parameters.doctype;

    var XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;
    var xhr = new XMLHttpRequest();
    var url = "https://us1.pdfgeneratorapi.com/api/v3/templates/36628/output?format=pdf&output=url";
    xhr.open("POST", url, true);
    xhr.setRequestHeader("X-Auth-Key", "...");
    xhr.setRequestHeader("X-Auth-Secret", "...");
    xhr.setRequestHeader("X-Auth-Workspace", "...");
    xhr.setRequestHeader("Content-Type", "application/json");
    xhr.setRequestHeader("Accept", "application/json");
    xhr.setRequestHeader("Cache-Control", "no-cache");
    xhr.onreadystatechange = function () {
        if (xhr.readyState === 4 && xhr.status === 200) {
            var json = JSON.parse(xhr.responseText);
            agent.add(json.response);
        }
    };
    var data = JSON.stringify({...});
    xhr.send(data);
}

编辑:我继续在GCP中设置一个结算帐户,现在该呼叫可以正常使用了,但是它是异步的。如果我通过执行以下操作将其更改为syn:

xhr.open("POST", url, false);

我收到以下错误:

EROFS: read-only file system, open '.node-xmlhttprequest-sync-2'

我需要使其异步,因为我的机器人应发送的响应取决于API的响应。关于如何解决这个问题的任何想法?

1 个答案:

答案 0 :(得分:2)

如果要进行异步调用,则处理程序函数需要返回Promise。否则,处理程序调度程序将不知道存在异步调用,并且将在函数返回后立即结束。

将诺言用于网络调用的最简单方法是使用诸如request-promise-native之类的软件包。使用此代码,您的代码可能类似于:

var options = {
  uri: url,
  method: 'POST',
  json: true,
  headers: { ... }
};
return rp(options)
  .then( body => {
    var val = body.someParameter;
    var msg = `The value is ${val}`;
    agent.add( msg );
  });

如果您真的想继续使用xhr,则需要将其包装在Promise中。可能类似

return new Promise( (resolve,reject) => {

  var XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;
  // ... other XMLHttpRequest setup here
  xhr.onreadystatechange = function () {
    if (xhr.readyState === 4 && xhr.status === 200) {
      var json = JSON.parse(xhr.responseText);
      agent.add(json.response);
      resolve();
    }
  };

});