Skip to content

Instantly share code, notes, and snippets.

@mwoods79
Created December 6, 2012 06:14
Show Gist options
  • Save mwoods79/4222165 to your computer and use it in GitHub Desktop.
Save mwoods79/4222165 to your computer and use it in GitHub Desktop.
I stole this from RestKit, and I am so happy! :)

So you have an NSDictionary that looks like this.

{
    anonymous = true;
    "attendee_id" = 5796;
    "briefing_id" = 616;
    comments = "More Cookies please!";
    data =     (
                {
            "agenda_id" = 1200;
            requested = true;
            "speaker_id" = 23;
            type = followup;
        },
                {
            "agenda_id" = 1200;
            "question_id" = "179_1200_23";
            stars = 5;
            text = "5 stars";
            type = question;
        },
                {
            "agenda_id" = 1200;
            "question_id" = "186_1200_23";
            stars = 5;
            text = "5 stars";
            type = question;
        },
                {
            "agenda_id" = 1200;
            "question_id" = "175_1200_23";
            stars = 5;
            text = "5 stars";
            type = question;
        },
                {
            "agenda_id" = 1200;
            "question_id" = "182_1200_23";
            stars = 5;
            text = "5 stars";
            type = question;
        },
                {
            "agenda_id" = 1195;
            "question_id" = "182_1195_33";
            stars = 3;
            text = "Angela Tucci";
            type = question;
        },
                {
            "agenda_id" = 1195;
            "question_id" = "179_1195_33";
            stars = 3;
            text = "Angela Tucci";
            type = question;
        },
                {
            "agenda_id" = 1195;
            "question_id" = "186_1195_33";
            stars = 3;
            text = "Angela Tucci";
            type = question;
        },
                {
            "agenda_id" = 1195;
            "question_id" = "175_1195_33";
            stars = 3;
            text = "Angela Tucci";
            type = question;
        },
                {
            "agenda_id" = 1196;
            "question_id" = "186_1196_32";
            stars = 3;
            text = Dale;
            type = question;
        },
                {
            "agenda_id" = 1196;
            "question_id" = "179_1196_32";
            stars = 3;
            text = Dale;
            type = question;
        },
                {
            "agenda_id" = 1196;
            "question_id" = "175_1196_32";
            stars = 3;
            text = Dale;
            type = question;
        },
                {
            "agenda_id" = 1196;
            "question_id" = "182_1196_32";
            stars = 3;
            text = Dale;
            type = question;
        },
                {
            "agenda_id" = 1203;
            "question_id" = "182_1203_93";
            stars = 3;
            text = Patricia;
            type = question;
        },
                {
            "agenda_id" = 1203;
            "question_id" = "179_1203_93";
            stars = 3;
            text = Patricia;
            type = question;
        },
                {
            "agenda_id" = 1203;
            "question_id" = "186_1203_93";
            stars = 3;
            text = Patricia;
            type = question;
        },
                {
            "agenda_id" = 1203;
            "question_id" = "175_1203_93";
            stars = 3;
            text = Patricia;
            type = question;
        },
                {
            "question_id" = 1;
            stars = 4;
            type = question;
        },
                {
            "question_id" = 16;
            text = "More Cookies please!";
            type = question;
        }
    );
}

And you want URL Parameterization the exact way jQuery defines it! But you don't have RestKit, or you are locked into an older version. [myNSDictionary URLEncodedString]

