Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

12.03.2014, 12:10. Просмотров 928. Ответов 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...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.03.2014, 12:10
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как добавить JSON данные в GET запрос? (Программирование iOS):

Отправить POST запрос и получить json данные с сервера. Как сделать? - jQuery
Добрый день. Мне нужно создать html форму с двумя полями username и password, методом POST отправить ее на сервер. Далее получить от...

Добавить в запрос дополнительные данные - PHP
Доброго времени суток! Помогите, пожалуйста, составить правильный запрос Mysql. Есть запрос: INSERT INTO orders (`date`,...

Как добавить строку в JSON? - Java SE
1) А как с массивами работать, как применить JSONArray???, надо в массив добавить 3 имени 2) Как из String перенести данные в json??? ...

Как добавить добавить данные в базу данных посредством LINQ - C#
Как добавить добавить данные в базу данных посредством LINQ to SQL Ошибка: Нарушение "PK_TICKER_MINUTE" ограничения PRIMARY KEY....

Как добавить json API к существующему RoR проекту? - Ruby on Rails
Делаю простой как двери проект на RoR, что-то похожее на: rails new prj rails g scaffold Thing title:string descr:text rake...

Как добавить к проекту в IntelliJ библиотеку JSON-java? - Java
Пробую добавить к проекту библиотеку через окно Project Structure. Что пробовал: Скачивал все .java файлы из репозитория, потом...

2
Vorona
Peace 2 all shining faces
669 / 531 / 45
Регистрация: 05.03.2010
Сообщений: 1,283
13.03.2014, 02:06 #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:@"+"];
    // ...
}
0
aply
0 / 0 / 0
Регистрация: 19.11.2013
Сообщений: 40
13.03.2014, 08:42  [ТС] #3
Да, могут, но почему-то stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding их нормально переводит, а запятые и двоеточия не хочет.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.03.2014, 08:42
Привет! Вот еще темы с ответами:

Как вытащить данные из JSON? - C#
Нужно из этого {&quot;response&quot;:} Вытащить значения first_name и last_name в одноименные переменные. Есл можно подробно ну начиная с...

Как сохранить данные в JSON - AngularJS
Всем привет! У меня есть форма для комментариев. В режиме live комментарии отправляются и отображаются, все в порядке, но обновив страницу...

Как прочитать данные из ячейки, и если она пуста добавить данные - PHP БД
Привет всем. У меня есть вот такой код: &lt;?php $arrqq = array($row-&gt;id); foreach($arrqq as $d =&gt; $s) { $imagetext =...

Как правильно сделать пост запрос json? - Node.js
День Добрый. Пишу небольшой сервис для локального osm сервера. Встала проблема с пост запросом на добавление записи в базу. в данном...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

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