Форум программистов, компьютерный форум CyberForum.ru

Программирование iOS/iPhone

Войти
Регистрация
Восстановить пароль
 
aply
0 / 0 / 0
Регистрация: 19.11.2013
Сообщений: 40
#1

Как добавить JSON данные в GET запрос? - Программирование iOS/iPhone

12.03.2014, 12:10. Просмотров 890. Ответов 2
Метки нет (Все метки)

Есть словарь
Objective-C
1
2
3
4
NSMutableDictionary *filter = [NSMutableDictionary dictionaryWithObjectsAndKeys:
                       @"", @"search",
                       [NSMutableArray array], @"keywords",
                       nil];
Надо отправить GET запрос с параметром filter в виде JSON.

Конвертирую словарь:
Objective-C
1
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:filter options:0 error:nil];
Далее получаю строку
Objective-C
1
NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSASCIIStringEncoding];
Далее собираю строку URL
Objective-C
1
NSString *urlString = [MAINURL stringByAppendingFormat:@"api/...../filter=%@",jsonString];
Далее получаю URL из этой строки
Objective-C
1
NSURL *url = [NSURL URLWithString:[urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding ]];
Ну и далее отправляю запрос через
Objective-C
1
2
3
4
5
6
NSURLSessionDataTask *dataTask=
    [session dataTaskWithURL:url
                completionHandler:^(NSData *data,
                                    NSURLResponse *response,
                                    NSError *error){......}];
[dataTask resume];

Но почему то не получаю ожидаемого ответа.

Objective-C
1
Делаю NSLog( @"url= %@",url)
И вижу, что запятые и двоеточия не конвертируются в URL.

То есть что-то вот такое выходит:
https://.....filter=%7B%0A%20%20%22keywords%22%20:%20%5B%0A%0A%20%20%5D,%0A%20%20%22search%22%20:%20%22%22%0A%7D

Почему так?

Добавлено через 18 часов 43 минуты
Пока нашел информацию, что запятые и двоеточия - это легальные символы URL, поэтому они не конвертируются через stringByAddingPercentEscapesUsingEncoding.

Решение для себя пока такое:
Objective-C
1
2
3
 filterString = [filterString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
 filterString = [filterString stringByReplacingOccurrencesOfString:@"," withString:@"%2C"];
 filterString = [filterString stringByReplacingOccurrencesOfString:@":" withString:@"%3A"];
Собираю urlString со строкой filterString через stringByAppendingFormat.
А NSURL получаю из urlString без кодирования:
Objective-C
1
 return [NSURL URLWithString:urlString];
Работает, но код не нравится.
Есть еще такой вариант кодировки filterString:
Objective-C
1
2
3
4
5
filterString = CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(NULL,
                                                                          (__bridge CFTypeRef)filterString,
                                                                          NULL,
                                                                          CFSTR(",:"),
                                                                          kCFStringEncodingUTF8));
Но старюсь не использовать то, в чем до конца не разобрался. Будет время, поизучаю этот CFURL...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.03.2014, 12:10     Как добавить JSON данные в GET запрос?
Посмотрите здесь:

Как добавить текст к тексту в текстовом поле? Objective-C
Objective-C JSON
парсинг JSON Objective-C
Как добавить новое устройство в Apple Developer?
Как добавить блок AdMob на UITableView?
Как добавить нового программиста к себе в apple developer?
Как добавить музыку?
Как сохранять данные в plist?
Как сохранять и выгружать данные из файловой системы Objective-C
Как добавить собственный UIView в нужное место?
Получить NSString из JSON и использовать его как заголовок в TableView
SQLite вывезка данные и выложить извлеченные данные к MessageUI Objective-C

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Vorona
Peace 2 all shining faces
666 / 528 / 44
Регистрация: 05.03.2010
Сообщений: 1,271
13.03.2014, 02:06     Как добавить JSON данные в GET запрос? #2
да, только в урле могут встречаться и ? и = и & и # и [ и ]

Objective-C
1
NSString * encodedString = (NSString *)CFURLCreateStringByAddingPercentEscapes(NULL, (CFStringRef)unencodedString, NULL, (CFStringRef)@"!*'();:@&=+$,/?%#[]", kCFStringEncodingUTF8);
либо
Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
- (NSString *) URLEncodedString_ch {
    NSMutableString * output = [NSMutableString string];
    const unsigned char * source = (const unsigned char *)[self UTF8String];
    int sourceLen = strlen((const char *)source);
    for (int i = 0; i < sourceLen; ++i) {
        const unsigned char thisChar = source[i];
        if (thisChar == ' '){
            [output appendString:@"+"];
        } else if (thisChar == '.' || thisChar == '-' || thisChar == '_' || thisChar == '~' || 
                   (thisChar >= 'a' && thisChar <= 'z') ||
                   (thisChar >= 'A' && thisChar <= 'Z') ||
                   (thisChar >= '0' && thisChar <= '9')) {
            [output appendFormat:@"%c", thisChar];
        } else {
            [output appendFormat:@"%%%02X", thisChar];
        }
    }
    return output;
}
только в последнем варианте насчет 7 и 8 строк не очень уверен
Objective-C
1
2
3
4
if (thisChar == ' ') {
    [output appendString:@"+"];
    // ...
}
aply
0 / 0 / 0
Регистрация: 19.11.2013
Сообщений: 40
13.03.2014, 08:42  [ТС]     Как добавить JSON данные в GET запрос? #3
Да, могут, но почему-то stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding их нормально переводит, а запятые и двоеточия не хочет.
Yandex
Объявления
13.03.2014, 08:42     Как добавить JSON данные в GET запрос?
Ответ Создать тему
Опции темы

Текущее время: 18:11. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru