如何从 iOS 中的 url 请求中提取数据
How to extract Data from url request in iOS
我正在编写一个扫描条形码的应用程序,然后查询 Outpan.com 以便从条形码编号中获取信息。
如何从 url 请求中提取信息?
以下是成功扫描后的输出示例。
例如,我如何将名称存储到 NSString 中?
这是我用来访问信息的代码。
- (void) sendRequest {
NSString *myString = @"https://api.outpan.com/v2/products/";
NSString *secondhalf= _barcode;
NSString *thirdHalf = @"?apikey=935b8b8e102f93220b751a4e1c66126a";
NSString *test = [myString stringByAppendingString:secondhalf];
NSString *text = [test stringByAppendingString:thirdHalf];
if (![text isEqualToString:@""]) {
NSURL *url = [NSURL URLWithString:text];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
[self.webView loadRequest:request];
}
}
通常我会尝试使用类似
的东西
NSString* value = [webView stringByEvaluatingJavaScriptFromString:@"document.getElementById('myId').value"];
如果 html 看起来像这样
<html>
<body>
<input id="myId" type="text" value="TextValue"/>
</body>
</html>
但是html是这样的
<html><head></head><body><pre style="word-wrap: break-word; white-space: pre- wrap;">{
"gtin": "0014633156720",
"outpan_url": "https:\/\/www.outpan.com\/view_product.php? barcode=0014633156720",
"name": "Battlefield: Bad Company 2",
"attributes": {
"Distribution Media\/Method": "Blu-ray Disc",
"ESRB Rating": "RP (Rating Pending)",
"Manufacturer": "Electronic Arts",
"Manufacturer Part Number": "15672",
"Platform": "PlayStation 3",
"Platform Supported": "PlayStation 3",
"Software Main Type": "Game",
"Software Sub Type": "First Person Shooter"
},
"images": [],
"videos": [],
"categories": []
}</pre></body></html>
问题是您正在尝试使用 UIWebView 发出 api 请求。 api 可能会将您的 Accepts header 视为 text/html,因此会在网页中向您发送 api 响应,而不仅仅是原始的 JSON。尝试使用 NSURLSession 发出请求。
- (void)sendRequest:(id)sender {
NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfig delegate:nil delegateQueue:nil];
NSString *urlString = [NSString stringWithFormat: @"https://api.outpan.com/v2/products/%@", _barcode];
NSURL *url = [NSURL URLWithString: urlString];
NSURLComponents *components = [[NSURLComponents alloc] initWithURL: url resolvingAgainstBaseURL: NO];
NSURLQueryItem *query = [[NSURLQueryItem alloc] initWithName: @"apikey" value: @"935b8b8e102f93220b751a4e1c66126a"];
components.queryItems = @[query];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL: components.URL];
request.HTTPMethod = @"GET";
NSURLSessionDataTask* task = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (error == nil) {
NSDictionary *responseBody = [NSJSONSerialization JSONObjectWithData: data options: 0 error: nil];
NSLog(@"got response: %@", responseBody);
} else {
// Failure
NSLog(@"URL Session Task Failed: %@", [error localizedDescription]);
}
}];
[task resume];
}
未测试,因为我没有真正的条形码,但您应该在 responseBody
字典中看到您请求的 JSON。
我正在编写一个扫描条形码的应用程序,然后查询 Outpan.com 以便从条形码编号中获取信息。 如何从 url 请求中提取信息? 以下是成功扫描后的输出示例。 例如,我如何将名称存储到 NSString 中?
这是我用来访问信息的代码。
- (void) sendRequest {
NSString *myString = @"https://api.outpan.com/v2/products/";
NSString *secondhalf= _barcode;
NSString *thirdHalf = @"?apikey=935b8b8e102f93220b751a4e1c66126a";
NSString *test = [myString stringByAppendingString:secondhalf];
NSString *text = [test stringByAppendingString:thirdHalf];
if (![text isEqualToString:@""]) {
NSURL *url = [NSURL URLWithString:text];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
[self.webView loadRequest:request];
}
}
通常我会尝试使用类似
的东西 NSString* value = [webView stringByEvaluatingJavaScriptFromString:@"document.getElementById('myId').value"];
如果 html 看起来像这样
<html>
<body>
<input id="myId" type="text" value="TextValue"/>
</body>
</html>
但是html是这样的
<html><head></head><body><pre style="word-wrap: break-word; white-space: pre- wrap;">{
"gtin": "0014633156720",
"outpan_url": "https:\/\/www.outpan.com\/view_product.php? barcode=0014633156720",
"name": "Battlefield: Bad Company 2",
"attributes": {
"Distribution Media\/Method": "Blu-ray Disc",
"ESRB Rating": "RP (Rating Pending)",
"Manufacturer": "Electronic Arts",
"Manufacturer Part Number": "15672",
"Platform": "PlayStation 3",
"Platform Supported": "PlayStation 3",
"Software Main Type": "Game",
"Software Sub Type": "First Person Shooter"
},
"images": [],
"videos": [],
"categories": []
}</pre></body></html>
问题是您正在尝试使用 UIWebView 发出 api 请求。 api 可能会将您的 Accepts header 视为 text/html,因此会在网页中向您发送 api 响应,而不仅仅是原始的 JSON。尝试使用 NSURLSession 发出请求。
- (void)sendRequest:(id)sender {
NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfig delegate:nil delegateQueue:nil];
NSString *urlString = [NSString stringWithFormat: @"https://api.outpan.com/v2/products/%@", _barcode];
NSURL *url = [NSURL URLWithString: urlString];
NSURLComponents *components = [[NSURLComponents alloc] initWithURL: url resolvingAgainstBaseURL: NO];
NSURLQueryItem *query = [[NSURLQueryItem alloc] initWithName: @"apikey" value: @"935b8b8e102f93220b751a4e1c66126a"];
components.queryItems = @[query];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL: components.URL];
request.HTTPMethod = @"GET";
NSURLSessionDataTask* task = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (error == nil) {
NSDictionary *responseBody = [NSJSONSerialization JSONObjectWithData: data options: 0 error: nil];
NSLog(@"got response: %@", responseBody);
} else {
// Failure
NSLog(@"URL Session Task Failed: %@", [error localizedDescription]);
}
}];
[task resume];
}
未测试,因为我没有真正的条形码,但您应该在 responseBody
字典中看到您请求的 JSON。