GCDWebserver прослушивает HTTP POST

Мне нужно, чтобы мое приложение 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 всегда равен нулю.

Какие-нибудь советы?


person Polis    schedule 28.10.2016    source источник
comment
Обязательно прочитайте README, поставляемый с GCDWebServer, поскольку в нем объясняется, как его использовать, с примерами.   -  person Pol    schedule 29.10.2016


Ответы (2)


  1. Вы не можете запустить веб-сервер на порту 80 на устройстве iOS. Использование порта ниже 1024 требует привилегий root, которых нет у вашего приложения.

  2. путь к веб-серверу не может содержать доменное имя... веб-сервер всегда будет привязываться к адресу устройства... вы просто добавляете URL-адрес конечной точки. "path" будет http://<yourdeviceip>:<port>/path

person Bastian    schedule 28.10.2016
comment
На самом деле это неправда: вы можете открыть порт 80 в своем приложении для iPhone, при этом не требуются привилегии root. Прошло несколько лет с тех пор, как они разрешили это. - person Pol; 29.10.2016

Ваша конфигурация неверна, идея заключается в том, что ваше приложение само становится сервером, который вы можете настроить для приема входящих запросов.

В своем 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
person Marco Pace    schedule 28.10.2016
comment
Спасибо за устранение моего замешательства. Идея общедоступного пути заключается в том, чтобы все устройства, на которых запущено приложение, получали уведомления (т. е. получали POST), а не только IP-адрес одного устройства. это то, чего я пытаюсь добиться. есть ли способ сделать это? - person Polis; 28.10.2016
comment
Я так не думаю, по крайней мере, с этим компонентом: он создает веб-сервер, а это значит, что каждый сервер на каждом устройстве уникален. То, что вы хотите выполнить, должно быть выполнено путем отправки широковещательного сообщения, но вам нужно реализовать другой протокол. - person Marco Pace; 28.10.2016
comment
@Polis Вы не можете сделать это, только запустив веб-сервер в своем приложении для iPhone. Во-первых, сервер будет работать только тогда, когда приложение находится на переднем плане, а во-вторых, вам понадобится сервер, чтобы отслеживать iPhone, на котором запущено ваше приложение, а затем отправлять запрос всем им. Используйте push-уведомления Apple или службы публикации и подписки, такие как pusher.com или pubnub.com. - person Pol; 29.10.2016
comment
@Pol прав - это то, что PubNub и Пушеры преуспевают. Затрудняться с реализацией веб-сервера на вашем телефоне — это слишком много и не нужно. - person Craig Conover; 30.10.2016
comment
Теперь я вижу, что GCDWebServer не подходит для того, что мне нужно. Любая идея, как я могу принимать запросы JSON POST напрямую через мое приложение? - person Polis; 30.10.2016
comment
Если вы хотите принимать запросы JSON POST, вам нужен веб-сервер, такой как GCDWebServer. Но из-за ограничений iOS они не могут работать на практике, пока ваше приложение находится в фоновом режиме. - person Pol; 01.11.2016