NSData dataWithContentsOfUrl需要javascript

时间:2017-06-18 15:12:45

标签: javascript php ios objective-c json

我在这里遇到了一个奇怪的问题。

这是我第一次创建数据库,编写PHP并从ios app(目标c)中提取输出。我在swift中遵循了一个教程,然后我成功地翻译了代码。

我创建了一个包含2列的示例数据表,使用PHP脚本查询它们并将其放在我的webroot目录中。路径为http://haiticonnect.epizy.com/GetVotes.php,当我将其粘贴到chrome中时,该页面会显示我的记录。 检查页面的源代码也可以提供这种精确的输出。

[{"id":"firstid","post_id":"1"},{"id":"secondid","post_id":"2"}]

我的问题在于我的客观c代码,当我尝试使用[NSData dataWithContentsOfUrl:myUrl]获取数据时,它总是到达一个页面,表明浏览器不支持javascript。所以从mac,我在safari中禁用javascript,粘贴网址,但它显示正确的页面。

有人可以解释为什么dataWithContentsOfUrl会看到javascript吗?

#define JSON_URL @"http://haiticonnect.epizy.com/GetVotes.php"
NSURL *blogURL = [NSURL URLWithString:JSON_URL];
NSData *jsonData = [NSData dataWithContentsOfURL:blogURL];
const unsigned char *ptr = [jsonData bytes];

for(int i=0; i<[jsonData length]; ++i) {
    unsigned char c = *ptr++;
    NSLog(@"char=%c hex=%x", c, c);
}

我使用此算法打印它找到的每个字符,但它只是一个字符串,表示我的浏览器不支持javascript。

1 个答案:

答案 0 :(得分:1)

您的网页存在2个问题。

  • 首先它并不适用于所有用户代理,因此您需要指定用户代理(这很容易)。
  • 其次它适用于cookie,这就是为什么你总是看到javascript页面的原因。第一次访问该页面时,javascript会以某种方式生成一个cookie,您的浏览器会在所有后续请求中发送此cookie(这就是为什么即使禁用了javascript它也会继续工作)。

尝试清除此网站的所有Cookie,然后禁用javascript,然后重试。你会发现它不起作用。您需要做的是找出javascript如何生成或请求cookie,然后自己生成或请求cookie,然后使用有效的用户代理和cookie发出请求。

获得cookie和有效的用户代理后,您可以尝试使用它:

夫特:

let requestURL = URL(string: "http://haiticonnect.epizy.com/GetVotes.php")!
var request = URLRequest(url: requestURL)
request.setValue("valid-user-agent", forHTTPHeaderField: "User-Agent")
request.setValue("cookieName=cookieValue", forHTTPHeaderField: "Cookie")

let task = URLSession.shared.dataTask(with: request) { (data: Data?, response: URLResponse?, error: Error?) in
    guard let data = data else {
        print("Request failed")
        return
    }
    // Handle JSON data here
    let jsonString = String(data: data, encoding: .utf8)
    print(jsonString)
}
task.resume()

目标-C:

NSURL *requestURL = [NSURL URLWithString:@"http://haiticonnect.epizy.com/GetVotes.php"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:requestURL];
[request setValue:@"valid-user-agent" forHTTPHeaderField:@"User-Agent"];
[request setValue:@"cookieName=cookieValue" forHTTPHeaderField:@"Cookie"];

NSURLSessionDataTask *task = [[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
    if (data == nil) {
        NSLog(@"Request failed");
        return;
    }
    // Handle JSON data here
    NSString *jsonString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
    NSLog(@"%@", jsonString);
}];
[task resume];