我正在为学校创建一个需要发送短信的Android应用程序。我有几个人推荐的twilio,所以我决定坚持下去。遵循本教程:https://www.twilio.com/blog/2016/05/how-to-send-an-sms-from-android.html,使用我自己的Android应用程序,其中包括我在调用帖子时获得404(通过ngrok看到)。我完全失去了,仍然是android新手。后端通过intellij给出以下消息: 8810 [qtp649044888-15] INFO spark.http.matching.MatcherFilter - 请求的路由[/]尚未映射到Spark接受:[null]
帐户ID,地址,电话号码等已替换为x&#39 后端:
//Heroku assigns different port each time, hence reading it from process.
ProcessBuilder process = new ProcessBuilder();
Integer port;
if (process.environment().get("PORT") != null) {
port = Integer.parseInt(process.environment().get("PORT"));
} else {
port = 4567;
}
Spark.port(port);
get("/", (req, res) -> "Hello, World");
TwilioRestClient client = new TwilioRestClient.Builder(System.getenv("ACxxxxxxx72279fb226f0dd162c869ce1e"), System.getenv("xxxxxxxc324a89155b93b5af26393297")).build();
post("/sms", (req, res) -> {
String body = req.queryParams("Body");
String to = req.queryParams("To");
String from = System.getenv("216450xxxx");
Message message = new MessageCreator(
new PhoneNumber(to),
new PhoneNumber(from),
body).create(client);
return message.getSid();
});
应用方法
Call post(String url, Callback callback) throws IOException {
RequestBody formBody = new FormBody.Builder().add("To", "609420xxxx").add("Body", "TEST").build();
Request request = new Request.Builder().url(url).post(formBody).build();
Call response = mClient.newCall(request);
response.enqueue(callback);
Log.d("CALL: ", response.toString()+ " " + callback.toString());
return response;
}
按钮上的App post方法:
emailButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
post("http://xxxxxxxx.ngrok.io", new Callback(){
@Override
public void onFailure(Call call, IOException e) {
e.printStackTrace();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(),"SMS Sent!",Toast.LENGTH_SHORT).show();
}
});
}
});
} catch (IOException e) {
e.printStackTrace();
}
}
});
这应该发送一个文本到我的号码(在twilio帐户上验证),但我什么都没得到。吐司似乎表示文本已发送。
答案 0 :(得分:1)
查看spark source code for MatcherFilter,当未设置正文时,将引发您获得的错误的唯一引用
if (body.notSet()) {
LOG.info("The requested route [{}] has not been mapped in Spark for {}: [{}]",
uri, ACCEPT_TYPE_REQUEST_MIME_HEADER, acceptType);
查看您链接到的Twilio tutorial(假设您提供的代码正是您正在使用的代码),您似乎已更改代码以将变量硬编码为类和方法。
我对Android的编码知之甚少,但我可以告诉你,教程中的这一行引用了包含Twilio帐户SID的项目中的环境变量
(System.getenv("TWILIO_ACCOUNT_SID")
现在这是你的版本:
(System.getenv("ACxxxxxxx72279fb226f0dd162c869ce1e")
环境变量是一个设置一次的变量,通常位于包含所有其他环境变量的文件中,并且特定于运行代码的用户或系统。这些允许开发人员轻松更改用户或系统特定的变量值,即使他们已在项目中多次引用这些变量。
您正在尝试引用环境变量,但随后提供您要使用的值。它不会那样工作。
这是按钮方法上的应用帖子:
post("http://xxxxxxxx.ngrok.io", new Callback(){
这是Twilio的:
post(mContext.getString("YOUR_NGROK_URL/sms"), new Callback(){
您的硬编码网址会删除对mContext
变量的引用,我不知道这是否重要,但您忽略的另一件事是您需要在网址末尾添加/sms
我的建议,看到刚开始使用Android时,现在就要按照教程进行操作。看起来你可以节省时间来削减一些角落并在这里和那里改变几个点,但是当它不起作用时你没有经验去理解什么是错误。
切角,硬编码变量等是一个不好的习惯。我们都做到了,后来我们都后悔了。正确学习,正确编码,添加解释代码的评论,您将为自己节省无数个未来的挫折时间。