2010-11-03 9 views
11

Ich habe einen WCF-Dienst gehostet und ich versuche, es als JSON POST-Anfrage innerhalb einer iPhone App zu verwenden. Ich plane später die JSON Serializer auf verwenden, aber das ist, was ich für die Anforderung haben:JSON POST-Anfrage auf dem iPhone (mit 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]; 

In meiner Daten empfangen ich drucke es nur auf der Konsole:

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

Und innerhalb dieser Antwort Ich erhalte diese Nachricht:

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> 

Weiß jemand, warum das passiert und wo ich falsch liege?

Ich habe gelesen, über ASIHTTPPost stattdessen verwenden, aber ich kann die Demo laufen in iOS4 nicht bekommen :(

Dank

EDIT:

ich CharlesProxy zu sniff nur verwendet haben sie heraus, was passiert, wenn ich aus dem iPhone (Simulator) nennen und das ist, was es gab mir: alt text

Das einzige, was seltsam ich bemerkt habe, ist es sagt " SSL Proxying nicht für diesen Host aktiviert: Aktivieren Sie unter Proxy-Einstellungen, SSL-Speicherorte ". Weiß jemand was das bedeutet? (Dies geschieht auch in meinem Windows-Client).

Ich habe gerade dies auf meinem Windows-Client ausgeführt und das einzige, was anders ist, ist der Request and Response-Text, der verschlüsselt ist. Fehle ich etwas, um eine sichere HTTP-Verbindung zu verwenden?

NEU EDIT: Dies funktioniert mit einer Nicht-HTTPS-Anfrage wie: http://maps.googleapis.com/maps/api/geocode/json?address=UK&sensor=true. Ich schätze, das Problem besteht darin, dass das iPhone den POST ordnungsgemäß über SSL sendet.

Ich benutze auch diese Methoden:

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

Dies ermöglicht es mir, so weit zu kommen. Wenn ich sie nicht benutze, erhalte ich eine Fehlermeldung, die besagt:

Das Zertifikat für diesen Server ist ungültig. Möglicherweise stellen Sie eine Verbindung zu einem Server her, der sich als "mydomain.com" ausgibt, wodurch Ihre vertraulichen Informationen gefährdet werden könnten.

+0

Können Sie die Protokolle in Ihrem Server sehen, wenn sie etwas Interessantes darin haben? – willcodejavaforfood

+0

Ich habe im Moment keinen Zugriff darauf. Ich weiß, dass der Dienst jedoch mit anderen Clients eingerichtet und betrieben wird. –

Antwort

12

FEST!

Geändert:

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

zu:

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

Sie müssen auch diese beiden Methoden:

- (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, hast du nicht vergessen, "NO zurückgeben" in der letzten Zeile der letzten Methode? – Artem

+0

Ich bin mir nicht sicher, ich Rückgabe YES an eine Void-Methode Kann mich nicht erinnern, warum jetzt –

+0

@ ing0 können Sie diese Zeile in Swift-PLZ konvertieren [Anfrage setValue: @ "application/x-www-form-urlencoded" forHTTPHeaderField: @ "Content-Type"] ; –

3

Ich weiß nicht, Objective C überhaupt, sondern versuchen, den Header zu application/json Einstellung übernehmen statt application/jsonrequest.

+0

Versuchte das früher. Sollte es trotzdem so sein? Habe es einfach nochmal gemacht und bekomme immer noch die gleiche Antwort! :( –

+1

'application/json' ist definitiv der richtige MIME-Typ für JSON-Daten. Siehe http://stackoverflow.com/questions/477816/the-right-json-content-type – Jon

+0

OK danke. Das wird wahrscheinlich einer von viele Fehler! :) +1 –

0

Änderung

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

bis

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

dic ist NSMutable Dictionary mit Objekt und Schlüssel. baseUrl ist Ihre Server-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"];