通过 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 路径(9787121022982
和 9787101054491
)的一部分传递。在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
});
我正在使用 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 路径(9787121022982
和 9787101054491
)的一部分传递。在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
});