我正在使用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();
});
答案 0 :(得分:0)
"数字IS NULL"是:您正在使用request.params(...)
,这是路径参数。
什么是"路径参数"?
"路径参数"表示将参数作为URL路径的一部分传递,尤其是在RESTful样式请求中。
例如,如果您要发送HTTP GET请求以通过其ISBN检索图书,请求网址可以是:/books/9787121022982
或/books/9787101054491
,其中ISBN参数作为网址路径(9787121022982
和9787101054491
)。在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
});