0

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

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

编辑:这是邮递员请求的截图:邮递员截图

我是 Java Web 应用程序、HTTP 请求和 Twilio 的新手,所以我不熟悉其中的大部分内容。我已经考虑了 twiml 文档和教程,并尝试继续学习,但我的实现中肯定遗漏了一些东西。

如何正确地将电话输入传递给 processNumber 路由?任何帮助表示赞赏!

应用程序.java

import static spark.Spark.*;

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

接收呼叫.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();
    });
4

1 回答 1

0

“digit IS NULL”的原因是:您使用request.params(...)的是路径参数。

什么是“路径参数”?

“路径参数”表示将参数作为 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");
});

什么是“查询参数”?

“查询参数”表示作为 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
});
于 2018-01-04T08:23:07.113 回答