我正在为我的基于react本机的移动应用程序创建OTP类型的注册。通过使用谷歌云功能生成otp并向我的短信提供商发布http请求。
我面临的问题是,每当我试图用${code}
将随机代码添加到我的短信提供商url时,消息只显示相同的${code}
,而不是随机生成的代码。
换句话说,我不知道如何将代码插入到我的url中(因为我是一个新手)。
这是我的随机数代码:
const code = Math.floor((Math.random() * 8999 + 1000));
我使用请求包的请求如下:
const options = {
method: 'POST',
uri: 'http://smsprovider.com/numbers=${numbers}&route=2&message=Your OTP is ${code}',
body: {
numbers: phone,
code: code
},
json: true
};
所以,每当我收到消息时,它都会显示Your OTP is ${code}
。但我实际需要的是显示math.floor函数生成的随机数。预期"您的OTP为5748">
请指导
对于使用JavaScript的字符串插值,请确保使用
`
字符而不是
'
试试这个:
const options = {
method: 'POST',
uri: `http://smsprovider.com/numbers=${numbers}&route=2&message=Your OTP is ${code}`,
body: {
numbers: phone,
code: code
},
json: true
};
字符串插值和url编码是两种不同的范式,一种不能取代另一种。
-
字符串插值允许您使用
${}
将变量的内容动态插入到字符串中。为了实现这一点,您必须按照@Ben Beck的指示将字符串括在后引号之间。有些解释器会宽容,这意味着即使你使用单引号,解释器也会用插值来解析字符串,但并不是所有的解释器都这样做,依赖它是不好的做法。确保你正确格式化这些字符串。 -
url组件编码将包含特殊字符的url参数转换为具有
encodeURIComponent()
的有效uri组件。这就是你去掉空格和其他特殊字符的方法,但这里可能不需要它,因为大多数浏览器都是这样做的。当然可以使用Chrome,但同样,编写完全可移植的代码是一种很好的做法,我建议对任何具有特殊字符的参数进行编码。
Postman测试失败的事实很可能是由于错误的请求。根据您的案例,利用请求前脚本,查看此屏幕截图以获取正在工作的Postman POST请求。
在直接(而不是通过Postman)使用代码进行测试时,如果您一直使用文本${code}
来代替实际值,则可能意味着定义const code = Math.floor((Math.random() * 8999 + 1000))
与插值调用不在同一范围内。请查看下面的示例,了解基于您的情况使用字符串插值和url编码的工作脚本:
const request = require('request');
const code = Math.floor((Math.random() * 8999 + 1000));
var p1 = encodeURIComponent(`Your OTP is ${code}`);
var uri = `http://smsprovider.com/?message=${p1}`;
const options = {
method: 'POST',
url: uri,
json: true
};
function callback(error, response, body) {
if (!error && response.statusCode == 200) {
console.log(body);
}
else {
console.log(error);
}
}
request(options, callback);
相同,但没有url编码,并且在body元素中嵌入了message
参数:
var uri = `http://smsprovider.com/`;
const options = {
method: 'POST',
url: uri,
body: {
message: `Your OTP is ${code}`,
},
json: true
};