11
votes

Comment définir StatusCode dans NsurlResponse

Je remplace Nsurlprotocol et je dois retourner la réponse HTTP avec code de statut spécifique. Nshttpurlreesponse n'a pas de stageCode Setter, j'ai donc essayé de le remplacer par:

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


1 commentaires

Avez-vous trouvé une solution à ce problème?


3 Réponses :


3
votes

u Obtenez le code d'état de l'urlreesponse uniquement. Pas besoin de le définir explicitement: -

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


1 commentaires

Merci de votre réponse. Mais je n'ai pas besoin d'obtenir un code de statut de la réponse HTTP du réseau. Je crée des nsurlreesponse moi-même de le retourner à l'intérieur de Nsurlprotocol remplacé et de définir le code de statut de la réponse.



4
votes

J'ai mis en œuvre la méthode init personnalisée à l'aide du code suivant:

    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];


2 commentaires

Merci de votre réponse. J'ai essayé votre solution et j'ai reçu StatutCode 200. Cela résout mon problème, j'avais besoin d'un statut exact 200. Mais je n'ai pas réussi à définir le statut arbitraire: quel que soit le code d'état défini dans l'invocation par NSInvocation StatutCode de NSInvocation en 200. Avez-vous essayé d'autres codes de statut ? Quoi qu'il en soit, je marque ceci comme une réponse, thnx.


Juste essayé - je peux définir n'importe quel code d'état (je définit 215). Et c'est la même chose sur la page Web - 215.



10
votes

Voici une meilleure solution.

sur iOS 5.0 et up Vous n'avez rien à faire de rien de fou d'API privées ou de surcharge NSHTPURLResponse Code> plus. P>

Pour créer Un NSHTTTTPULRESPONSONSONSONSE CODE> avec votre propre code d'état et des en-têtes, vous pouvez maintenant simplement utiliser: P>

initWithURL:statusCode:HTTPVersion:headerFields:


0 commentaires