[英]How do I get the api_version parameter from a request in node.js?
这是我在Swift中发送的请求:
func createCustomerKey(withAPIVersion apiVersion: String, completion: @escaping STPJSONResponseCompletionBlock) {
let url = self.baseURL.appendingPathComponent("ephemeral_keys")
let params: Parameters = [
"api_version":apiVersion,
"uid":Model.shared.uid
]
Alamofire.request(url, method: .post, parameters: params)
.validate(statusCode: 200..<300)
.responseJSON { responseJSON in
switch responseJSON.result {
case .success(let json):
completion(json as? [String: AnyObject], nil)
case .failure(let error):
completion(nil, error)
}
}
}
这是我要执行的云函数。 “ api_version”作为参数传递,但是api_version在firebase日志中未定义。 如何获得api_version? 我究竟做错了什么?
const functions = require('firebase-functions');
const admin = require('firebase-admin');
const stripe = require('stripe')("sk_test_...");
stripe.setApiVersion('2018-11-08');
admin.initializeApp(functions.config().firebase);
exports.ephemeral_keys = functions.https.onRequest((req, res) => {
const stripe_version = req.api_version;
if (!stripe_version) {
console.log('error with stripe version')
console.log(stripe_version)
res.status(400).end();
return;
}
const uid = req.params.uid;
const user = admin.firestore().collection('users').doc(uid);
console.log('Customer id ' + user.customerId);
stripe.ephemeralKeys.create(
{customer: user.customerId},
{stripe_version: stripe_version}
).then((key) => {
console.log('Ephemeral key ' + key);
res.status(200).json(key);
}).catch((err) => {
res.status(500).end();
});
});
我对Alamofire的了解不多,但是通过阅读和搜索google,您可以做的是:
选项1
最好的约定是使用类似于以下内容的URL发出您的请求:
http://server-host-name:<port>/someName/api_version/2.0/getDataApi
并在节点服务器端执行此操作:
exports.ephemeral_keys = functions.https.onRequest((req, res) => {
const stripe_version = req.query.api_version;
// Do what ever you want with it...
// ...
}
选项2
使用api_version作为查询字符串参数,因此在您的情况下,我认为您做错了,请在客户端代码中尝试以下操作:
let params: Parameters = [
"api_version":apiVersion,
"uid":Model.shared.uid
]
Alamofire.request(url, method: .post,
parameters: params,
encoding: URLEncoding(destination: .queryString))
这是为了告诉Alamofire将参数编码为查询字符串参数(有关此内容的更多信息,请阅读Stackoverflow文章 )
选项3
或将api版本放在自定义HTTP标头中,如下所示:
let headers: HTTPHeaders = [
"api_version": MY_API_KEY,
"Accept": "application/json"
]
Alamofire.request(yourURL, headers: headers)
.responseJSON { response in
debugPrint(response)
}
并尝试像这样在节点服务器端吸引它:
const stripe_version = req.headers.api_version;
顺便说一句,我最好的选择是选项1(最好符合REST API约定)
(未经测试)检查并告诉我们这是否对您有用!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.