Форум программистов, компьютерный форум, киберфорум
Наши страницы
Swift
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
Spelcrawler
531 / 501 / 113
Регистрация: 12.03.2014
Сообщений: 1,666
Завершенные тесты: 1
#1

Http request

26.11.2015, 13:08. Просмотров 1106. Ответов 25
Метки нет (Все метки)

Здравствуйте. Как получить ответ от сервера по url, без всяких асинхронных конструкций? Да, я знаю что нужно все подобные операции делать асинхронно, но мне нужно послать 10 запросов по очереди и если для каждого писать код в блоках получается очень длинная и не читаемая простыня. Поискал информацию - везде говорят, что можно только асинхронно, но как тогда поступают в ситуациях похожих на мою?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.11.2015, 13:08
Ответы с готовыми решениями:

Post autologin request
Всем привет Пишу приложение, которое будет подкючаться к внешнему Веб сайту...

HTTP авторизация
Такая зада, есть web-сервис на sharePoint от Microsoft. Я обращаюсь к нему...

Чужие HTTP-запросы в HTTPS
Привет всем! Возникла интересная задача: Со стороны заказчика пришел...

Отправка HTTP (не HTTPS) запроса в Swift 2.0 с использованием NSURLSession
Доброго времени суток. Возникла проблема с отправкой POST запроса по http....

Ошибки Synapse (HTTP/1.1 400 Bad Request / HTTP/1.1 413 Request Entity Too Large)
Добрый день. При работе с Synapse начали возникать вот такие вот две ошибки...

25
AncientPenguin
98 / 45 / 18
Регистрация: 09.08.2015
Сообщений: 367
26.11.2015, 17:59 #2
Цитата Сообщение от Spelcrawler Посмотреть сообщение
но как тогда поступают в ситуациях похожих на мою?
Да хоть:
послатьЗапрос1()
послатьЗапрос2()
...
послатьЗапрос10()

Не очень понимаю в чем проблема.
0
Spelcrawler
531 / 501 / 113
Регистрация: 12.03.2014
Сообщений: 1,666
Завершенные тесты: 1
26.11.2015, 18:03  [ТС] #3
AncientPenguin, в том что для того, чтобы послать второй запрос мне нужен результат выполнения первого. А все ответы приходят в делегат. И чтобы мне послать по очереди 10 запросов нужно писать уже так:
запрос1(результат{
запрос2(результат{
запрос3...
})
})
И в каждом случае есть несколько вариантов дальнейшего поведения. Т.е. куча проверок на все что можно сбор разных параметров с разных запросов и использование этих параметров в дальнейших запросах. Как это все красиво написать с асинхронными запросами просто не представляю.
0
AncientPenguin
98 / 45 / 18
Регистрация: 09.08.2015
Сообщений: 367
26.11.2015, 19:21 #4
Цитата Сообщение от Spelcrawler Посмотреть сообщение
Как это все красиво написать с асинхронными запросами просто не представляю.
запрос1(...)
{
...
запрос2(результат1)
}


запрос2(...)
{
...
запрос3(результат2)
}

Как вариант.
0
Spelcrawler
531 / 501 / 113
Регистрация: 12.03.2014
Сообщений: 1,666
Завершенные тесты: 1
26.11.2015, 23:07  [ТС] #5
AncientPenguin, ну тут я буду по 2-3 раза каждый запрос выполнять, а когда мне нужны еще и ответы от первых 5 запросов, для совершения восьмого - вообще мрак.
0
AncientPenguin
98 / 45 / 18
Регистрация: 09.08.2015
Сообщений: 367
26.11.2015, 23:52 #6
Цитата Сообщение от Spelcrawler Посмотреть сообщение
ну тут я буду по 2-3 раза каждый запрос выполнять


