У меня есть служба WCF, и я пытаюсь использовать ее в приложении iPhone в качестве запроса JSON POST. Я планирую использовать сериализатор JSON позже, но это то, что у меня есть для запроса:
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 lots of it and it 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="#" onclick="location.href='https://mydomain.com/Method/help'; return false;">service help page</a> for constructing valid requests to the service.</p>
</div>
</body>
</html>
Кто-нибудь знает, почему это происходит и где я ошибаюсь?
Я читал об использовании ASIHTTPPost вместо этого, но я не могу запустить демоверсию в iOS4: (
Спасибо
EDIT:
Я только что использовал CharlesProxy, чтобы вынюхивать, что происходит, когда я звоню с iPhone (Simulator), и это то, что он дал мне:
Единственное, что я заметил, это сообщение: "SSL-проксирование не включено для этого хоста: включить в настройках прокси-сервера, местоположениях SSL". Кто-нибудь знает, что это значит? (Это также происходит в моем рабочем клиенте Windows).
Я только что запустил это на моем клиенте Windows, и единственное, что отличается, это текст запроса и ответа, который зашифрован. Я что-то упустил, чтобы использовать безопасное HTTP-соединение для этого?
НОВЫЙ РЕДАКТ: Это работает с запросом, отличным от 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", который может угрожать вашей конфиденциальной информации.