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];
}
}
3 Réponses :
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);
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.
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];
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.
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 Pour créer Un NSHTPURLResponse Code> plus. P> NSHTTTTPULRESPONSONSONSONSE CODE> avec votre propre code d'état et des en-têtes, vous pouvez maintenant simplement utiliser: P> initWithURL:statusCode:HTTPVersion:headerFields:
Avez-vous trouvé une solution à ce problème?