Я в смысле запросы обернуть в функции или вообще в переменные засунуть.
0
Spelcrawler
531 / 501 / 113
Регистрация: 12.03.2014
Сообщений: 1,666
Завершенные тесты: 1
27.11.2015, 13:58  [ТС] #7
Цитата Сообщение от AncientPenguin Посмотреть сообщение
или вообще в переменные засунуть.
Это как?
0
glvrzzz
95 / 71 / 12
Регистрация: 12.12.2012
Сообщений: 214
27.11.2015, 14:36 #8
Заверните ваши запросы в NSOperation'ы
0
Spelcrawler
531 / 501 / 113
Регистрация: 12.03.2014
Сообщений: 1,666
Завершенные тесты: 1
27.11.2015, 14:46  [ТС] #9
Цитата Сообщение от glvrzzz Посмотреть сообщение
Заверните ваши запросы в NSOperation'ы
Можно по подробнее? Насколько я понял это что-то на подобии AsyncTask из андроид. Если так - с этим проблем нет, распраллелить я смогу как нужно. Вопрос лишь в том как мне последовательно в одном потоке выполнить несколько http запросов.
0
AncientPenguin
98 / 45 / 18
Регистрация: 09.08.2015
Сообщений: 367
27.11.2015, 16:41 #10
Цитата Сообщение от Spelcrawler Посмотреть сообщение
Это как?
let delegate = {
(arg : type) -> returnType
in
...
}
или
var test: (Int, Int) -> Int = testFunc
0
Spelcrawler
531 / 501 / 113
Регистрация: 12.03.2014
Сообщений: 1,666
Завершенные тесты: 1
27.11.2015, 16:54  [ТС] #11
AncientPenguin, ну тут разница не большая получается. Все равно будет непонятная простыня фиг пойми чего. В андроиде у меня реализовано примерно так: есть класс, в котором есть все методы из серверного api, все они возвращают ответ в обертке (собственно сам ответ, код ошибки, если есть, и пару методов для проверок). Далее я запускаю отдельный поток, в нем по очереди вызываю методы из api, проверяю каждый на ошибки, беру нужные мне данные и т.п.. Итоговый результат пишу в бд из того же потока и сообщаю всем подписавшимся что все выполнено (уже в главный поток), и там уже кому что нужно берут прямо из бд. Но в случае с асинхронными запросами такое сделать не получится.
0
AncientPenguin
98 / 45 / 18
Регистрация: 09.08.2015
Сообщений: 367
27.11.2015, 17:27 #12
Spelcrawler, я не знаю как вам еще объяснить, скинете код покажу на примере.

О, придумал, вам надо сделать:

Цитата Сообщение от Spelcrawler Посмотреть сообщение
и сообщаю всем подписавшимся что все выполнено
Первый запрос должен сообщить второму, второй третьему и т.д., каждый запрос знает только про один следующий запрос.
0
Spelcrawler
531 / 501 / 113
Регистрация: 12.03.2014
Сообщений: 1,666
Завершенные тесты: 1
27.11.2015, 17:34  [ТС] #13
Цитата Сообщение от AncientPenguin Посмотреть сообщение
Первый запрос должен сообщить второму, второй третьему и т.д., каждый запрос знает только про один следующий запрос.
Ну это совсем издевательство. Пока написал deprecated код на obj-c - с ним выходят нормальные синхронные запросы. Видимо apple опять за всех решили, как нужно писать код и на swift'e такого не добиться.
0
AncientPenguin
98 / 45 / 18
Регистрация: 09.08.2015
Сообщений: 367
27.11.2015, 18:11 #14
Цитата Сообщение от Spelcrawler Посмотреть сообщение
Ну это совсем издевательство.
Что это? Я вас пытался натолкнуть на мысль как по другому написать код, а не изменить функционал, но ваша фантазия работать не хочет, а виноват оказался эпл.
0
Spelcrawler
531 / 501 / 113
Регистрация: 12.03.2014
Сообщений: 1,666
Завершенные тесты: 1
27.11.2015, 19:02  [ТС] #15
AncientPenguin, не я все понимаю, но конструкция вида
результат1 = запрос1();
результат2 = запрос2(результат1);
намного легче читается чем то что вы предлагаете. Человеку первый раз увидевшему такой код вообще не понятно будет кто и что слушает и где это все описано. Ну и если уж зашла речь про фантазию, то тут как раз ограничение ее - "нам нравится делать так, и вы все делайте так же". Не очень хорошая политика при разработке языка.
0
Vorona
Peace 2 all shining faces
672 / 534 / 84
Регистрация: 05.03.2010
Сообщений: 1,283
29.11.2015, 12:44 #16
Лучший ответ Сообщение было отмечено Spelcrawler как решение

