通过 Twilio 传递 phone 输入

Passing phone input via Twilio

我正在使用 Java 和 Spark Java 框架开发一个基本的 Twilio Web 应用程序。我试图让用户在初始提示后通过 Gather 动词输入一个数字作为输入,然后处理该输入。到目前为止,我可以拨打我的 Twilio 号码,它会以初始提示进行响应,但在我输入一个号码后,它会转到 /handle-number 并崩溃,因为请求不包含任何参数并且找不到 "Digits" param(我打印的时候params是空的)

我试图通过 Postman Chrome 扩展模仿 API 调用来调试它,但我收到 500 内部服务器错误。

编辑:这是邮递员请求的屏幕截图:Postman screenshot

我是 Java 网络应用程序、HTTP 请求和 Twilio 的新手,所以我对其中的大部分都不熟悉。我已经考虑过 twiml 文档和教程并尝试跟进,但我的实现中肯定遗漏了一些东西。

如何正确地将 phone 输入传递给 processNumber 路由?感谢您的帮助!

App.java

import static spark.Spark.*;

public class App {
    public static void main (String[] args){
        post("/receive-call", ReceiveCall.call);
        post("/handle-number", ReceiveCall.processNumber);
    }
}

ReceiveCall.java

import com.twilio.twiml.voice.Gather;
import com.twilio.twiml.voice.Say;
import com.twilio.twiml.*;
import spark.Route;

public class ReceiveCall {

    public static Route call = (request, response) -> {    
        Say sayMessage = new Say.Builder("Hello! Please enter a number as input. Enter # when finished.").build();
        Gather input = new Gather.Builder().timeout(3).say(sayMessage).action("/handle-number").build();
        VoiceResponse twiml = new VoiceResponse.Builder().gather(input).build();

        System.out.println(response.body());

        return twiml.toXml();
        };

    public static Route processNumber = ((request, response) -> {    
        String digit = request.params("Digits");

        //CRASHES HERE BECAUSE digit IS NULL
        int number = Integer.parseInt(digit);

        Say message = process(number);
        VoiceResponse twiml = new VoiceResponse.Builder().say(message).build();
        return twiml.toXml();
    });

"digit IS NULL"的原因是:您正在使用request.params(...),这是路径参数。

什么是"path parameter"?

"path parameter" 表示将参数作为 URL 路径的一部分传递,尤其是在 RESTful 样式请求中。

例如,如果您要发送 HTTP GET 请求以通过 ISBN 检索图书,请求 URL 可以是:/books/9787121022982/books/9787101054491,其中 ISBN参数作为 URL 路径(97871210229829787101054491)的一部分传递。在Spark框架中,对应的Route代码为:

get("/books/:isbn", (request, response) -> {
    return "Book ISBN is: " + request.params(":isbn");
});

什么是"query parameter"?

"query parameter" 表示将参数作为 URL 查询的一部分传递(URL 中 ? 字符之后的实体)。

以前面一本书的ISBN案例为例,如果你想传递ISBN作为查询参数,那么HTTP GET URL就是:/books?isbn=9787121022982,对应的Spark Route代码是:

get("/books", (request, response) -> {
    return "Book ISBN is: " + request.queryParams("isbn");
});

在 POST 请求中传递数据的最佳做法是什么?

在您的情况下,/handle-number 路由接受 POST 请求。对于 HTTP POST 请求,在 URL 中将数据作为参数传递不是一个好习惯。相反,您需要将数据作为请求主体传递,并在 Spark 代码中从主体获取数据:

post("/handle-number", (request, response) -> {
    String body = request.body();
    // extract ISBN from request body string
});