GCDWebserver 监听 HTTP POST

Posted

技术标签:

【中文标题】GCDWebserver 监听 HTTP POST【英文标题】:GCDWebserver listening for HTTP POSTs 【发布时间】:2016-10-28 05:44:55 【问题描述】:

我需要我的 Swift 2.1 应用程序来侦听另一个服务到达我的公共端点的 HTTP POST。不知道如何初始化 GCDWebserver。

let webServer = GCDWebServer()

我试过了:

webServer.addHandlerForMethod("POST", path: "https://myendpoint.com",
    requestClass: GCDWebServerRequest.self, asyncProcessBlock:  request in
    print("WebServer - POST detected")
)
webServer.startWithPort(80, bonjourName: "Web Server")

try! webServer.startWithOptions([GCDWebServerOption_BonjourName: "", GCDWebServerOption_BonjourType: "https://myendpoint.com", GCDWebServerOption_Port : 80, GCDWebServerOption_AutomaticallySuspendInBackground: false])

webServer.addHandlerForMethod("POST", path:"https://myendpoint.com", requestClass: GCDWebServerURLEncodedFormRequest.self, asyncProcessBlock: request in
    print("WebServer: POST captured")
)
webServer.start()

但我没有得到任何地方。

无论我尝试什么,URL 属性都指向我的本地主机,而 publicURL 始终为零。

有什么建议吗?

【问题讨论】:

请务必阅读 GCDWebServer 附带的README,因为它通过示例说明了如何使用它。 【参考方案1】:

    您无法在 ios 设备上的端口 80 上启动网络服务器。使用低于 1024 的端口需要您的应用没有的 root 权限。

    网络服务器路径不能包含域名...网络服务器将始终绑定到设备的地址...您只需添加端点的 url。 "path" 将是 http://<yourdeviceip>:<port>/path

【讨论】:

这不是真的:你可以在你的 iPhone 应用上打开 80 端口,不需要 root 权限。他们允许这样做已经有几年了。【参考方案2】:

您的配置不正确,其背后的想法是您的应用程序本身成为一个服务器,您可以将其配置为接受传入的请求。

在您的 addHandlerForMethod 中,您将路径设置为 "https://myendpoint.com":这没有意义。

您的应用程序将创建一个新服务器,因此它会生成自己的服务器 URL(应该是您设备的 ip,后跟您选择的自定义端口)。

我在 Swift 2.3 中使用它,所以语法本身可能有点不同,但想法是这样的:

// Create the server
let webServer = GCDWebServer()

// Configure different paths
let path = "/action"
webServer.addHandlerForMethod("POST", path: action, requestClass: GCDWebServerRequest.self, asyncProcessBlock:  request in
    print("WebServer - POST detected")
    return GCDWebServerResponse(statusCode: 200)
)

// Start server on port 8080
webServer.startWithPort(8080, bonjourName: nil)

// Print server url
print("Server url: \(webServer.serverURL)")

使用此配置,您的服务器将能够接收路径上的 POST 请求

http://<your-device-ip>:8080/action

【讨论】:

感谢您消除我的困惑。 “公共”路径背后的想法是,所有运行应用程序的设备都会收到通知(即获取 POST),而不仅仅是单个设备 IP 地址。这就是我想要达到的目的。有什么办法吗? 我不这么认为,至少对于那个组件来说不是:它创建了一个 Web 服务器,因此这意味着每台设备上的每台服务器都是独一无二的。你想要完成的应该是发送一个广播消息,但是你需要实现一个不同的协议。 @Polis 你不能只通过在你的 iPhone 应用程序上运行一个网络服务器来做到这一点。首先,服务器只会在应用程序处于前台时运行,其次,您需要一个服务器来跟踪运行您的应用程序的 iPhone,然后向所有这些 iPhone 发送请求。使用 Apple 推送通知或发布订阅服务,例如 pusher.com 或 pubnub.com。 @Pol 是对的——这就是PubNub 和Pusher 做得好的地方。尽管在手机上实现网络服务器的麻烦有点多且没有必要。 我现在看到 GCDWebServer 不是我需要的方法。知道如何通过我的应用直接接受 JSON POST 请求吗?

以上是关于GCDWebserver 监听 HTTP POST的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 GCDWebServer 请求读取 POST 请求的正文

GCDWebServer 如何在请求中添加自定义参数(GET/POST)

需要帮助使用 GCDWebServerDataRequest 实现 GCDWebServer

区分 GCDWebServer 中的表单操作?

iOS:GCDWebServer 在设备上不起作用

tvOS 上的 GCDWebServer