2010-11-03 15 views
11

Mam hostowaną usługę WCF i próbuję jej użyć w aplikacji na telefon iPhone jako żądanie POST JSON. Planuję za pomocą serializatora JSON później, ale to, co mam na życzenie:Żądanie JSON POST na iPhonie (przy użyciu protokołu 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]; 

W moich danych otrzymanych Ja tylko drukowanie do konsoli:

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

iw tym odpowiedź Otrzymuję tę wiadomość:

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> 

Czy ktoś wie, dlaczego tak się dzieje i gdzie się nie mylę?

czytałem o użyciu ASIHTTPPost zamiast ale nie mogę uruchomić demo w iOS4 :(

Dzięki

EDIT:

Właśnie używane do CharlesProxy wąchać co się dzieje, gdy dzwonię z iPhone'a (Symulator) i to mi dało: alt text

Jedyne, co dziwne zauważyłem to to, że mówi " SSL Proxying nie jest włączony dla tego hosta: włącz w ustawieniach proxy, lokalizacjach SSL ". Czy ktokolwiek wie, co to znaczy? (Tak dzieje się również w moim działającym kliencie Windows).

Właśnie uruchomiłem to na moim kliencie Windows, a jedyną rzeczą, która jest inna, jest tekst żądania i odpowiedzi, który jest zaszyfrowany. Czy brakuje mi czegoś, aby użyć bezpiecznego połączenia HTTP, aby to zrobić?

NOWA EDYCJA: Działa to z braku HTTPS życzenie takich jak: http://maps.googleapis.com/maps/api/geocode/json?address=UK&sensor=true. Więc domyślam się, że problemem jest uzyskanie iPhone'a, aby wysłać POST poprawnie przez SSL?

Jestem również za pomocą następujących metod:

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

To pozwala mi zajść tak daleko. Jeśli ich nie używam, otrzymam komunikat zwrotny z informacją:

Certyfikat dla tego serwera jest nieprawidłowy. Być może łączysz się z serwerem, który podszywa się pod "moja_domena.com", co może narazić na szwank twoje poufne informacje.

+0

Czy widzisz dzienniki na swoim serwerze, jeśli mają w nich coś interesującego? – willcodejavaforfood

+0

Nie mam do nich teraz dostępu. Wiem, że usługa jest skonfigurowana i działa z innymi klientami. –

Odpowiedz

12

NAPRAWIONO!

Zmieniono:

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

do:

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

Trzeba również te dwie metody:

- (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

btw, czy nie zapomniałeś "wrócić NIE" w ostatnim wierszu ostatniej metody? – Artem

+0

Nie jestem pewien, ja return YES do metody void Nie pamiętam dlaczego teraz –

+0

@ ing0 możesz przetłumaczyć tę linię na swift plz [request setValue: @ "application/x-www-form-urlencoded" dlaHTTPHeaderField: @ "Content-Type"] ; –

3

nie wiem Objective C w ogóle, ale spróbuj ustawić nagłówek Accept do application/json zamiast application/jsonrequest.

+0

Próbowałem tego wcześniej. Czy tak powinno być? Zrobiłem to ponownie i wciąż otrzymuję taką samą odpowiedź! :( –

+1

'application/json' jest zdecydowanie poprawnym typem MIME dla danych JSON, zobacz http://stackoverflow.com/questions/477816/the-right-json-content-type – Jon

+0

OK, dzięki. wiele błędów! :) +1 –

0

zmianę

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

do

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

dic to NSMutable Dictionary z obiektem i kluczami. baseUrl to adres URL twojego serwera.

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"]; 
Powiązane problemy