Wie stellt man in NSURLResponse status
-
10-10-2019 - |
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.
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);