Спасибо что поделились рецептом. По ходу чтения кода появился вопрос.
Что происходит в следующей строчке кода?
listener2 := listener1.(*net.TCPListener)
Не могу понять что мы имеем в listener1 на этот момент.
Спасибо.
Отсутствие daemon режима, по моему скромному мнению,
для подобных вещей является скорее современной тенденцией.
Создавать daemon-ов и управлять ими это работа,
например, для upstart script, с которой он прекрасно справляется.
Обязательно посмотрите в сторону upstart — несколько
строчек в конфиг файле который лежит в /etc/init
делают удивительные вещи.
> Помогает чем?
Помогает поддерживать API в постоянно изменяющихся условиях.
Смотришь на решения которые принимал несколько лет назад и
видишь — такой подход хорош. С точки зрения клиенской библиотеки
и с точки зрения структуры исходного кода. Позольте объяснить подробней.
Очень редко операции по изменению данных касаются одного ресурса.
Обычно изменения происходят в рамках одной транзакции.
Вот мы эту транзакцию и создаем делая POST.
Ведь если нужно изменить одно поле — делаем PUT, не так ли?
> Речь о параметре в URI, или вообще в запросе?
В запросе. Хотя даже /item/id/do-something я тоже стараюсь избегать.
Наверное потому что потратив много времени в борьбе с чужими API
и на разработку своих, считаю Computation REST наиболее близким к идеалу.
Но нужно понимать что правило «don't do POST with action» это не догма, а способ
сделать жизнь простого разработчика проще. Который работает для меня.
> POST /api.cfm/messages/8?action=archive
Я читал где то, что если Вы делаете POST и передаете
параметр action это почти всегда плохо. И в целом
уже несколько лет такое правило мне здорово помогает.
Лучше делать POST /api.cfm/archive и в теле запроса message=8
В ответ сервер возвращает ID транзакции по которому можно
опрашивать состояние операции.
Вы наверное в институте не учились, поэтому не знаете следующего: ;))
C XX века известно, что некоторые навыки которые в течении жизни приобретает мужчина, могут быть переданы его сыну через Y хромосому.
PS. Лично я не дал бы ломаного цента, за этот и другие научные факты
связанные с эволюцией. Все так туманно.
С правилом Паретто часто допускают одну ошибку. Говорят, давайте будем обслуживать 20% клиентов котороые приносят 80% прибыли. Остальных — в сад.
Однако через короткое время оказывается — чтобы были высокоприбыльные клиенты должны быть и те, другие 80%, низкоприбыльных. Жизнь не стоит на месте. Сегодня тебе клиент принес 10, а завтра 1000. Но обслуживать ты его должен хорошо в любом случае.
Интересно. Хотя это ошибки валидации, количество которых предсказать трудно.
И, цитируя вашу цитату — 5xx Server Error The server failed to fulfill an apparently valid request —
ключевое слово apparently valid. А здесь есть сомнения что запрос валидный. То есть с точки зрения формы он валидный, но содержание подкачало.
Наверно ближе всего 400, что для меня значит — не нужно повторять этот запрос.
Но тоже есть сомнения.
Так что пока возвращаю статус 200,
имея в виду «у нас нет проблем с обменом данными, все в порядке с доступом»,
ну а содержание сообщения это уже другой вопрос.
Тем более, может я хочу одни и те же JSON сообщения отправлять через
HTTP, AMQP, ZeroMQ…
Мне тоже нравится идея возвращать только статус.
Однако возвращаю {'ok': false, 'error': 'Some valuable parameter is not provided}
А иначе как? Status 400 и описание ошибки в теле ответа? в виде HTML?
Спасибо.
Что происходит в следующей строчке кода?
listener2 := listener1.(*net.TCPListener)
Не могу понять что мы имеем в listener1 на этот момент.
Спасибо.
Выбрана подходящая задача и стиль повествования близок к идеалу.
Продолжение приветствуется категорически.
для подобных вещей является скорее современной тенденцией.
Создавать daemon-ов и управлять ими это работа,
например, для upstart script, с которой он прекрасно справляется.
Обязательно посмотрите в сторону upstart — несколько
строчек в конфиг файле который лежит в /etc/init
делают удивительные вещи.
Помогает поддерживать API в постоянно изменяющихся условиях.
Смотришь на решения которые принимал несколько лет назад и
видишь — такой подход хорош. С точки зрения клиенской библиотеки
и с точки зрения структуры исходного кода. Позольте объяснить подробней.
Очень редко операции по изменению данных касаются одного ресурса.
Обычно изменения происходят в рамках одной транзакции.
Вот мы эту транзакцию и создаем делая POST.
Ведь если нужно изменить одно поле — делаем PUT, не так ли?
> Речь о параметре в URI, или вообще в запросе?
В запросе. Хотя даже /item/id/do-something я тоже стараюсь избегать.
Наверное потому что потратив много времени в борьбе с чужими API
и на разработку своих, считаю Computation REST наиболее близким к идеалу.
Но нужно понимать что правило «don't do POST with action» это не догма, а способ
сделать жизнь простого разработчика проще. Который работает для меня.
PS. www.erenkrantz.com/CREST/
Я читал где то, что если Вы делаете POST и передаете
параметр action это почти всегда плохо. И в целом
уже несколько лет такое правило мне здорово помогает.
Лучше делать POST /api.cfm/archive и в теле запроса message=8
В ответ сервер возвращает ID транзакции по которому можно
опрашивать состояние операции.
Единственное что я бы добавил — работа с libvirt не из под root.
wiki.libvirt.org/page/SSHPolicyKitSetup
C XX века известно, что некоторые навыки которые в течении жизни приобретает мужчина, могут быть переданы его сыну через Y хромосому.
PS. Лично я не дал бы ломаного цента, за этот и другие научные факты
связанные с эволюцией. Все так туманно.
Где можно почитать что это значит — «кластер»?
Однако через короткое время оказывается — чтобы были высокоприбыльные клиенты должны быть и те, другие 80%, низкоприбыльных. Жизнь не стоит на месте. Сегодня тебе клиент принес 10, а завтра 1000. Но обслуживать ты его должен хорошо в любом случае.
И, цитируя вашу цитату — 5xx Server Error The server failed to fulfill an apparently valid request —
ключевое слово apparently valid. А здесь есть сомнения что запрос валидный. То есть с точки зрения формы он валидный, но содержание подкачало.
Наверно ближе всего 400, что для меня значит — не нужно повторять этот запрос.
Но тоже есть сомнения.
Так что пока возвращаю статус 200,
имея в виду «у нас нет проблем с обменом данными, все в порядке с доступом»,
ну а содержание сообщения это уже другой вопрос.
Тем более, может я хочу одни и те же JSON сообщения отправлять через
HTTP, AMQP, ZeroMQ…
Однако возвращаю {'ok': false, 'error': 'Some valuable parameter is not provided}
А иначе как? Status 400 и описание ошибки в теле ответа? в виде HTML?
Спасибо.