briefing_id=616&comments=More%20Cookies%20please%21&data[][type]=followup&data[][speaker_id]=23&data[][requested]=true&data[][agenda_id]=1200&data[][type]=question&data[][agenda_id]=1200&data[][stars]=5&data[][text]=5%20stars&data[][question_id]=179_1200_23&data[][type]=question&data[][agenda_id]=1200&data[][stars]=5&data[][text]=5%20stars&data[][question_id]=186_1200_23&data[][type]=question&data[][agenda_id]=1200&data[][stars]=5&data[][text]=5%20stars&data[][question_id]=175_1200_23&data[][type]=question&data[][agenda_id]=1200&data[][stars]=5&data[][text]=5%20stars&data[][question_id]=182_1200_23&data[][type]=question&data[][agenda_id]=1195&data[][stars]=3&data[][text]=Angela%20Tucci&data[][question_id]=182_1195_33&data[][type]=question&data[][agenda_id]=1195&data[][stars]=3&data[][text]=Angela%20Tucci&data[][question_id]=179_1195_33&data[][type]=question&data[][agenda_id]=1195&data[][stars]=3&data[][text]=Angela%20Tucci&data[][question_id]=186_1195_33&data[][type]=question&data[][agenda_id]=1195&data[][stars]=3&data[][text]=Angela%20Tucci&data[][question_id]=175_1195_33&data[][type]=question&data[][agenda_id]=1196&data[][stars]=3&data[][text]=Dale&data[][question_id]=186_1196_32&data[][type]=question&data[][agenda_id]=1196&data[][stars]=3&data[][text]=Dale&data[][question_id]=179_1196_32&data[][type]=question&data[][agenda_id]=1196&data[][stars]=3&data[][text]=Dale&data[][question_id]=175_1196_32&data[][type]=question&data[][agenda_id]=1196&data[][stars]=3&data[][text]=Dale&data[][question_id]=182_1196_32&data[][type]=question&data[][agenda_id]=1203&data[][stars]=3&data[][text]=Patricia&data[][question_id]=182_1203_93&data[][type]=question&data[][agenda_id]=1203&data[][stars]=3&data[][text]=Patricia&data[][question_id]=179_1203_93&data[][type]=question&data[][agenda_id]=1203&data[][stars]=3&data[][text]=Patricia&data[][question_id]=186_1203_93&data[][type]=question&data[][agenda_id]=1203&data[][stars]=3&data[][text]=Patricia&data[][question_id]=175_1203_93&data[][question_id]=1&data[][type]=question&data[][stars]=4&data[][question_id]=16&data[][type]=question&data[][text]=More%20Cookies%20please%21&anonymous=true&attendee_id=5796

Now all you got to do is encode! [[myNSDictionary URLEncodedString] stringByAddingURLEncoding]

