想要在Twilio Studio中链接web请求并通过它们传递数据



所以我正在玩Twilio Studio,并构建一个示例IVR。我让它向API发出web请求,该API根据客户的电话号码查找客户。这行得通,我可以叫/说出他们的名字。

下一步我遇到了问题,我想做另一个http请求,并将我在webrequest1中得到的"customer_id"传递给webrequest2,但看起来所有的web请求都在调用开始时立即启动,而不是按顺序/序列化。

它看起来有点像这样;

  • 调用进入,发出http请求以查找客户(我得到他们的customer_id和名称(
  • 如果存在客户名称,则在内容上进行拆分(事实上,它沿着这个决策路径进行(
  • 对"get_open_invoice_count"执行另一个http请求,但该请求需要customer_id,而不是他们的电话号码

通过查看日志,它总是有一个空白值,即使在上面的"说"步骤中,我可以说出他们的customer_id和名称。

我几乎可以想象有人会说我应该去使用一个函数,但由于某种原因,我无法获得一个简单的函数来执行(got(get请求。

我试图将其复制/粘贴到一个函数中,但我认为这个示例不完整:https://support.twilio.com/hc/en-us/articles/115007737928-Getting-Started-with-Twilio-Functions-Beta-

var got = require('got');
got('https://swapi.co/api/people/?search=r2', {json: true})
.then(function(response) {
console.log(response)
twiml.message(response.body.results[0].url)
callback(null, twiml);
})
.catch(function(error) {
callback(error)
})

如果这是正确的方法,我希望看到其中一个^示例,它返回可以在流的其余部分中使用的json。我是否遗漏了执行模型的某些内容?我希望它能随着人们在工作室中的流动而一步一步地执行,但我想知道它是否会在启动时执行整个过程?

也许问这个问题的另一种方式是;如果我想做IVR-如果我知道你是谁,我会把你送上这条路,如果我知道谁,我想查找一些账户详细信息,告诉你,并给你不同于陌生人的选择。----你是怎么做到的?

您说得对——文档中的代码摘录只是演示如何使用got包的一部分。

在完整的Twilio无服务器功能的上下文中,同样的用法可能看起来像这样:

exports.handler = function(context, event, callback) {
var twiml = new Twilio.twiml.MessagingResponse();
var got = require('got');
got('https://example.com/api/people/?search=r2', { json: true })
.then(function(response) {
console.log(response);
twiml.message(response.body.results[0].url);
callback(null, twiml);
})
.catch(function(error) {
callback(error);
});
};

然而,问题的另一部分是,当在Twilio Runtime上构建应用程序时,本文档中的建议对于函数来说是完全合理的,但在从Studio Flow上下文调用这些函数时,有几个未说明的注意事项。以下是一些相关文档:https://support.twilio.com/hc/en-us/articles/360019580493-Using-Twilio-Functions-to-Enhance-Studio-Voice-Calls-with-Custom-TwiML

如果您直接从入站号码调用该函数,则该函数是可以接受的,但当您在Studio流中使用function小部件返回TwiML时,Studio会释放对调用的控制。

如果您想调用从流返回TwiML的外部逻辑,并希望稍后返回到该流,则需要使用TwiMLRedirect小部件(有关详细信息,请参阅"将控件返回到Studio"(。

然而,当调用外部逻辑时,您不必将TwiML返回到Studio!听起来你想打一个外部电话来获得一些信息,然后让你的Flow根据这些信息将电话引导到一个或另一个路径。使用运行时函数时,只需让函数返回一个对象而不是twiml,然后您就可以在流中访问该对象的属性作为液体变量,如{{widgets.MY_WIDGET_NAME.parsed.PROPERTY_NAME}}。有关更多信息,请参阅Run Function小部件的文档。然后,您将使用";根据…拆分;小部件跟随流中的函数,将调用指向所需的分支。

这里要提到的另一件事是MakeHTTPRequest小部件。如果您的Runtime Function只是包装对另一个web服务的调用,那么您可能只需要使用小部件直接调用该服务就可以了。当服务在您的控制下时,这种方法效果最好,因为这样您就可以确保返回的数据的格式对小部件可用。

最新更新