2017-06-18 76 views
0

我在这里遇到一个奇怪的问题。NSData dataWithContentsOfUrl需要javascript

这是我第一次制作一个数据库,编写PHP并从ios应用程序(Objective c)中提取输出。我正在快速地学习一个教程,然后我成功翻译了代码。

我创建了一个包含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

您的网页有两个问题。

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

尝试清除本网站的所有cookie,然后关闭JavaScript,然后重试。你会看到它不起作用。你需要做的是找出javascript如何生成或请求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() 

的Objective-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];