- (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
. Якщо ви видалите цей додатковий простір, ви повинні бути в гарній формі.
Пара інших спостережень:
Просто попереджаю вас, ваше використання
stringByAddingPercentEscapesUsingEncoding
буде правильно обробляти наявність пробілу вreq
вартість Але це не буде належним чином обробляти наявність деяких інших символів (зокрема&
або+
) Якщо це можливо, що ці сорти символів можуть з'явитися вreq
значення, ви можете вилучити виклик доstringByAddingPercentEscapesUsingEncoding
для всієї URL-адреси, а замість цього просто використовуватиCFURLCreateStringByAddingPercentEscapes
(що дає вам трохи більше контролю над процентним процесом, що вилучається) на тількиreq
вартість ДивpercentEscapeString
метод у цій відповіді: Додайте дані до POST NSURLRequest.У вашому мережевому запиті, а також у процесі обробки JSON ви повертаєте
NSError
об'єкт Я міг би запропонувати вам записувати ці значення, якщо вони "nil
, що допоможе вам діагностувати проблеми в майбутньому.Я помічаю, що ви використовуєте обробку виключень. Це не є поширеним в Objective-C Програмування в Objective-C керівництво каже:
Робота з помилками
Майже кожен додаток стикається з помилками. Деякі з цих помилок вийдуть поза вашим контролем, наприклад, закриття місця на диску чи втрата мережевого з'єднання. Деякі з цих помилок можуть бути відновлені, наприклад, неправильний ввід користувача. І, хоча всі розробники прагнуть до досконалості, іноді може виникнути помилка програміста.
Якщо ви йдете з інших платформ іМови, ви можете використовувати для роботи з винятками для більшості обробки помилок. Коли ви пишете код Objective-C, винятки застосовуються виключно для помилок програміста, наприклад, доступ до масиву поза межами або аргументи недійсного методу. Це проблеми, які ви повинні знайти та виправити під час тестування, перш ніж надсилати додаток.
Всі інші помилки представлені екземплярами
NSError
клас У цьому розділі наведено короткий вступ до використанняNSError
об'єкти, в тому числі як працювати з рамковими методами, які можуть спричинити невдачу та повертати помилки. Для отримання додаткової інформації див Помилка керування програмуванням.Підсумок, як я вже згадував у другому пункті, ви повинні перевіряти
NSError
Повертайте значення себе, а не покладаючись на виключення в Objective-C.