Swift:从字符串相对于基本URL创建url

时间:2017-02-09 11:07:28

标签: swift url relative-path

具有简单的端点枚举,例如:

enum TraccarEndpoint: Endpoint {

    case server

    var baseURL: URL {
        return URL(string: "http://demo.traccar.org/api")!
    }

    var path: String {
        switch self {
        case .server:
            return "/server"
        }
    }

    var url: URL {
        let path = self.path
        let baseURL = self.baseURL
        let url = URL(string: path, relativeTo: baseURL)
        return url!
    }
}

期待self.url =“http://demo.traccar.org/server”,但是self.url =“/ server - ttp://www.traccar.org/api”。那是什么?

4 个答案:

答案 0 :(得分:4)

这是描述URL的方式。你的网址是正确的,不用担心。打印url.absoluteString以说服自己

您可以使用url.absoluteURL

获取绝对网址

答案 1 :(得分:0)

好吧,我复制你的代码

enum TraccarEndpoint {

    case server

    var baseURL: URL {
        return URL(string: "http://demo.traccar.org/api")!
    }

    var path: String {
        switch self {
        case .server:
            return "/server"
        }
    }

    var url: URL {
        let path = self.path
        let baseURL = self.baseURL
        let url = URL(string: path, relativeTo: baseURL)
        return url!
    }
}

网址字符串是/ server - http://demo.traccar.org/api

不同的是TraccarEndpoint不继承Endpoint。 EndPoint的baseURL字符串是“http://www.traccar.org/api”吗? 如果是,您可以看到此网络Method Dispatch in Swift

它可以帮助您了解有关swift的Method Dispatch。

答案 2 :(得分:0)

我发现解决方案将/从路径移动到baseURL:

http://demo.traccar.org/api/ 

而不是

 http://demo.traccar.org/api

和:server代替/server

答案 3 :(得分:0)

以下是baseURL和相对路径如何相互作用的一些示例:

NSURL *baseURL = [NSURL URLWithString:@"http://example.com/v1/"];
[NSURL URLWithString:@"foo" relativeToURL:baseURL];                  // http://example.com/v1/foo
[NSURL URLWithString:@"foo?bar=baz" relativeToURL:baseURL];          // http://example.com/v1/foo?bar=baz
[NSURL URLWithString:@"/foo" relativeToURL:baseURL];                 // http://example.com/foo
[NSURL URLWithString:@"foo/" relativeToURL:baseURL];                 // http://example.com/v1/foo
[NSURL URLWithString:@"/foo/" relativeToURL:baseURL];                // http://example.com/foo/
[NSURL URLWithString:@"http://example2.com/" relativeToURL:baseURL]; // http://example2.com/