我正在使用Swift for iOS开发一个应用程序,并使用Alamofire Framework对API进行HTTP(S)请求。我已经有了一个API"包装器"用PHP编写,效果很好,但现在我想用Swift做到这一点。
API需要一个nonce,我的API密钥和签名。签名以正确的方式计算,所有组件应该在请求正文中。
这里有几行PHP脚本:
// generating nonce and signature
$mt = explode(' ', microtime());
$req['nonce'] = $mt[1] . substr($mt[0], 2, 6);
$req['key'] = $key;
$req['signature'] = $this->get_signature($req['nonce']);
$post_data = http_build_query($req, '', '&');
static $ch = null;
if (is_null($ch))
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0");
}
curl_setopt($ch, CURLOPT_URL, 'https://example.org/api/');
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
这就像一个魅力。 Alamofire应该用更少的代码行完成这个,这就是我所拥有的:
let nonce = Int((Date().timeIntervalSince1970 * 1000.0).rounded())
if let signature = self.getSignature(nonce: nonce) {
var params = [String: Any]()
params["nonce"] = milliseconds
params["key"] = key
params["signature"] = signature
let headers = [ "Content-Type": "application/x-www-form-urlencoded", "User-Agent" : "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0" ]
Alamofire.request(url, method: .post, parameters: params, encoding: URLEncoding.httpBody, headers: headers).responseJSON(completionHandler: { (repsonse) in
// ...
})
}
但API 始终以明文形式返回POST Only Endpoint
。使用PHP,我得到了一个返回的JSON数组。
我尝试更改编码类型,添加了一些使用不同用户代理的自定义标头字段,将Content-Type
设置为application/x-www-form-urlencoded
但没有任何效果。
如果你知道这个问题的解决方案,请帮助我。
答案 0 :(得分:0)
OMG!我找到了问题的答案。
唯一的问题是网址末尾缺少/
。所以例如
https://example.org/api/endpoint1
没有工作,但是
https://example.org/api/endpoint1/
现在正在运作。所以它绝对与Alamofire本身无关。多么浪费时间......