0

该场景将是应用程序托管一个 GCDWebServer,并且当它接收到一个 API 请求(如“GET”HTTP 请求)时 - http://serverURL:8080/search/brand?query=benz&page=1. 然后将带有 JSON 格式数据的响应返回给发送者。

我想我应该使用GCDWebServerDataResponse(jsonObject: contentType:).

但是,我有两个问题:

  1. 我应该如何构建响应数据的 json 文件。我应该手动快速创建它还是只在项目中保存一个 json 文件。在 GCDWebServer 中配置 json 数据的通用或正确方法是什么?

  2. 我的请求包括一个查询字符串(“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()
    }
}
4

0 回答 0