Как передать объект json в качестве параметра веб-сервису?

Я использую веб-сервис, который принимает объект json в качестве параметра. Вот мой код:

    -(void)createHttpHeaderRequest {

        NSString *x = @"{\"GetVehicleInventory\": {\"ApplicationArea\": {\"Sender\": {\"ComponentID\":}}}" (something like that)

        NSString *sample = [NSString stringWithFormat:@"https://trialservice.checkitout?XML_INPUT=%@",x];
 NSString * final = (NSString *) CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)sampleReq, NULL, CFSTR(":/?#[]@!$&'()*+,;=\""), kCFStringEncodingUTF8);
 NSMutableRequest *request = [NSMutableREquest requestWithURL:[NSURL URLWithString:final]];
    NSURLConnection * theConnection = [[NSURLConnection alloc]initWithRequest:theRequest delegate:self];
        if (theConnection) {
            NSLog(@"Service hit");
        }
    }

    - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
        NSError * error;
        NSDictionary * dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error];
        NSArray * categories = [dict objectForKey:@"category"];
        [self.delegate giveControlBackToController:categories];

    }

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


person Ashutosh    schedule 25.07.2012    source источник
comment
Пожалуйста, постарайтесь использовать правильный английский язык и вставьте какой-нибудь код, который хотя бы компилируется.   -  person    schedule 25.07.2012
comment
Вы создаете NSMutableRequest с именем request, но затем инициализируете NSURLConnection чем-то с именем theRequest. Отражает ли это ваш фактический код или это просто ошибка, возникшая, когда вы скопировали его сюда?   -  person Ethan Holshouser    schedule 25.07.2012
comment
Это просто ошибка, которая была введена здесь. Извини за это.   -  person Ashutosh    schedule 25.07.2012
comment
Вы реализовали connection: didReceiveResponse: в своем делегате?   -  person Ethan Holshouser    schedule 26.07.2012


Ответы (2)


Хитрость заключается в том, что большинство браузеров автоматически экранируют URL-адреса, а NSURL — нет. Вам нужно будет сделать это вручную; взгляните на CFURLCreateStringByAddingPercentEscapes.

person Community    schedule 25.07.2012
comment
В ПОРЯДКЕ. Итак, я попробовал это, и теперь он не дает мне null, но все еще не использует метод делегата, плюс URL-адрес теперь заполнен большим количеством% 7D и т. д. Любые другие предложения ?? - person Ashutosh; 25.07.2012
comment
Вы установили делегата? Вы даже создали NSURLConnection? - person ; 25.07.2012
comment
да. NSURLConnection * theConnection = [[NSURLConnection alloc] initWithRequest: делегат theRequest: сам]; - person Ashutosh; 25.07.2012
comment
см. редактирование выше. Невозможно показать правильный URL-адрес или параметр json, но это все. - person Ashutosh; 25.07.2012
comment
@Ashutosh, так вы наконец добавили экранирование процентов, используя функцию, которую я предложил? Я не вижу его нигде. Кроме того, в connection:didReceiveData: происходит не то, что вы думаете: параметр данных является частичными данными и должен собираться с использованием экземпляра NSMutableData. - person ; 25.07.2012
comment
Извини за это. Это было в моем коде как-то пропущено при вставке кода сюда. И connectionDidReceiveData даже не вызывается. Я просто хочу попасть в сервис и увидеть ответ. Я поставил точку останова в начале этого метода делегата, чтобы посмотреть, дойдет ли программа до этого места. - person Ashutosh; 25.07.2012
comment
Экранируйте только JSON, а не всю строку URL. - person ; 26.07.2012

Вероятно, это должен быть комментарий, а не ответ, но, к сожалению, вы не можете форматировать код в комментарии. Добавьте следующий метод к вашему делегату и посмотрите, вызывается ли он. Если да, дайте нам знать, каков ответ.

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
    NSLog(@"Connection response code: %d", httpResponse.statusCode);
}
person Ethan Holshouser    schedule 25.07.2012
comment
Его не вызывают. Но метод didFailWithError работает и говорит NSLocalizedDescription=Сертификат для этого сервера недействителен. Возможно, вы подключаетесь к серверу, выдающему себя за «209.112.58.126», что может подвергнуть риску вашу конфиденциальную информацию. NSUunderlyingError=0x6877b40 Сертификат для этого сервера недействителен. Возможно, вы подключаетесь к серверу, выдающему себя за «209.112.58.126», что может подвергнуть риску вашу конфиденциальную информацию. NSURLErrorFailingURLPeerTrustErrorKey=‹SecTrustRef: 0x6c59390›} - person Ashutosh; 26.07.2012
comment
Значит, что-то не так с конфигурацией сервера. Вы говорите, что это работает в браузере? - person Ethan Holshouser; 26.07.2012