如何从URL中删除查询(用于GET参数)?

时间:2013-10-13 20:16:26

标签: ios uiwebview ios7 nsurl nsurlrequest

我正在构建一个小型REST服务来授权用户访问我的应用程序。

有一次,我用来授权用户的UIWebView将转到https://myautholink.com/login.php。此页面使用授权令牌发送JSON响应。关于这个页面的事情是它通过我的授权表格通过GET接收一些数据。我无法使用PHP会话,因为您通过以下方式访问此页面:

header("location:https://myautholink.com/login.php?user_id=1&machine_id=machine_id&machine_name=machine_name&app_id=app_id");

由于标题函数在标题中发送,我无法同时执行session_start();

我可以使用委托方法获取UIWebView的请求URL而不会出现问题:

- (void)webViewDidFinishLoad:(UIWebView *)webView
{
    NSURLRequest *request = [webView request];
    NSLog(@"%@", [[request URL] relativeString]);
    if([[[request URL] absoluteString] isEqualToString:SPAtajosLoginLink])
    {
        //Store auth token and dismiss auth web view.
    }
}

事情是没有NSURL方法似乎没有参数返回“干净”链接。我查看了所有与NSURL url-string相关的方法:

- (NSString *)absoluteString;
- (NSString *)relativeString; // The relative portion of a URL.  If baseURL is nil, or if the receiver is itself absolute, this is the same as absoluteString

但是absoluteString总是带有GET参数的完整URL,而relativeString总是为零。

我正在摸不着头脑,我似乎无法找到解决方案。任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:11)

不要乱用自己的字符串操作,切换到NSURLComponents

NSURLComponents *components = [NSURLComponents componentsWithURL:url];
components.query = nil;     // remove the query
components.fragments = nil; // probably want to strip this too for good measure
url = [components URL];

在iOS 6及更早版本中,您可以引入KSURLComponents以获得相同的结果。

答案 1 :(得分:5)

示例:http://www.google.com:80/a/b/c;params?m=n&o=p#fragment

使用NSURL的这些方法:

         scheme: http
           host: www.google.com
           port: 80
           path: /a/b/c
   relativePath: /a/b/c
parameterString: params
          query: m=n&o=p
       fragment: fragment

或者,在iOS 7中,构建一个NSURLComponents实例,然后使用方法scheme,user,password,host,port,path,query,fragment,将URL的一部分提取出来。然后重新构建基本URL。

NSString* baseURLString = [NSString stringWithFormat:@"%@://%@/%@", URL.scheme, ...
NSURL *baseURL = [NSURL URLWithString:baseURLString];

答案 2 :(得分:5)

要更新iOS 7以后的答案:

NSURLComponents *components = [NSURLComponents componentsWithURL: url resolvingAgainstBaseURL: NO];
components.query = nil;     // remove the query
components.fragment = nil; // probably want to strip this too for good measure
url = [components URL];

请注意,没有'片段'属性。它只是片段'。

否则,这种方法很棒。比担心用URL字符串正确地将URL重新组合在一起要好得多。