我有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中模拟图像,并且效果很好。
这是我的完整实现:
#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
问题来自webkit,由于跨域起源请求而阻止了响应。由于我们模拟了响应,因此我们必须强制执行Access-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 );
}
});
}
问题内容: 我正在使用curl(通过PHP)抓取一个网站,我想要的一些信息是产品列表,默认情况下仅显示前几个产品。其余的将在用户单击按钮以获取产品的完整列表时传递给用户,从而触发ajax调用以返回该列表。 简而言之,这是他们使用的JS: 这是我的PHP脚本: 这将在该站点上产生一个错误页面。我认为主要原因可能是: 他们检查这是否是ajax请求(不知道如何解决) 令牌必须在标题中,而不在post变量
问题内容: 我正在做一个项目,其中我的解析器 窃取了 有关特定站点上每个视频的数据,并将其保存到我的数据库中。除了指向隐藏视频的完整链接之外,我已完成所有工作。 有一个播放器,它会自动从页面加载开始。我发现启动播放器的JavaScript代码: 通话后,因此,如果没有错误发现它开始使用播放器 的文件名 从 响应 。那就是我所需要的。 我重新检查了 Live HTTP标头中 的呼叫: 因此它使用特定
出于学校目的,我正在创建一个使用股票API的应用程序。 我正在尝试为一种获取过去10年所有股票数据的方法编写一个测试。我不想实际获取所有这些数据,而是想抛出一个异常。 我想测试的方法: 股票时间系列(....)调用可以抛出阿尔法仓位异常。 我这样嘲弄了TimeSeries类: 在我的测试类中,我想模拟这个调用,并返回一个异常而不是实际数据。 无论我多么试图嘲笑这段代码,它永远不会抛出异常。它将始终
问题内容: 我正在尝试编写一个JUnit测试用例,用于测试助手类中的方法。该方法使用REST调用外部应用程序,而这正是我试图在JUnit测试中模拟的调用。 helper方法使用Spring的RestTemplate进行REST调用。 在测试中,我创建了一个模拟REST服务器和一个模拟REST模板,并按如下所示实例化它们: 然后,我给模拟服务器添加种子,以便当助手方法进行REST调用时它应返回适当的
我想测试,为此,我需要模拟调用。为此,我尝试了以下方法,但没有成功: 仍然在调用真正的而不是返回模拟响应。 如何使用Mockito模拟对的调用?
我需要从AnyLogic调用R脚本。我有一个代理“传感器”,它将从一个特定的位置发送一个随机文件到一个R脚本,然后R脚本将分析该文件,并让我们知道该文件的类型(图像、声音、文本等) 请让我知道如何从AnyLogic调用R脚本。。