2010-11-03 6 views
11

У меня есть служба WCF, и я пытаюсь использовать ее в iPhone-приложении в качестве запроса POST-запроса JSON. Я планирую использовать сериализатор JSON позже, но это то, что у меня есть для запроса:Запрос JSON POST на iPhone (с использованием HTTPS)

NSString *jsonRequest = @"{\"username\":\"user\",\"password\":\"letmein\"}"; 
    NSLog(@"Request: %@", jsonRequest); 

    NSURL *url = [NSURL URLWithString:@"https://mydomain.com/Method/"]; 

    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url]; 
    NSData *requestData = [NSData dataWithBytes:[jsonRequest UTF8String] length:[jsonRequest length]]; 

    [request setHTTPMethod:@"POST"]; 
    [request setValue:@"application/json" forHTTPHeaderField:@"Accept"]; 
    [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; 
    [request setValue:[NSString stringWithFormat:@"%d", [requestData length]] forHTTPHeaderField:@"Content-Length"]; 
    [request setHTTPBody: requestData]; 

    [NSURLConnection connectionWithRequest:[request autorelease] delegate:self]; 

В моих данных, полученных я просто напечатать его на консоль:

- (void) connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 
{ 
    NSMutableData *d = [[NSMutableData data] retain]; 
    [d appendData:data]; 

    NSString *a = [[NSString alloc] initWithData:d encoding:NSASCIIStringEncoding]; 

    NSLog(@"Data: %@", a); 
} 

И в этом Ответ Получай это сообщение:

Data: <?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
    <head> 
    <title>Request Error</title> 
    <style> 
     <!-- I've took this out as there's lots of it and it's not relevant! --> 
    </style> 
    </head> 
    <body> 
    <div id="content"> 
     <p class="heading1">Request Error</p> 
     <p xmlns="">The server encountered an error processing the request. Please see the <a rel="help-page" href="https://mydomain.com/Method/help">service help page</a> for constructing valid requests to the service.</p> 
    </div> 
    </body> 
</html> 

Кто-нибудь знает, почему это происходит и где я иду не так?

Я читал об использовании ASIHTTPPost, но вместо этого я не могу получить демо для запуска в iOS4 :(

Благодаря

EDIT:

Я просто привыкла CharlesProxy нюхать , что происходит, когда я звоню с iPhone (Simulator), и это то, что он дал мне: alt text

Единственное странно я заметил, что говорит " SSL-проксирование не включено для этого хоста: включить в настройках прокси-сервера, местоположения SSL ». Кто-нибудь знает что это значит? (Это также происходит в моем рабочем окне клиента).

Я только что запустил это на своем клиенте Windows, и единственное, что отличается, это текст запроса и ответа, который зашифрован. Я что-то пропустил, чтобы использовать безопасное HTTP-соединение для этого?

NEW EDIT: Это работает с запросом, отличным от HTTPS, например: http://maps.googleapis.com/maps/api/geocode/json?address=UK&sensor=true. Итак, я думаю, проблема заключается в том, что iPhone должен правильно отправлять POST через SSL?

Я также использую следующие методы:

- (void) connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge 
{ 
    if([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) 
    { 
     [challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust] 
     forAuthenticationChallenge:challenge]; 
    } 

    [challenge.sender continueWithoutCredentialForAuthenticationChallenge:challenge]; 
} 

- (void) connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace 
{ 
    if([[protectionSpace authenticationMethod] isEqualToString:NSURLAuthenticationMethodServerTrust]) 
    { 
     return YES; 
    } 
} 

Это позволяет мне получить это далеко. Если я их не использую, я получаю сообщение об ошибке:

Неверный сертификат для этого сервера. Возможно, вы подключаетесь к серверу, который притворяется «mydomain.com», который может поставить вашу конфиденциальную информацию под угрозу.

+0

Вы можете видеть журналы на своем сервере, если у них есть что-то интересное в них? – willcodejavaforfood

+0

У меня нет доступа к ним прямо сейчас. Я знаю, что сервис настроен и работает с другими клиентами. –

ответ

12

ФИКСИРОВАННЫЙ!

Изменено:

[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; 

к:

[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; 

Вы также нужны эти два метода:

- (void) connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge 
{ 
    if([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) 
    { 
     [challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust] 
     forAuthenticationChallenge:challenge]; 
    } 

    [challenge.sender continueWithoutCredentialForAuthenticationChallenge:challenge]; 
} 

- (void) connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace 
{ 
    if([[protectionSpace authenticationMethod] isEqualToString:NSURLAuthenticationMethodServerTrust]) 
    { 
     return YES; 
    } 
} 
+0

Кстати, разве вы не забыли «вернуть НЕТ» в последней строке последнего метода? – Artem

+0

Я не уверен, я возвратите YES в метод void. Не могу вспомнить, почему сейчас. –

+0

@ ing0 вы можете перевести эту строку в swift plz [request setValue: @ "application/x-www-form-urlencoded" forHTTPHeaderField: @ "Content-Type"] –

3

Я не знаю, Objective C на всех, но попытайтесь установить заголовок Accept в application/json вместо application/jsonrequest.

+0

Пробовал это раньше. Должно быть, так или иначе? Просто сделал это снова, и я все равно получаю тот же ответ! :( –

+1

'application/json', безусловно, правильный MIME-тип для данных JSON. См. Http://stackoverflow.com/questions/477816/the-right-json-content-type – Jon

+0

ОК спасибо. Это, вероятно, будет одним из много ошибок! :) +1 –

0

изменения

NSData *requestData = [NSData dataWithBytes:[jsonRequest UTF8String] length:[jsonRequest length]]; 

в

NSData *requestData = [jsonRequest dataUsingEncoding:NSUTF8StringEncoding]; 
0

DIC является NSMutable словарь с объектом и ключами. baseUrl - это ваш сервер webservice url.

NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dic 
                 options:NSJSONWritingPrettyPrinted error:nil]; 
    NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; 
    NSString *encodedString = [jsonString base64EncodedString]; 

    NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@wsName",baseUrl]]; 
    NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:url]; 
    [theRequest addValue: @"text/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"]; 
    [theRequest setHTTPMethod:@"POST"]; 
    [theRequest setValue:encodedString forHTTPHeaderField:@"Data"]; 
Смежные вопросы