Решение

есть такой паттерн как Promise или Future,
суть такая же как и с колбеками, только это грубо говоря колбеки, обернутые в объекты, над которыми можно проводить разные операции типа компановок и т.д
https://github.com/mxcl/PromiseKit

а есть еще интересней вещь, называется функциональное реактивное программирование (FRP)
грубо говоря, это промисы представленные во времени и с кучей богатейшего функционала
https://github.com/ReactiveCocoa/ReactiveCocoa
https://github.com/ReactiveX/RxSwift

Не хотел нагружать кучей всего, но, по моему мнению, это маст хев знания в современном мире разработки

Добавлено через 2 минуты
Цитата Сообщение от AncientPenguin Посмотреть сообщение
Да хоть:
послатьЗапрос1()
послатьЗапрос2()
...
послатьЗапрос10()
Не очень понимаю в чем проблема.
проблема в адище, который называют callback hell
1
LeninRedStar
5 / 5 / 4
Регистрация: 22.11.2015
Сообщений: 21
29.11.2015, 13:15 #17
а почему sendSynchroniusRequest у NSURLConnection не катит?
0
Spelcrawler
531 / 501 / 113
Регистрация: 12.03.2014
Сообщений: 1,666
Завершенные тесты: 1
03.12.2015, 10:25  [ТС] #18
Цитата Сообщение от LeninRedStar Посмотреть сообщение
а почему sendSynchroniusRequest у NSURLConnection не катит?
Что-то не вышло завести его на свифте под иос 9.1. Тот же самый код на obj-c работает, не знаю с чем связано, сильно не копал. Ну и насколько я понял через него не послать POST запрос.
0
LeninRedStar
5 / 5 / 4
Регистрация: 22.11.2015
Сообщений: 21
03.12.2015, 22:29 #19
да, действительно этот метод задепрекейчен. Можно тогда действительно заюзать аналоги промисов, или например BFTask. Еще вариант правильно сказали обернуть в операцию, внутри операции заюзать какие нибудь dispatch группы или семафоры, чтобы сделать main метод синхронным. Потом эти операции нужно запускать на бекграундной очереди, им можно зависимости настраивать, в общем возможностей прилично.
1
AncientPenguin
98 / 45 / 18
Регистрация: 09.08.2015
Сообщений: 367
04.12.2015, 00:22 #20
Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class facepalm
{
    func fakerequest1()
    {
        var request1 = {
            () -> () in
            self.fakerequest2()
        }
    }
    
    func fakerequest2()
    {
        var request2 = {
            () -> () in
            self.fakerequest3()
        }
    }
    
    func fakerequest3()
    {
        var request3 = {
            () -> () in
            // ...
        }
    }
}
Тега swift не нашел.
0
04.12.2015, 00:22
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.12.2015, 00:22

Warning: file_get_contents(...) failed to open stream: HTTP request failed! HTTP/1.1 401 Unauthorized
<?class VK_Auth{ //ID приложения private $vk_app_id; //Защищенный ключ...

Выполнение http.request http.get
О задаче: Начну с того что мне нужно сделать, мне нужно получить из формы...

File_get_contents failed to open stream: HTTP request failed! HTTP/1.1 505
Ребята подскажите пожалуйста. Использую фреймворк Yii. Пишу небольшой парсер....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru