외부 서비스에 AJAX 호출을하는 UIWebview가 있습니다. 오프라인 때 나는 논문 요청을 잡아서 로컬 JSON을 반환해야합니다. NSURLProtocol과 AJAX 호출을 조롱하는 방법?
가 나는 NSURLProtocol을 구현 내가 AJAX 요청을 잡으려고 관리, 문제는 JQuery와 항상 0 에러 코드를 반환한다 :$.ajax({
url: url,
dataType: 'json',
contentType: "application/json",
success: function(jsonData){
alert("success :");
},
error: function (request, status, error) {
alert("failure :" + request.status);
}
을});
나는 항상 request.status을 얻을 = 0
내 프로토콜을 테스트하기 위해 내 HTML 내부에 이미지를 조롱하기 위해 시도하고 잘 작동합니다. google.fr에서 이미지
- HTML 요청 =>가 아마존에 JSON으로 잘
- AJAX 호출을 작동 =>여기
실패 내 전체 구현 :
#import "EpubProtocol.h"
@implementation EpubProtocol
#pragma mark - NSURLProtocol
+ (BOOL)canInitWithRequest:(NSURLRequest *)request {
BOOL awsRequest = [self request:request contains:@"s3.amazonaws.com"];
BOOL imgRequest = [self request:request contains:@"google.fr"];
BOOL match = awsRequest || imgRequest;
return match;
}
+ (NSURLRequest*)canonicalRequestForRequest:(NSURLRequest*)theRequest
{
return theRequest;
}
- (void)startLoading {
NSURLRequest *request = [self request];
//Mock Amazon call
if([EpubProtocol request:request contains:@"s3.amazonaws.com"]) {
NSString *path = [[NSBundle bundleForClass:self.class] pathForResource:@"epub1" ofType:@"json"];
NSData *data = [NSData dataWithContentsOfFile:path];
[self mockRequest:request mimeType:@"application/json" data:data];
}
//Mock image call
else if([EpubProtocol request:request contains:@"google.fr"]) {
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[NSURLConnection sendAsynchronousRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.itespresso.fr/wp-content/gallery/yahoo/1-yahoo-logo.jpg"]] queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
[self mockRequest:request mimeType:@"image/jpeg" data:data];
}];
}
}
- (void)stopLoading
{
NSLog(@"Did stop loading");
}
#pragma mark - Request utils
+ (BOOL) request:(NSURLRequest*)request contains:(NSString*)domain {
NSString *str = [[request URL] absoluteString];
NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF contains[cd] %@", domain];
return [pred evaluateWithObject:str];
}
#pragma mark - Mock responses
-(void) mockRequest:(NSURLRequest*)request mimeType:(NSString*)mimeType data:(NSData*)data {
id client = [self client];
NSHTTPURLResponse *response = [[NSHTTPURLResponse alloc] initWithURL:[request URL] MIMEType:mimeType expectedContentLength:-1 textEncodingName:nil];
[client URLProtocol:self didReceiveResponse:response
cacheStoragePolicy:NSURLCacheStorageNotAllowed];
[client URLProtocol:self didLoadData:data];
[client URLProtocolDidFinishLoading:self];
}
@end
좋은 직장. 매우 유용한 답변! –
이것은 내 하루를 저장했습니다. 다른 사람들이 궁금해하는 분들을 위해 표준 HTTP 헤더를 사용하여 mimeType, 인코딩, 길이 등을 설정할 수 있습니다 (mimeType one, headers/statusCode). https://en.wikipedia.org/wiki/List_of_HTTP_header_fields. 헤더 사전에 추가하기 만하면됩니다. –