NSURLRequest具有多个参数

时间:2012-06-25 01:30:59

标签: iphone ios nsurlrequest

我正在尝试设置NSURLRequest来下载一个简单的index.html及其externa style.css表,但我不太清楚如何做到这一点..我只是将请求的URL格式化为我想要的文件..但这必须略有不同,我找不到我想要做的好例子。

到目前为止,这是我的代码:

#pragma mark - NSURLConnection methods

- (void)htmlRequest
{
    // Create the request.
    NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.mywebsite.com/index.html"]
                                              cachePolicy:NSURLRequestReloadIgnoringCacheData
                                          timeoutInterval:60.0];

    // create the connection with the request
    // and start loading the data
    NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
    if (theConnection) {
        // Create the NSMutableData to hold the received data.
        // receivedData is an instance variable declared elsewhere.
        receivedData = [NSMutableData data];
    } else {
        // Inform the user that the connection failed.
        NSLog(@"Connection Fail");
    }
}


- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    // This method is called when the server has determined that it
    // has enough information to create the NSURLResponse.

    // It can be called multiple times, for example in the case of a
    // redirect, so each time we reset the data.

    // receivedData is an instance variable declared elsewhere.
    [receivedData setLength:0];
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{

    // Append the new data to receivedData.
    // receivedData is an instance variable declared elsewhere.
    [receivedData appendData:data];
}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
    // inform the developer of error type

}

// This method uses methodName to determin which Initalizer method to send the response data to in EngineResponses.m
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
//    EngineResponses *engineResponses = [EngineResponses sharedManager];

//        [engineResponses GetManufacturers:receivedData];

    NSString *myString = [[NSString alloc] initWithData:receivedData encoding:NSUTF8StringEncoding];
    NSLog(@"%@", myString);

}

你可以看到我直接调用index.html ..我想知道如何格式化我的请求所以我得到了index.html以及style.css

任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:1)

我总是创建一个新的数据结构,它具有-connection属性和-request属性,就像这样

@interface connectionWrapper : NSObject
@property(retain) NSURLRequest *request
@property(retain) NSURLConnection *connection

通过将此数据结构保留在可变数组中,您可以通过迭代数组来区分回调方法中的连接,并将每个connectionWrapper实例的-connection属性与回调方法的connection参数进行比较(如果它们匹配) (指向同一个对象),然后您可以检索connectionWrapper实例的-request属性,然后检索NSURLRequest实例的-url属性。

由于我不是母语为英语的人,我认为代码是一个更好的导师。

-(NSURLRequest*)getRequestByConnection:(NSURLConnection*)connection
{
    for(connectionWrapper *w in theArrayContainingAllConnectionWrappers)
    {
        if(w == connection)
            return w.request;
    }
}

在回调方法中:

-(void)connection:(NSURLConnection*)connection didReceiveResponse(NSURLResponse*)response
{
    NSURLRequest *request = [self getRequestByConnection:connection];
    NSURL *url = [request url];
    /*apply different approach to different url/*
}

PS:非常难过NSURLConnection没有-request属性,因此我们可以轻松检索与连接相关的请求。

答案 1 :(得分:1)

无论如何,您必须提出2个请求。即使您直接在Web浏览器中打开网页,浏览器也会对其下载的HTML中引用的CSS文件单独发出请求。如果您的应用程序需要HTML和CSS文件,那么您希望它发出2个单独的URL请求,首先获取HTML然后获取CSS文件。

现在,仅仅因为需要进行2次请求,这并不意味着您将始终需要编写发出这2个请求的代码。可能是像@Slee推荐的那些库自动获取第一个请求的结果,将它们解析出来,并对任何引用的CSS文件发出请求。我没有和他们合作过,所以我不确定他们支持什么,或者是否有任何图书馆会为你做这件事。

您可能想要考虑的一件事是通过UIWebView加载HTML和CSS,而不是手动处理它。 UIWebView将尝试将HTML文件加载,解析和呈现到UI组件中。在此过程中,它将加载引用的CSS和JavaScript文件并将其应用于其渲染。如果你想做一些特别的事情,比如拦截它加载CSS文件的调用,你可以实现UIWebViewDelegate协议并设置UIWebView的委托。在该委托中,您可以实现-webView:shouldStartLoadWithRequest:navigationType:方法,以便在Web视图加载CSS文件时收到通知。您可以使用对该方法的调用来查看为CSS发出的请求,并对请求执行其他有趣的操作。

答案 2 :(得分:0)

你知道.css文件的名称吗?

如果是这样的话,我只会发出2个请求,否则你将不得不编写一个解析器来查找到css的链接并反正发出第二个请求。

我还建议调查一个库来处理这些东西的下载 - 很多很棒的库,可以通过高级功能为您提供繁重的工作。

这是我用过的3个:

http://blog.mugunthkumar.com/coding/ios-tutorial-advanced-networking-with-mknetworkkit/

https://github.com/tonymillion/TMHTTPRequest

https://github.com/pokeb/asi-http-request