Поместите данные JSON в NSURL - PullRequest
       6

Поместите данные JSON в NSURL

4 голосов
/ 16 сентября 2011

Я пытаюсь сделать что-то, что кажется легким делом, но по какой-то причине не работает.

Я пытаюсь сделать запрос на получение данных JSON, отправив в URL параметр JSON 'data'.

Вот код, который я использую:

NSDictionary *whatToPost= [NSDictionary dictionaryWithObjectsAndKeys:
 username, @"username", 
 password, @"password", nil];

NSString *url = [NSString stringWithFormat:@"http://domain.com/user/get?data=%@",
 [whatToPost JSONString]];
NSURL *theUrl = [NSURL URLWithString:
 [url stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
//NSLog(url) will produce this:
  http://domain.com/user/get?data={"username":"test1","password":"poop"}

Когда я устанавливаю точку останова, theUrl равен нулю. Я не могу понять, почему он ломается, но я думаю, что отправка {или s 'ломает его. Есть идеи? Стоит ли просто переключиться на POST?

Ответы [ 2 ]

11 голосов
/ 16 сентября 2011
NSDictionary *whatToPost= [NSDictionary dictionaryWithObjectsAndKeys:
 username, @"username", 
 password, @"password", nil];

NSString *url = [NSString stringWithFormat:@"http://domain.com/user/get?data=%@",
 [whatToPost JSONString]];
NSURL *theUrl = [NSURL URLWithString:
 [url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];

вы переключили метод

stringByAddingPercentEscapesUsingEncoding:

Возвращает представление получателя с использованием заданной кодировки для определения процента экранирования, необходимого для преобразования получателя в допустимую строку URL.

по stringByReplacingPercentEscapesUsingEncoding

Возвращает новую строку, созданную путем замены в получателе всех процентов перехода на соответствующие символы, как определено данной кодировкой.

см
http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/Reference/NSString.html
http://blog.evandavey.com/2009/01/how-to-url-encode-nsstring-in-objective-c.html

0 голосов
/ 16 сентября 2011

Вы должны изучить отправку заголовка HTTP-аутентификации в запросе вместо того, чтобы отправлять имя пользователя и пароль в самом URL.

Что-то вроде: [request setValue: [описание whatToPost] forHTTPHeaderField: @ "Авторизация"];

Конечно, это предполагает, что вы контролируете другой конец транзакции, то есть веб-службу, к которой вы обращаетесь.

...