Alamofire POST请求数据

时间:2017-11-23 16:49:19

标签: php ios swift https alamofire

我正在使用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但没有任何效果。

如果你知道这个问题的解决方案,请帮助我。

1 个答案:

答案 0 :(得分:0)

OMG!我找到了问题的答案。

唯一的问题是网址末尾缺少/。所以例如

https://example.org/api/endpoint1

没有工作,但是

https://example.org/api/endpoint1/

现在正在运作。所以它绝对与Alamofire本身无关。多么浪费时间......