通过Twilio传递电话输入

时间:2018-01-03 07:23:23

标签: java http twilio twiml spark-framework

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

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

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

我是Java Web应用程序,HTTP请求和Twilio的新手,因此我不熟悉其中的大部分内容。我已经想到了twiml文档和教程,并试图跟进,但我在实现中肯定遗漏了一些东西。

如何将手机输入正确传递到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();
    });

1 个答案:

答案 0 :(得分:0)

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

什么是"路径参数"?

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

例如,如果您要发送HTTP GET请求以通过其ISBN检索图书,请求网址可以是:/books/9787121022982/books/9787101054491,其中ISBN参数作为网址路径(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
});