Được giới thiệu vào iOS 8 và OS X 10.10 là NSURLQueryItem
, có thể được dùng để xây dựng các truy vấn. Từ tài liệu trên NSURLQueryItem:
Đối tượng NSURLQueryItem đại diện cho một cặp tên/giá trị cho một mục trong phần truy vấn của URL. Bạn sử dụng các mục truy vấn với thuộc tính queryItems của một đối tượng NSURLComponents.
Bạn có thể lấy các mục truy vấn từ một URL bằng cách đầu tiên tạo NSURLComponents
:
NSURL *url = [NSURL URLWithString:@"http://stackoverflow.com?q=ios&count=10"];
NSURLComponents *components = [NSURLComponents componentsWithURL:url
resolvingAgainstBaseURL:YES];
for (NSURLQueryItem *item in components.queryItems) {
NSLog(@"name: %@, value: %@", item.name, item.value);
}
// name: q, value: ios
// name: count, value: 10
Lưu ý rằng họ trở về giá trị so với -queryItems
là một mảng, không phải là một từ điển. Điều này là do sau đây là một URL hợp lệ. Lưu ý hai "khóa" giống hệt nhau, foo
.
http://google.com?foo=bar&foo=baz
Để tạo một URL nào qua tin truy vấn, sử dụng initializer định queryItemWithName:value:
và sau đó thêm chúng vào NSURLComponents
để tạo ra một NSURL
. Ví dụ:
NSString *urlString = @"http://stackoverflow.com";
NSURLComponents *components = [NSURLComponents componentsWithString:urlString];
NSURLQueryItem *search = [NSURLQueryItem queryItemWithName:@"q" value:@"ios"];
NSURLQueryItem *count = [NSURLQueryItem queryItemWithName:@"count" value:@"10"];
components.queryItems = @[ search, count ];
NSURL *url = components.URL; // http://stackoverflow.com?q=ios&count=10
Lưu ý rằng dấu hỏi và ký tự được xử lý tự động. Tạo một NSURL
từ một cuốn từ điển các thông số đơn giản như:
NSDictionary *queryDictionary = @{ @"q": @"ios", @"count": @"10" };
NSMutableArray *queryItems = [NSMutableArray array];
for (NSString *key in queryDictionary) {
NSURLQueryItem *item = [NSURLQueryItem queryItemWithName:key
value:queryDictionary[key]];
[queryItems addObject:item];
}
components.queryItems = queryItems;
Tôi cũng đã viết một bài đăng blog với nhiều chi tiết, Building NSURLs with NSURLQueryItems.
Câu hỏi hay. Bạn có nghĩa là: Nếu URL là "/ partA/partB/partC", bạn muốn "0 => partA, 1 => partB, 2 => partC". Nếu URL là "/ foo? PartA = A & partB = B" bạn muốn "partA => A, partB => B". Nếu URL là "/ partA/partB/partC? Foo = bar & ooga = booga" thì sao? Trong một ví dụ, thông tin quan trọng cần thiết để xác định thực thể được đề cập đang được chuyển trong chuỗi truy vấn ... trong ví dụ khác, thông tin nhận dạng được chuyển theo kiểu còn lại trong chính đường dẫn. –
Tôi muốn phân tích đường dẫn và truy vấn một cách riêng biệt. Nó không nên là một hàm kết hợp hai nhiệm vụ đó. Xem mã tôi đã đăng bên dưới để làm rõ. Nếu ai đó trả lời với một triển khai hiện tại, tôi sẽ rất vui khi vẫn chấp nhận điều đó. – DougW
Một điều cần lưu ý là đây là chuỗi truy vấn hoàn toàn hợp lệ: "x = 1 & x = 0 & x = foo", vì vậy một NSDictionary có thể không phải là biểu diễn tốt nhất (trừ khi bạn đang sử dụng mảng làm giá trị). – n8gray