当链接要求cookie在app中运行时该怎么办

时间:2017-03-03 19:41:44

标签: ios http cookies swift3

因此,当我发送没有任何cookie的请求时,我收到错误。 当尝试手动获取请求时(在浏览器中)我首先需要转到主页,该主页加载4个cookie,然后请求可以继续进行而不会出错。一些实验表明我只需要一个饼干。

这对我来说是全新的,欢迎任何有关如何实施这些内容的指南/指南。我知道这个问题很模糊,但我迷失在哪里开始寻找,并希望得到任何帮助

let url = URL(string: "homepage")
        var request = URLRequest(url: url!)
        let task = URLSession.shared.dataTask(with: request) { data, response, error in
            guard let data = data, error == nil, let httpResponse = response as? HTTPURLResponse, httpResponse.statusCode == 200 else {
                print("response1")
                print("error = \(error)")
                print("response = \(response)")
                return
            }
            if let json = try? JSONSerialization.jsonObject(with: data) {
                print("responseObject = \(json)")
            } else {
                print("response2")
                print("responseString = \(String(data: data, encoding: .utf8))")
            }

            let url2 = URL(string: "requestpage")
            var request = URLRequest(url: url2!)
            request.setValue("application/json", forHTTPHeaderField: "Accept")
            let task = URLSession.shared.dataTask(with: request) { data, response, error in
                guard let data = data, error == nil, let httpResponse = response as? HTTPURLResponse, httpResponse.statusCode == 200 else {
                    print("response2")
                    print("error = \(error)")
                    print("response = \(response)")
                    return
                }
                if let json = try? JSONSerialization.jsonObject(with: data) {
                    print("responseObject = \(json)")
                } else {
                    print("response2")
                    print("responseString = \(String(data: data, encoding: .utf8))")
                }
            }
            task.resume()
        }
        task.resume()

1 个答案:

答案 0 :(得分:0)

在您的代码中,您应该:

  • 为设置Cookie的目标网页启动URLSessionTask;
  • 您将无需干预就会在您的URLSession;
  • 中设置Cookie
  • 成功收到回复后,您可以发送下一个请求,并且cookie应该自动存在,不需要额外的代码。

除非您做了明确干预此过程的事情,否则URLSession会无缝接收Cookie并将其包含在后续请求中。

如果您正在抓取网站(如果是,请检查ToS以确保其被允许),建议您按照与网络浏览器相同的顺序请求网页。您可能觉得可以绕过该目标网页并自行设置Cookie,但通常会动态生成Cookie值,如果您尝试绕过该目标网页,则可能会遇到问题。

你问了一个例子,并没有多少表现出来。只需从完成第一个请求开始第二个请求。在Swift代码中没有对cookie的单一引用。 URLSession负责一切:

let url = baseURL.appendingPathComponent("setcookie.php")
var request = URLRequest(url: url)
let task = URLSession.shared.dataTask(with: request) { data, response, error in
    guard error == nil, let httpResponse = response as? HTTPURLResponse, httpResponse.statusCode == 200 else {
        print("error = \(error)")
        print("response = \(response)")
        return
    }

    let url = baseURL.appendingPathComponent("results.php")
    var request = URLRequest(url: url)
    request.setValue("application/json", forHTTPHeaderField: "Accept")
    let task = URLSession.shared.dataTask(with: request) { data, response, error in
        guard let data = data, error == nil, let httpResponse = response as? HTTPURLResponse, httpResponse.statusCode == 200 else {
            print("error = \(error)")
            print("response = \(response)")
            return
        }
        if let json = try? JSONSerialization.jsonObject(with: data) {
            print("responseObject = \(json)")
        } else {
            print("responseString = \(String(data: data, encoding: .utf8))")
        }
    }
    task.resume()
}
task.resume()

我的第一页setcookie,只是设置了一个Cookie:

<?php

setcookie("foo", "bar", time()+3600);

$result = array("success" => true);
echo json_encode($result);

?>

我的第二页检索了cookie:

<?php

$result = array("success" => true);
if (isset($_COOKIE))
    $result["_COOKIE"] = $_COOKIE;

header("Content-Type: application/json");
echo json_encode($result);

?>

以上的Swift代码输出:

responseObject = {
    "_COOKIE" =     {
        foo = bar;
    };
    success = 1;
}