briefing_id%3D616%26comments%3DMore%2520Cookies%2520please%2521%26data%5B%5D%5Btype%5D%3Dfollowup%26data%5B%5D%5Bspeaker_id%5D%3D23%26data%5B%5D%5Brequested%5D%3Dtrue%26data%5B%5D%5Bagenda_id%5D%3D1200%26data%5B%5D%5Btype%5D%3Dquestion%26data%5B%5D%5Bagenda_id%5D%3D1200%26data%5B%5D%5Bstars%5D%3D5%26data%5B%5D%5Btext%5D%3D5%2520stars%26data%5B%5D%5Bquestion_id%5D%3D179_1200_23%26data%5B%5D%5Btype%5D%3Dquestion%26data%5B%5D%5Bagenda_id%5D%3D1200%26data%5B%5D%5Bstars%5D%3D5%26data%5B%5D%5Btext%5D%3D5%2520stars%26data%5B%5D%5Bquestion_id%5D%3D186_1200_23%26data%5B%5D%5Btype%5D%3Dquestion%26data%5B%5D%5Bagenda_id%5D%3D1200%26data%5B%5D%5Bstars%5D%3D5%26data%5B%5D%5Btext%5D%3D5%2520stars%26data%5B%5D%5Bquestion_id%5D%3D175_1200_23%26data%5B%5D%5Btype%5D%3Dquestion%26data%5B%5D%5Bagenda_id%5D%3D1200%26data%5B%5D%5Bstars%5D%3D5%26data%5B%5D%5Btext%5D%3D5%2520stars%26data%5B%5D%5Bquestion_id%5D%3D182_1200_23%26data%5B%5D%5Btype%5D%3Dquestion%26data%5B%5D%5Bagenda_id%5D%3D1195%26data%5B%5D%5Bstars%5D%3D3%26data%5B%5D%5Btext%5D%3DAngela%2520Tucci%26data%5B%5D%5Bquestion_id%5D%3D182_1195_33%26data%5B%5D%5Btype%5D%3Dquestion%26data%5B%5D%5Bagenda_id%5D%3D1195%26data%5B%5D%5Bstars%5D%3D3%26data%5B%5D%5Btext%5D%3DAngela%2520Tucci%26data%5B%5D%5Bquestion_id%5D%3D179_1195_33%26data%5B%5D%5Btype%5D%3Dquestion%26data%5B%5D%5Bagenda_id%5D%3D1195%26data%5B%5D%5Bstars%5D%3D3%26data%5B%5D%5Btext%5D%3DAngela%2520Tucci%26data%5B%5D%5Bquestion_id%5D%3D186_1195_33%26data%5B%5D%5Btype%5D%3Dquestion%26data%5B%5D%5Bagenda_id%5D%3D1195%26data%5B%5D%5Bstars%5D%3D3%26data%5B%5D%5Btext%5D%3DAngela%2520Tucci%26data%5B%5D%5Bquestion_id%5D%3D175_1195_33%26data%5B%5D%5Btype%5D%3Dquestion%26data%5B%5D%5Bagenda_id%5D%3D1196%26data%5B%5D%5Bstars%5D%3D3%26data%5B%5D%5Btext%5D%3DDale%26data%5B%5D%5Bquestion_id%5D%3D186_1196_32%26data%5B%5D%5Btype%5D%3Dquestion%26data%5B%5D%5Bagenda_id%5D%3D1196%26data%5B%5D%5Bstars%5D%3D3%26data%5B%5D%5Btext%5D%3DDale%26data%5B%5D%5Bquestion_id%5D%3D179_1196_32%26data%5B%5D%5Btype%5D%3Dquestion%26data%5B%5D%5Bagenda_id%5D%3D1196%26data%5B%5D%5Bstars%5D%3D3%26data%5B%5D%5Btext%5D%3DDale%26data%5B%5D%5Bquestion_id%5D%3D175_1196_32%26data%5B%5D%5Btype%5D%3Dquestion%26data%5B%5D%5Bagenda_id%5D%3D1196%26data%5B%5D%5Bstars%5D%3D3%26data%5B%5D%5Btext%5D%3DDale%26data%5B%5D%5Bquestion_id%5D%3D182_1196_32%26data%5B%5D%5Btype%5D%3Dquestion%26data%5B%5D%5Bagenda_id%5D%3D1203%26data%5B%5D%5Bstars%5D%3D3%26data%5B%5D%5Btext%5D%3DPatricia%26data%5B%5D%5Bquestion_id%5D%3D182_1203_93%26data%5B%5D%5Btype%5D%3Dquestion%26data%5B%5D%5Bagenda_id%5D%3D1203%26data%5B%5D%5Bstars%5D%3D3%26data%5B%5D%5Btext%5D%3DPatricia%26data%5B%5D%5Bquestion_id%5D%3D179_1203_93%26data%5B%5D%5Btype%5D%3Dquestion%26data%5B%5D%5Bagenda_id%5D%3D1203%26data%5B%5D%5Bstars%5D%3D3%26data%5B%5D%5Btext%5D%3DPatricia%26data%5B%5D%5Bquestion_id%5D%3D186_1203_93%26data%5B%5D%5Btype%5D%3Dquestion%26data%5B%5D%5Bagenda_id%5D%3D1203%26data%5B%5D%5Bstars%5D%3D3%26data%5B%5D%5Btext%5D%3DPatricia%26data%5B%5D%5Bquestion_id%5D%3D175_1203_93%26data%5B%5D%5Bquestion_id%5D%3D1%26data%5B%5D%5Btype%5D%3Dquestion%26data%5B%5D%5Bstars%5D%3D4%26data%5B%5D%5Bquestion_id%5D%3D16%26data%5B%5D%5Btype%5D%3Dquestion%26data%5B%5D%5Btext%5D%3DMore%2520Cookies%2520please%2521%26anonymous%3Dtrue%26attendee_id%3D5796
//
// NSDictionary+UrlEncoding.h
// Itinerary
//
// Created by Micah Woods on 12/5/12.
//
//
#import <Foundation/Foundation.h>
@interface NSDictionary (UrlEncoding)
/**
Returns a representation of the dictionary as a URLEncoded string
@returns A UTF-8 encoded string representation of the keys/values in the dictionary
*/
- (NSString *)stringWithURLEncodedEntries;
- (NSString *)URLEncodedString;
@end
//
// NSDictionary+UrlEncoding.m
// Itinerary
//
// Created by Micah Woods on 12/5/12.
//
//
// file "NSDictionary+UrlEncoding.m"
#import "NSDictionary+UrlEncoding.h"
#import "NSString+UrlEncoding.h"
@implementation NSDictionary (UrlEncoding)
- (void)URLEncodePart:(NSMutableArray*)parts path:(NSString*)path value:(id)value {
NSString *encodedPart = [[value description] stringByAddingURLEncoding];
[parts addObject:[NSString stringWithFormat: @"%@=%@", path, encodedPart]];
}
- (void)URLEncodeParts:(NSMutableArray*)parts path:(NSString*)inPath {
[self enumerateKeysAndObjectsUsingBlock:^(id key, id value, BOOL *stop) {
NSString *encodedKey = [[key description] stringByAddingURLEncoding];
NSString *path = inPath ? [inPath stringByAppendingFormat:@"[%@]", encodedKey] : encodedKey;
if ([value isKindOfClass:[NSArray class]]) {
for (id item in value) {
if ([item isKindOfClass:[NSDictionary class]] || [item isKindOfClass:[NSMutableDictionary class]]) {
[item URLEncodeParts:parts path:[path stringByAppendingString:@"[]"]];
} else {
[self URLEncodePart:parts path:[path stringByAppendingString:@"[]"] value:item];
}
}
} else if([value isKindOfClass:[NSDictionary class]] || [value isKindOfClass:[NSMutableDictionary class]]) {
[value URLEncodeParts:parts path:path];
}
else {
[self URLEncodePart:parts path:path value:value];
}
}];
}
- (NSString *)stringWithURLEncodedEntries {
NSMutableArray* parts = [NSMutableArray array];
[self URLEncodeParts:parts path:nil];
return [parts componentsJoinedByString:@"&"];
}
- (NSString *)URLEncodedString {
return [self stringWithURLEncodedEntries];
}
- (NSString *)HTTPHeaderValueForContentType {
return @"application/x-www-form-urlencoded";
}
- (NSData*)HTTPBody {
return [[self URLEncodedString] dataUsingEncoding:NSUTF8StringEncoding];
}
@end
//
// NSString+UrlEncoding.h
// Itinerary
//
// Created by Micah Woods on 12/5/12.
//
//
#import <Foundation/Foundation.h>
@interface NSString (UrlEncoding)
- (NSString *)stringByAddingURLEncoding;
@end
//
// NSString+UrlEncoding.m
// Itinerary
//
// Created by Micah Woods on 12/5/12.
//
//
#import "NSString+UrlEncoding.h"
@implementation NSString (UrlEncoding)
// NOTE: See http://en.wikipedia.org/wiki/Percent-encoding#Percent-encoding_reserved_characters
- (NSString *)stringByAddingURLEncoding {
CFStringRef legalURLCharactersToBeEscaped = CFSTR(":/?#[]@!$ &'()*+,;=\"<>%{}|\\^~`\n\r");
CFStringRef encodedString = CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,
(CFStringRef)self,
NULL,
legalURLCharactersToBeEscaped,
kCFStringEncodingUTF8);
if (encodedString) {
return (__bridge NSString *)encodedString;
}
// TODO: Log a warning?
return @"";
}
@end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment