程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如何使用NSURLProtocol模拟AJAX调用?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决如何使用NSURLProtocol模拟AJAX调用??

开发过程中遇到如何使用NSURLProtocol模拟AJAX调用?的问题如何解决?下面主要结合日常开发的经验,给出你关于如何使用NSURLProtocol模拟AJAX调用?的解决方法建议,希望对你解决如何使用NSURLProtocol模拟AJAX调用?有所启发或帮助;

问题来自webkit,由于跨域起源请求而阻止了响应。由于我们模拟了响应,因此我们必须强制执行A​​ccess-Control-Allow-Origin。

然后,我们还需要强制响应的内容类型。

这是魔术发生的地方:

NSDictionary *headers = @{@"Access-Control-Allow-Origin" : @"*", @"Access-Control-Allow-headers" : @"Content-Type"};
NShttpURLResponse *response = [[NShttpURLResponse alloc] initWithURL:request.URL statusCode:200 httpVersion:@"1.1" headerFIElds:headers];

该协议的最终实现:

#import "EpubProtocol.h"

@implementation EpubProtocol

#pragma mark - NSURLProtocol

+ (BOol)canInitWithRequest:(NSURLRequest *)request {
    BOol isAwsRequest = [self request:request contains:@"s3.amazonaws.com"];

    return isAwsRequest;
}

+ (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 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 data:(NSData*)data {
    ID clIEnt = [self clIEnt];

    NSDictionary *headers = @{@"Access-Control-Allow-Origin" : @"*", @"Access-Control-Allow-headers" : @"Content-Type"};
    NShttpURLResponse *response = [[NShttpURLResponse alloc] initWithURL:request.URL statusCode:200 httpVersion:@"1.1" headerFIElds:headers];

    [clIEnt URLProtocol:self dIDReceiveResponse:response
     cacheStoragePolicy:NSURLCacheStorageNotAllowed];
    [clIEnt URLProtocol:self dIDLoadData:data];
    [clIEnt URLProtocolDIDFinishLoading:self];
}

@end

Js没什么特别的:

function loadJsONDoc()
{
  var url = "https://s3.amazonaws.com/youboox_recette/epub.Json";

  $.AJAX({
      url: url,
      dataType: 'Json',
       ContentType: "application/Json",
      success: function(JsonData){
        alert('success');
        document.getElementByID("mydiv").INNERHTML='<p>'+$.param(JsonData)+'</p>';
      },
      error: function (request, status, error) {
        alert("failure :" + request.status );
      }
  });
}

解决方法

我有UIWebview,它可以对外部服务进行AJAX调用。离线时,我需要捕获这些请求并返回本地json。

我实现了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 );
  }

});

我总是收到一个请求。状态= 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

大佬总结

以上是大佬教程为你收集整理的如何使用NSURLProtocol模拟AJAX调用?全部内容,希望文章能够帮你解决如何使用NSURLProtocol模拟AJAX调用?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: