BTURLUtils.m 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. #import "BTURLUtils.h"
  2. @implementation BTURLUtils
  3. + (NSString *)queryStringWithDictionary:(NSDictionary *)dict {
  4. NSMutableString *queryString = [NSMutableString string];
  5. for (id key in dict) {
  6. NSString *encodedKey = [self stringByURLEncodingAllCharactersInString:[key description]];
  7. id value = [dict objectForKey:key];
  8. if([value isKindOfClass:[NSArray class]]) {
  9. for(id obj in value) {
  10. [queryString appendFormat:@"%@%%5B%%5D=%@&",
  11. encodedKey,
  12. [self stringByURLEncodingAllCharactersInString:[obj description]]
  13. ];
  14. }
  15. } else if([value isKindOfClass:[NSDictionary class]]) {
  16. for(id subkey in value) {
  17. [queryString appendFormat:@"%@%%5B%@%%5D=%@&",
  18. encodedKey,
  19. [self stringByURLEncodingAllCharactersInString:[subkey description]],
  20. [self stringByURLEncodingAllCharactersInString:[[value objectForKey:subkey] description]]
  21. ];
  22. }
  23. } else if([value isKindOfClass:[NSNull class]]) {
  24. [queryString appendFormat:@"%@=&", encodedKey];
  25. } else {
  26. [queryString appendFormat:@"%@=%@&",
  27. encodedKey,
  28. [self stringByURLEncodingAllCharactersInString:[value description]]
  29. ];
  30. }
  31. }
  32. if([queryString length] > 0) {
  33. [queryString deleteCharactersInRange:NSMakeRange([queryString length] - 1, 1)]; // remove trailing &
  34. }
  35. return queryString;
  36. }
  37. + (NSDictionary<NSString *, NSString *> *)queryParametersForURL:(NSURL *)url {
  38. NSURLComponents *components = [NSURLComponents componentsWithURL:url resolvingAgainstBaseURL:YES];
  39. NSMutableDictionary *parameters = [NSMutableDictionary dictionary];
  40. for (NSURLQueryItem *queryItem in components.queryItems) {
  41. parameters[queryItem.name] = [queryItem.value stringByReplacingOccurrencesOfString:@"+" withString:@" "];
  42. }
  43. return [NSDictionary dictionaryWithDictionary:parameters];
  44. }
  45. + (NSString *)stringByURLEncodingAllCharactersInString:(NSString *)aString {
  46. // See Section 2.2. http://www.ietf.org/rfc/rfc2396.txt
  47. NSString *reservedCharacters = @";/?:@&=+$,";
  48. NSMutableCharacterSet *URLQueryPartAllowedCharacterSet = [[NSCharacterSet URLQueryAllowedCharacterSet] mutableCopy];
  49. [URLQueryPartAllowedCharacterSet removeCharactersInString:reservedCharacters];
  50. return [aString stringByAddingPercentEncodingWithAllowedCharacters:URLQueryPartAllowedCharacterSet];
  51. }
  52. @end