该场景将是应用程序托管一个 GCDWebServer,并且当它接收到一个 API 请求(如“GET”HTTP 请求)时 - http://serverURL:8080/search/brand?query=benz&page=1
. 然后将带有 JSON 格式数据的响应返回给发送者。
我想我应该使用GCDWebServerDataResponse(jsonObject: contentType:)
.
但是,我有两个问题:
我应该如何构建响应数据的 json 文件。我应该手动快速创建它还是只在项目中保存一个 json 文件。在 GCDWebServer 中配置 json 数据的通用或正确方法是什么?
我的请求包括一个查询字符串(“query=benz”),如何使用
webServer.addHandler
. 就我而言,我需要根据搜索查询字符串返回不同的过滤数据。
func initWebServer() {
let path = "/search/brand"
webServer.addHandler(forMethod: "GET", path: path, request: GCDWebServerRequest.self, processBlock: { request in
print("Search request detected")
return GCDWebServerDataResponse(jsonObject: <#T##Any#>, contentType: <#T##String#>)
})
webServer.start(withPort: 8080, bonjourName: "My Test Site")
DispatchQueue.main.async {
if let serverURL = self.webServer.serverURL {
print("VISIT \(serverURL) in your web browser")
} else {
print("Not connected!")
}
}
}
经过我自己的一些研究和测试,我发现我可以从 GCDWebServer 处理程序的请求中获取query
&参数。page
如下代码所示,我不确定它是否适合实际产品环境。但根据我的测试,它完全有效。
import SwiftUI
import GCDWebServer
class GCDServer {
lazy var webServer = GCDWebServer()
static var serverURL: URL!
func initWebServer() {
let path = "/search/brand"
webServer.addHandler(forMethod: "GET", path: path, request: GCDWebServerRequest.self, processBlock: { request in
print("WebServer - GET detected")
if let query = request.query {
if query["query"]?.lowercased() == "Nike" {
if let page = query["page"], Int(page)! <= 3 {
return GCDWebServerDataResponse(jsonObject: JsonLoader().jsonStrToDict(forName: "mock-data-page\(page)") ?? [])
} else {
print("Page num cross the limit of 3.")
return nil
}
} else {
print("keyword is not matched!")
return nil
}
}
return nil
})
// Binding server to localhost
do {
try webServer.start(options: ["Port": 8080, "BindToLocalhost": true])
} catch {
print(error)
}
DispatchQueue.main.async {
if let serverURL = self.webServer.serverURL {
GCDServer.serverURL = serverURL
print("VISIT \(serverURL) in your web browser")
} else {
print("Not connected with network!")
}
}
}
func stopWebServer() {
webServer.stop()
}
}