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

And*_*nez 2 nsurl uiwebview nsurlrequest ios ios7

我正在构建一个小型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");
Run Code Online (Sandbox Code Playgroud)

由于标题函数在标题中发送,我不能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.
    }
}
Run Code Online (Sandbox Code Playgroud)

事情是没有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
Run Code Online (Sandbox Code Playgroud)

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

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

Mik*_*lah 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];
Run Code Online (Sandbox Code Playgroud)

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


Jan*_*ano 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
Run Code Online (Sandbox Code Playgroud)

或者,在iOS 7中,构建一个NSURLComponents实例,然后使用方法scheme,用户,密码,主机,端口,路径,查询,片段,将URL的一部分提取出来.然后重新构建基本URL.

NSString* baseURLString = [NSString stringWithFormat:@"%@://%@/%@", URL.scheme, ...
NSURL *baseURL = [NSURL URLWithString:baseURLString];
Run Code Online (Sandbox Code Playgroud)


Sim*_*son 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];
Run Code Online (Sandbox Code Playgroud)

请注意,没有'碎片'属性.这只是'片段'.

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