/ / data параметр є нульовим, коли я намагаюся отримати дані з веб-служби, використовуючи json-objective-c

Параметр даних nil, коли я намагаюся отримати дані з веб-служби за допомогою json-objective-c

- (NSDictionary*)PostWebService:(NSString*)completeURL param:(NSString*)value
{
@try
{
NSString *urlStr =[completeURL  stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSURL *url = [NSURL URLWithString:urlStr];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setHTTPMethod:@"POST"];
//NSString *urlPart=@"req=value";
//NSString *urlPart;
NSString *urlPart=[NSString stringWithFormat:@"req=%@", value];

NSLog(@"String %@",urlPart);
NSData *requestBody = [urlPart dataUsingEncoding:NSUTF8StringEncoding];
//NSLog(@"String %@",requestBody);
[request setHTTPBody:requestBody];
NSURLResponse *response = NULL;
NSError *requestError = NULL;
NSData *responseData = [NSURLConnection sendSynchronousRequest:request  returningResponse:&response error:&requestError];
NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding] ;
NSLog(@"String %@",responseString);
NSError* error;
NSDictionary* json = [NSJSONSerialization JSONObjectWithData:responseData
options:kNilOptions
error:&error];

return json;
}

@catch(NSException *e)
{
NSLog(@"reason is%@",e.reason);
}
}

і я називаю цей спосіб тут ..

-(NSDictionary*)gotvall:(NSString*)req
{
@try
{
NSString *vurl=@"some url/";

//   vurl=[vurl stringByAppendingString:@"req="];
// vurl=[vurl stringByAppendingString:req];
//  NSLog(@"%@",vurl);
NSDictionary *json=[self PostWebService:vurl param:req];
NSLog(@"json is%@",json);
return json;
}
@catch(NSException *e)
{
NSLog(@"%@",e.reason);
}
}

Після налагодження цього методу я отримав результат як параметр даних nil. Чи може хто-небудь сказати, що я роблю неправильно тут. Я отримав повний URL, і, коли я запускаю цей URL в браузері, я отримав чудові дані, але коли я друкую значення json, він повертається null.

Відповіді:

2 для відповіді № 1

Ви повідомили, що ваша помилка:

Помилка Domain = NSURLErrorDomain Код = -1002"Непідтримувана URL-адреса" UserInfo = 0x8d84960 (NSErrorFailingURLStringKey =% 20http: //www.hugosys.in/www.nett-torg.no/api/vehicl e /, NSErrorFailingURLKey =% 20http: //www.hugosys.in/www .nett-torg.no / api / vehicle /, NSLocalizedDescription = непідтримувана URL-адреса, NSUnderlyingError = 0x8d8bfe0 "непідтримувана URL-адреса"}

Це %20 у вашому повідомленні про помилку є пробіл у початку вашої URL-адреси, що є вашим stringByAddingPercentEscapesUsingEncoding дзвінок конвертований в %20. Якщо ви видалите цей додатковий простір, ви повинні бути в гарній формі.

Пара інших спостережень:

  1. Просто попереджаю вас, ваше використання stringByAddingPercentEscapesUsingEncoding буде правильно обробляти наявність пробілу в req вартість Але це не буде належним чином обробляти наявність деяких інших символів (зокрема & або +) Якщо це можливо, що ці сорти символів можуть з'явитися в req значення, ви можете вилучити виклик до stringByAddingPercentEscapesUsingEncoding для всієї URL-адреси, а замість цього просто використовувати CFURLCreateStringByAddingPercentEscapes (що дає вам трохи більше контролю над процентним процесом, що вилучається) на тільки req вартість Див percentEscapeString метод у цій відповіді: Додайте дані до POST NSURLRequest.

  2. У вашому мережевому запиті, а також у процесі обробки JSON ви повертаєте NSError об'єкт Я міг би запропонувати вам записувати ці значення, якщо вони "nil, що допоможе вам діагностувати проблеми в майбутньому.

  3. Я помічаю, що ви використовуєте обробку виключень. Це не є поширеним в Objective-C Програмування в Objective-C керівництво каже:

    Робота з помилками

    Майже кожен додаток стикається з помилками. Деякі з цих помилок вийдуть поза вашим контролем, наприклад, закриття місця на диску чи втрата мережевого з'єднання. Деякі з цих помилок можуть бути відновлені, наприклад, неправильний ввід користувача. І, хоча всі розробники прагнуть до досконалості, іноді може виникнути помилка програміста.

    Якщо ви йдете з інших платформ іМови, ви можете використовувати для роботи з винятками для більшості обробки помилок. Коли ви пишете код Objective-C, винятки застосовуються виключно для помилок програміста, наприклад, доступ до масиву поза межами або аргументи недійсного методу. Це проблеми, які ви повинні знайти та виправити під час тестування, перш ніж надсилати додаток.

    Всі інші помилки представлені екземплярами NSError клас У цьому розділі наведено короткий вступ до використання NSError об'єкти, в тому числі як працювати з рамковими методами, які можуть спричинити невдачу та повертати помилки. Для отримання додаткової інформації див Помилка керування програмуванням.

    Підсумок, як я вже згадував у другому пункті, ви повинні перевіряти NSError Повертайте значення себе, а не покладаючись на виключення в Objective-C.