/ Parametr / data jest zerowy, gdy próbuję pobrać dane z usługi sieciowej za pomocą json - target-c

Parametr data jest zerowy, gdy próbuję pobrać dane z usługi WWW przy użyciu json - target-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);
}
}

i nazywam tę metodę tutaj ..

-(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);
}
}

Po debugowaniu tej metody otrzymałem wynik jako parametr danych nil. Czy ktoś może powiedzieć, że to, co robię źle tutaj. Dostałem pełny adres URL i kiedy uruchomiłem ten adres URL w przeglądarce otrzymałem idealne dane, ale kiedy drukuję wartość json, to zwraca null.

Odpowiedzi:

2 dla odpowiedzi № 1

Zgłosiłeś, że Twój błąd:

Domena błędu = NSURLErrorDomain Code = -1002"nieobsługiwany adres 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 = nieobsługiwany adres URL, NSUnderlyingError = 0x8d8bfe0 "nieobsługiwany adres URL"}

Że %20 w komunikacie o błędzie znajduje się spacja na początku adresu URL stringByAddingPercentEscapesUsingEncoding połączenie jest konwertowane na %20. Jeśli usuniesz tę dodatkową przestrzeń, powinieneś być w dobrej formie.

Kilka innych obserwacji:

  1. Tylko po to, żeby cię ostrzec, o użyciu stringByAddingPercentEscapesUsingEncoding poprawnie obsłuży obecność spacji w req wartość. Ale nie będzie właściwie obsługiwać obecności pewnych innych znaków (w szczególności & lub +). Jeśli jest możliwe, że te rodzaje znaków mogą pojawić się w req wartość, możesz chcieć usunąć wywołanie stringByAddingPercentEscapesUsingEncoding dla całego adresu URL, a zamiast tego po prostu użyj CFURLCreateStringByAddingPercentEscapes (co daje ci trochę więcej kontroli nad procesem ucieczki procentu) na samym req wartość. Zobacz percentEscapeString metoda w tej odpowiedzi: Dołącz dane do testu POST NSURLRequest.

  2. Zarówno w żądaniu sieci, jak i w procesie analizowania JSON, zwracasz wartość NSError obiekt. Mogę zasugerować, żebyś zapisał te wartości, jeśli nigdy nie będąnil, które pomogą Ci zdiagnozować problemy w przyszłości.

  3. Zauważam, że używasz obsługi wyjątków. To nie jest powszechne w Objective-C Programowanie w Objective-C przewodnik mówi:

    Radzenie sobie z błędami

    Niemal każda aplikacja napotyka błędy. Niektóre z tych błędów będą poza twoją kontrolą, takie jak brak miejsca na dysku lub utrata połączenia sieciowego. Niektóre z tych błędów można odzyskać, na przykład nieprawidłowe dane wprowadzone przez użytkownika. Podczas gdy wszyscy programiści dążą do doskonałości, może również wystąpić sporadyczny błąd programisty.

    Jeśli pochodzisz z innych platform iJęzyki mogą być używane do pracy z wyjątkami w przypadku większości błędów. Podczas pisania kodu w Objective-C wyjątki są używane wyłącznie w przypadku błędów programisty, takich jak przekroczenie dostępu do tablicy lub nieprawidłowe argumenty metody. Są to problemy, które powinieneś znaleźć i naprawić podczas testów przed wysłaniem aplikacji.

    Wszystkie inne błędy są reprezentowane przez instancje pliku NSError klasa. Ten rozdział zawiera krótkie wprowadzenie do używania NSError obiekty, w tym sposób pracy z metodami ramowymi, które mogą zawieść i zwracać błędy. Aby uzyskać więcej informacji, zobacz Przewodnik po obsłudze błędów.

    Dolna linia, Jak wspomniałem w drugim punkcie, powinieneś sprawdzić NSError zwracaj wartości, zamiast polegać na wyjątkach w Objective-C.