Frage

I außer Kraft setzen NSURLProtocol und Notwendigkeit Rückkehr HTTP-Antwort mit spezifischem status. NSHTTPURLResponse nicht status Setter hat, also versuchte ich es außer Kraft zu setzen mit:

@interface MyHTTPURLResponse : NSHTTPURLResponse {} 

@implementation MyHTTPURLResponse

    - (NSInteger)statusCode {
        return 200; //stub code
    }
@end

Überschrieben startLoading Methode von NSURLProtocol sieht wie folgt aus:

-(void)startLoading
{   
   NSString *url = [[[self request] URL] absoluteString];
   if([url isEqualToString:SPECIFIC_URL]){
       MyURLResponse *response = [[MyURLResponse alloc] initWithURL:[NSURL URLWithString:@"http://fakeUrl"]
       MIMEType:@"text/plain"
       expectedContentLength:0  textEncodingName:nil];

       [[self client] URLProtocol:self     
            didReceiveResponse:response 
            cacheStoragePolicy:NSURLCacheStorageNotAllowed];

       [[self client] URLProtocol:self didLoadData:[@"Fake response string"
            dataUsingEncoding:NSASCIIStringEncoding]];

       [[self client] URLProtocolDidFinishLoading:self];                

       [response release];

    }
    else{   
        [NSURLConnection connectionWithRequest:[self request] delegate:self];   
    }
}

Aber dieser Ansatz nicht funktioniert, ist die Antwort in NSURLProtocol erstellt ist immer mit status = 0 auf der Webseite. Zur gleichen Zeit, Antworten, die von dem Netzwerk von NSURLConnection hat normalen erwarteten status zurückgegeben werden.

Kann mir jemand bitte helfen Sie mit Ideen, wie status explizit erstellt NSURLResponse setzen? Thanx.

War es hilfreich?

Lösung

Ich habe benutzerdefinierte init-Methode folgenden Code implementiert:

    NSInteger statusCode = 200;
    id headerFields = nil;
    double requestTime = 1;

    SEL selector = NSSelectorFromString(@"initWithURL:statusCode:headerFields:requestTime:");
    NSMethodSignature *signature = [self methodSignatureForSelector:selector];

    NSInvocation *inv = [NSInvocation invocationWithMethodSignature:signature];
    [inv setTarget:self];
    [inv setSelector:selector];
    [inv setArgument:&URL atIndex:2];
    [inv setArgument:&statusCode atIndex:3];
    [inv setArgument:&headerFields atIndex:4];
    [inv setArgument:&requestTime atIndex:5];

    [inv invoke];

Andere Tipps

Hier ist eine bessere Lösung.

Auf iOS 5.0 und höher Sie müssen nicht alles verrückt mit privaten APIs zu tun oder Überlastung NSHTTPURLResponse mehr.

Um eine NSHTTPUTLResponse mit Ihrem eigenen Statuscode und Header erstellen, können Sie jetzt einfach verwenden:

initWithURL:statusCode:HTTPVersion:headerFields:

Was nicht in der erzeugten Dokumentation dokumentiert ist aber ist tatsächlich in der NSURLResponse.h Header-Datei und auch als eine öffentliche API markiert, die auf OS X 10.7 und iOS 5.0 verfügbar ist.

Beachten Sie auch, dass, wenn Sie den NSURLProtocol Trick verwenden XMLHTTPRequest Anrufe von einem UIWebView zu machen, dass Sie den Access-Control-Allow-Origin Header entsprechend eingestellt werden müssen. Andernfalls werden die XMLHTTPRequest Sicherheit Tritte in und obwohl Ihr NSURLProtocol erhalten und die Anfrage behandeln, werden Sie nicht in der Lage sein, eine Antwort zu senden.

U erhalten Sie den Status-Code aus dem URLResponse nur. Keine Notwendigkeit, setzen sie ausdrücklich: -

    NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&requestError];  

    NSString *responseString = [[[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding] autorelease];
    NSLog(@"ResponseString:%@",responseString);

    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
    int statusCode = [httpResponse statusCode];
    NSLog(@"%d",statusCode);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top