HTTP-запрос через NWConnectionIOS

Программируем под IOS
Ответить
Anonymous
 HTTP-запрос через NWConnection

Сообщение Anonymous »


У меня следующая настройка:
[*]Ноутбук с работающим на нем облегченным сервером (Node.js/Express), скажем, сервер прослушивает порт 3000 и отвечает некоторым JSON на GET /hello. [*]Приложение для iOS
Ноутбук и iOS-устройство соединены в одну локальную сеть посредством кабелей Ethernet. Сервер рекламирует себя в сети (используя пакет узла mdns) под именем, скажем, "simple.server".

Приложение iOS может обнаружить этот сервер с помощью Network framework:

// в начале объявления класса частный браузер var: NWBrowser? функция DiscoverServer() { пусть параметры = NWParameters() self?.browser = NWBrowser(для: .bonjour(type: "_http._tcp", домен: "local.", с использованием: параметров) self?.browser?.stateUpdateHandler = { [слабое self] newState в переключить newState { случай .failed(допустить ошибку): я?.браузер?.отмена() по умолчанию: перерыв } } self?.browser?.browseResultsChangedHandler = { [слабые собственные] результаты, изменения в для изменения в изменениях { изменение переключателя { случай .добавлен(дайте результат): переключить result.endpoint { случай .service(пусть имя, _, _, _): если имя == "простой.сервер" { let Connection = NWConnection (к: result.endpoint, используя: .tcp) Connection.stateUpdateHandler = { newState в переключить newState { чехол .готов: если let InternalEndpoint = Connection.currentPath?.remoteEndpoint, случай .hostPort(пусть хост, пусть порт) = InternalEndpoint { пусть контент = "GET /привет HTTP/1.1\r\n" + "Хост: \(хост)\r\n" + "\р\н" let завершение = ... просто выведите ошибку, если таковая имеется Connection.receive(minimumIncompleteLength: 1, MaximumLength: 10000) {content, _, _, _ в если пусть контент = контент { print(String(данные: содержимое, кодировка: .utf8)) } } Connection.send(содержимое: content.data(с использованием: .utf8), завершение: завершение) ... остальные закрывающие скобки находятся здесь } Этот запрос успешно отправляет HTTP GET (и я предполагаю, что он будет работать и для POST, который я еще не проверял) и получает ответ.

Проблема в том, что ответ представляет собой необработанную строку, например:

"HTTP/1.1 200 OK\r\nX-Powered-By: Express\r\nContent-Type: application/json; charset=utf-8\r\nContent-Length: 215\r\nETag : W/\"d7-/V8YoIpwjOAIzkBGCymxNZtfrTw\"\r\nДата: четверг, 19 октября 2023 г., 12:58:08 GMT\r\nСоединение: Keep-Alive\r\nKeep-Alive: timeout=5\r\n\ r\n{\"items\":\" 1: \\\"что-то\\\"\\r\\n 2: \\\"что-то еще\\\"\\r\\n 3: \ \\"еще один\\\"\\r\\n 4: \\\"и так далее\\\"\\r\\n 5: \\\"и так далее\\\"\\ r\\n 6: \\\"конец\\\"\\r\\n\\n\"}" Чтобы понять смысл такого ответа, мне пришлось бы проанализировать его вручную (например, разбить по разрывам строк, проанализировать код ответа, заголовки, тело и т. д.), что немного громоздко.

Итак, мой вопрос: как мне сделать это лучше?
[*]Есть ли способ правильно проанализировать его в HTTPURLResponse? [*]Может быть, есть лучший способ выполнить запрос? [*]Может быть, мне не стоит делать это через NWConnection, а как-то использовать URLSession после обнаружения сервиса?
Заранее благодарим за любые советы.
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»