<
  • Главная
Статьи

Понимание RPC и REST для HTTP API

  1. Дальнейшее чтение на SmashingMag:
  2. Для чего они?
  3. Когда действия не могут быть запоздалыми мыслями
  4. Используйте как REST, так и RPC
  5. Резюме

В течение последних нескольких лет, когда кто-то хочет начать создавать HTTP API, он в значительной степени использует REST в качестве архитектурного стиля перехода по сравнению с альтернативными подходами, такими как XML-RPC, SOAP и JSON-RPC. Многие считают, что REST в конечном итоге превосходит другие подходы, основанные на RPC, что немного вводит в заблуждение, потому что они просто разные. В этой статье рассматриваются эти два подхода в контексте построения HTTP API, потому что именно так они чаще всего используются. REST и RPC могут использоваться через другие транспортные протоколы, такие как AMQP, но это совсем другая тема.

В течение последних нескольких лет, когда кто-то хочет начать создавать HTTP API, он в значительной степени использует REST в качестве архитектурного стиля перехода по сравнению с альтернативными подходами, такими как XML-RPC, SOAP и JSON-RPC. Многие считают, что REST в конечном итоге превосходит другие подходы, основанные на RPC, что немного вводит в заблуждение, потому что они просто разные.

Многие считают, что REST в конечном итоге превосходит другие подходы, основанные на RPC, что немного вводит в заблуждение, потому что они просто разные

В этой статье рассматриваются эти два подхода в контексте построения HTTP API потому что именно так они чаще всего используются. RPC и REST могут использоваться через другие транспортные протоколы, такие как AMQP, но это совершенно другая тема.

Дальнейшее чтение на SmashingMag:

REST расшифровывается как «презентация», описанная Роем Филдингом в его диссертация , К сожалению, эта диссертация не получила широкого распространения, и у многих людей есть собственное представление о том, что такое REST, что приводит к путанице и разногласиям. REST - это все о взаимоотношениях клиент-сервер, когда данные на стороне сервера доступны через представления данных в простых форматах, часто в JSON и XML. Эти представления для ресурсов или наборов ресурсов, которые затем могут быть изменены, а действия и отношения могут быть обнаружены с помощью метода, известного как гипермедиа. Гипермедиа является фундаментальной для REST и представляет собой просто концепцию предоставления ссылок на другие ресурсы.

Помимо гипермедиа есть несколько других ограничений, таких как:

  • REST должен быть без сохранения состояния: не сохранять сеансы между запросами.
  • Ответы должны объявлять кешируемость: помогает масштабировать API, если клиенты соблюдают правила.
  • REST фокусируется на единообразии: если вы используете HTTP, вы должны использовать возможности HTTP, когда это возможно, вместо того, чтобы придумывать соглашения.

Эти ограничения (плюс еще несколько ) позволяют архитектуре REST помогать API-интерфейсам работать десятилетиями, а не годами.

До того как REST стал популярным (после того, как такие компании, как Twitter и Facebook пометили свои API как REST), большинство API создавалось с использованием XML-RPC или SOAP. XML-RPC был проблематичным, потому что обеспечить типы данных XML полезных данных сложно. В XML многие вещи являются просто строками, поэтому вам нужно наложить метаданные сверху, чтобы описать такие вещи, как то, какие поля соответствуют каким типам данных. Это стало частью основы для SOAP (Simple Object Access Protocol). XML-RPC и SOAP, наряду с собственными доморощенными решениями, долгое время доминировали в API-интерфейсе и были основаны на RPC-HTTP-API.

Часть «RPC» означает «удаленный вызов процедуры», и это по сути то же самое, что вызов функции в JavaScript, PHP, Python и т. Д. С получением имени метода и аргументов. Поскольку XML не является чашей чая для всех, RPC API может использовать Протокол JSON-RPC или вы можете свернуть пользовательский API на основе JSON, как слабина сделал с его Веб-API ,

Возьмем этот пример вызова RPC:

POST / sayHello HTTP / 1.1 ВЕДУЩИЙ: api.example.com Тип содержимого: application / json {"name": "Racey McRacerson"}

В JavaScript мы сделали бы то же самое, определив функцию, и позже мы бы вызвали ее в другом месте:

/ * Подпись * / function sayHello (name) {// ...} / * Использование * / sayHello ("Racey McRacerson");

Идея та же. API строится путем определения открытых методов; затем методы вызываются с аргументами. RPC - это просто набор функций, но в контексте HTTP API, который влечет за собой помещение метода в URL и аргументов в строке или теле запроса. SOAP может быть невероятно многословным для доступа к схожим, но различным данным, таким как отчеты. Если вы будете искать «пример SOAP» в Google, вы найдете пример из Google, который демонстрирует метод с именем getAdUnitsByStatement, который выглядит следующим образом:

<? xml version = "1.0" encoding = "UTF-8"?> <soapenv: Envelope xmlns: soapenv = "http://schemas.xmlsoap.org/soap/envelope/" xmlns: xsd = "http: // www.w3.org/2001/XMLSchema "xmlns: xsi =" http://www.w3.org/2001/XMLSchema-instance "> <soapenv: Header> <ns1: RequestHeader soapenv: actor =" http: // schemas.xmlsoap.org/soap/actor/next "soapenv: mustUnderstand =" 0 "xmlns: ns1 =" https://www.google.com/apis/ads/publisher/v201605 "> <ns1: networkCode> 123456 < / ns1: networkCode> <ns1: applicationName> DfpApi-Java-2.1.0-dfp_test </ ns1: applicationName> </ ns1: RequestHeader> </ soapenv: Header> <soapenv: Body> <getAdUnitsByStatement xmlns = "https: / /www.google.com/apis/ads/publisher/v201605 "> <filterStatement> <query> WHERE parentId IS NULL LIMIT 500 </ query> </ filterStatement> </ getAdUnitsByStatement> </ soapenv: Body> </ soapenv: Конверт>

Это огромная полезная нагрузка, все это просто, чтобы обернуть этот аргумент:

<query> WHERE parentId равен NULL LIMIT 500 </ query>

В JavaScript это будет выглядеть так:

/ * Подпись * / function getAdUnitsByStatement (filterStatement) {// ...}; / * Использование * / getAdUnitsByStatement ('WHERE parentId IS NULL LIMIT 500');

В более простом JSON API это может выглядеть примерно так:

POST / getAdUnitsByStatement HTTP / 1.1 HOST: api.example.com Тип содержимого: application / json {"filter": "WHERE parentId IS NULL LIMIT 500"}

Несмотря на то, что эта полезная нагрузка намного проще, нам все же нужны разные методы для getAdUnitsByStatement и getAdUnitsBySomethingElse. REST очень быстро начинает выглядеть «лучше», когда вы смотрите на примеры, подобные этому, потому что он позволяет комбинировать общие конечные точки с элементами строки запроса (например, GET / ads? Statement = {foo} или GET / ads? Что-то = { бар}). Вы можете комбинировать элементы строки запроса, чтобы получить GET / ads? Statement = {foo} & limit = 500, вскоре избавившись от странного синтаксиса в стиле SQL, который отправляется в качестве аргумента.

Пока что REST выглядит лучше, но только потому, что эти примеры используют RPC для чего-то, что REST более искусен в обработке. Эта статья не будет пытаться обрисовать, что «лучше», а скорее поможет вам принять обоснованное решение о том, когда один из подходов может быть более подходящим.

Для чего они?

API на основе RPC отлично подходят для действий (то есть процедур или команд).

API на основе REST отлично подходят для моделирования вашего домена (то есть ресурсов или объектов), делая CRUD (создание, чтение, обновление, удаление) доступным для всех ваших данных.

REST - это не только CRUD, но и все, что делается с помощью операций на основе CRUD. REST будет использовать методы HTTP, такие как GET, POST, PUT, DELETE, OPTIONS и, мы надеемся, PATCH, чтобы обеспечить смысловое значение для намерения предпринимаемого действия.

RPC, однако, не будет этого делать. Большинство используют только GET и POST, причем GET используется для получения информации, а POST используется для всего остального. Обычно RPC API используют что-то вроде POST / deleteFoo с телом {«id»: 1} вместо подхода REST, который будет DELETE / foos / 1.

Это не важная разница; это просто деталь реализации. Самая большая разница, на мой взгляд, заключается в том, как действия обрабатываются. В RPC у вас просто есть POST / doWhwhatThingNow, и это довольно ясно. Но с REST, используя эти CRUD-подобные операции, вы можете почувствовать, что REST не справляется ни с чем, кроме CRUD.

Ну, это не совсем так. Триггерные действия могут быть выполнены с любым подходом; но в REST этот триггер можно рассматривать скорее как последействие. Например, если вы хотите «отправить сообщение» пользователю, RPC будет следующим:

POST / SendUserMessage HTTP / 1.1 Хост: api.example.com Тип содержимого: application / json {"userId": 501, "message": "Hello!"}

Но в REST то же действие будет таким:

POST / users / 501 / messages HTTP / 1.1 Хост: api.example.com Тип контента: application / json {"message": "Привет!"}

Здесь есть довольно концептуальная разница, даже если они выглядят довольно похоже:

  • RPC . Мы отправляем сообщение, и это может привести к тому, что что-то сохранится в базе данных для сохранения истории, что может быть другим вызовом RPC, возможно, с теми же именами полей - кто знает?
  • ОТДЫХ . Мы создаем ресурс сообщений в коллекции сообщений пользователя. Мы можем легко увидеть историю этого, выполнив GET для того же URL, и сообщение будет отправлено в фоновом режиме.

Эти «действия происходят как запоздалая мысль» могут быть использованы в REST, чтобы позаботиться о многих вещах. Представьте себе совместное приложение, которое имеет «поездки». Эти поездки должны иметь действия «запуск», «завершение» и «отмена», иначе пользователь никогда не узнает, когда они начались или закончили.

В REST API у вас уже есть GET / trips и POST / trips, поэтому многие люди пытаются использовать конечные точки, которые немного похожи на подресурсы, для следующих действий:

  • POST / поездки / 123 / начало
  • POST / поездки / 123 / отделка
  • POST / поездки / 123 / отмена

По сути, это встраивание конечных точек в стиле RPC в REST API, что, безусловно, является популярным решением, но технически не является REST. Этот кроссовер является признаком того, насколько сложно может быть выполнение действий в REST. Поначалу это может быть неочевидно, но возможно. Один из подходов заключается в использовании конечного автомата в чем-то вроде поля состояния:

PATCH / trips / 123 HTTP / 1.1 Хост: api.example.com Тип контента: application / json {"status": "in_progress"}

Как и в любом другом поле, вы можете ПАТЧИРОВАТЬ новое значение статуса и иметь некоторую логику в фоновом режиме для запуска любых важных действий:

Состояния модуля класса Trip включают Statesman :: Состояние машины: местоположение, начальное: истинное состояние: состояние in_progress: полный переход от:: определение местоположения, к: [: in_progress] переход от:: in_progress, к: [: complete] after_transition (from: : locating, to:: in_progress) do | trip | start_trip (trip) end after_transition (от:: in_progress, до:: complete) do | trip | end_trip (trip) конец конец конец

государственный деятель невероятно простой конечный автомат для Ruby, написанный GoCardless команда. Есть много других конечных автоматов на многих других языках, но это легко продемонстрировать.

В основном, здесь, в ваших контроллерах, код lib или DDD где-то логика, вы можете проверить, было ли передано «status» в запросе PATCH, и, если это так, вы можете попробовать перейти к нему:

resource.transition_to! (: in_progress)

Когда этот код выполняется, он либо успешно выполнит переход и выполнит любую логику, определенную в блоке after_transition, либо выдаст ошибку.

Успешные действия могут быть любыми: отправка электронного письма, отправка push-уведомления, обращение в другую службу, чтобы начать отслеживать местоположение водителя по GPS, чтобы сообщить, где находится автомобиль - что угодно.

Не было необходимости в методе POST / startTrip RPC или конечной точке REST-ish POST / trips / 123 / start, поскольку его можно было просто последовательно обрабатывать в рамках соглашений API REST.

Когда действия не могут быть запоздалыми мыслями

Здесь мы увидели два подхода к подгонке действий внутри REST API, не нарушая его RESTfulness, но в зависимости от типа приложения, для которого создается API, эти подходы могут начать все меньше и меньше логизироваться и больше походить на прыжки через обручи. Можно задаться вопросом: почему я пытаюсь встроить все эти действия в REST API? RPC API может быть отличной альтернативой или новой службой, дополняющей существующий REST API. Slack использует веб-API на основе RPC, потому что то, над чем он работает, просто не вписывается в REST. Представьте себе, что вы предлагаете пользователям варианты «ударить», «запретить» или «уйти», чтобы пользователи покидали или удалялись из одного канала или из всей команды Slack, используя только REST:

DELETE / users / jerkface HTTP / 1.1 Хост: api.example.com

Сначала DELETE кажется наиболее подходящим методом HTTP для использования, но этот запрос настолько расплывчатый. Это может означать полное закрытие учетной записи пользователя, что может сильно отличаться от запрета пользователя. Хотя это может быть любой из этих вариантов, это определенно не будет ударом или уходом. Другим подходом может быть попытка PATCHing:

PATCH / users / jerkface HTTP / 1.1 Хост: api.example.com Тип контента: application / json {"status": "kicked"}

Это было бы странно, поскольку статус пользователя не был бы изменен глобально, поэтому ему потребовалась бы дополнительная информация для указания канала:

PATCH / users / jerkface HTTP / 1.1 Хост: api.example.com Тип контента: application / json {"status": "kicked", "kick_channel": "catgifs"}

Некоторые люди пробуют это, но это все еще странно, потому что передается новое произвольное поле, и это поле фактически не существует для пользователя в противном случае. Отказавшись от этого подхода, мы могли бы попытаться работать с отношениями:

УДАЛИТЬ / channel / catgifs / users / jerkface HTTP / 1.1 Хост: api.example.com

Это немного лучше, потому что мы больше не связываемся с глобальным ресурсом / users / jerkface, но в нем по-прежнему отсутствует опция «kick», «ban» или «exit», и добавление этого в тело или строку запроса еще раз просто добавляя произвольные поля способом RPC.

Единственный другой подход, который приходит на ум, - это создать коллекцию киков, коллекцию банов и коллекцию листьев с некоторыми конечными точками для сопоставления конечных точек POST / kicks, POST / bans и POST / leaves. Эти коллекции позволят использовать метаданные, специфичные для ресурса, например, перечислить канал, с которого пользователь выгнал, например, но все равно, что заставить приложение применять парадигму, которая не подходит.

Веб-API Slack выглядит следующим образом:

POST /api/channels.kick HTTP / 1.1 Хост: slack.com Тип содержимого: application / json {"token": «xxxx-xxxxxxxxx-xxxx», «channel»: «C1234567890», «user»: «U1234567890» }

Легко и приятно! Мы просто посылаем аргументы для поставленной задачи, как и в любом другом языке программирования, который имеет функции.

Одно простое правило:

  • Если API - это в основном действия, возможно, это должен быть RPC.
  • Если API в основном CRUD и манипулирует связанными данными, возможно, это должен быть REST.

Что если ни один из них не является явным победителем? Какой подход вы выбираете?

Используйте как REST, так и RPC

Идея о том, что вам нужно выбрать один подход и иметь только один API, немного обманчива. Приложение может очень легко иметь несколько API или дополнительных сервисов, которые не считаются «основными» API. С любым API или службой, предоставляющей конечные точки HTTP, у вас есть выбор между соблюдением правил REST или RPC, и, возможно, у вас будет один REST API и несколько служб RPC. Например, на конференции кто-то задал этот вопрос:

У нас есть REST API для управления компанией веб-хостинга. Мы можем создавать новые экземпляры серверов и назначать их пользователям, что хорошо работает, но как нам перезапустить серверы и выполнить команды на пакетах серверов через API RESTful способом?

Нет реального способа сделать это, что не так уж и плохо, кроме создания простого сервиса в стиле RPC, у которого есть метод POST / restartServer и метод POST / execServer, которые могут выполняться на серверах, созданных и обслуживаемых через сервер REST.

Резюме

Знание различий между REST и RPC может быть невероятно полезным, когда вы планируете новый API, и может действительно помочь, когда вы работаете над функциями для существующих API. Лучше не смешивать стили в одном API, потому что это может сбить с толку как потребителей вашего API, так и любые инструменты, которые ожидают одного набора соглашений (например, REST), и которые падают, когда вместо этого он видит другое набор соглашений (RPC). Используйте REST, когда это имеет смысл, или используйте RPC, если это более уместно. Или используйте оба и получите лучшее из обоих миров!

Кредит изображения на первой странице: Мишель Бозгунов ,

Похожие

Не покупайте польские акции до 2022 года.
Кризис наступит весной 2018 года, и битва продлится дольше, чем обычно - этот сценарий составлен специалистами Opoka TFI. В 2018 году он достигнет циклического пика в этом экономическом цикле, после чего период ослабления начнется дольше, чем обычно, потому что он продлится несколько лет. Это предположение TFI Опока. Представители TFI утверждают, что это не прогноз, но они предполагают, что в 2018-27 году доход от WIG составит всего 30%.
Как правильно установить зеркала в машине?
Водители должны устанавливать зеркала точно, чтобы видимые на них изображения не перекрывались, а слепые зоны были как можно меньше. Следует также помнить, что каждое изменение положения кресла также требует корректировки положения зеркала. Самый простой способ -
Как предотвратить засорение при соскабливании
Очистка веб-страниц - это задача, которую необходимо выполнять ответственно, чтобы она не оказывала вредного влияния на очищаемые сайты. Web Crawlers могут извлекать данные гораздо быстрее, глубже, чем люди, поэтому плохие методы очистки могут оказать некоторое влияние на производительность сайта. Если программа-обходчик выполняет несколько запросов в секунду и загружает большие файлы, недостаточно загруженный сервер будет не справляться с запросами от нескольких программ-обходчиков.
Управляйте своими делами с напоминаниями в Календаре Google
... для которого вы хотите создать напоминание. Затем нажмите « Напоминание» в верхней части всплывающего окна. Здесь вы можете ввести свое напоминание (например, забрать закуски для встречи сотрудников). Напоминание устанавливается
Как установить Windows XP Theme для Windows 7
... ирается прекратить свою поддержку Windows XP в ближайшее время, поэтому многие пользователи XP будут вынуждены перейти на Windows 7 или Windows 8. Если вы перешли на Windows 7 и по-прежнему скучаете по старой доброй Windows XP, то вы всегда можете установить тему Windows XP в Windows 7. Это не изменит способ работы Windows 7, но только сделает его похожим на Windows XP. Вот как вы можете установить тему Windows XP в Windows 7:
Как украсить столовую?
Столовая - это особое место в доме. Здесь, вместе с семьей или друзьями, мы празднуем моменты вместе во время еды. Пора остановиться на мгновение или замедлиться после дня в постоянной спешке. Мода на здоровый образ жизни и совместная кулинария создают новый облик столовой, поэтому все должно быть продуманно продуманно. Мы должны решить, хотим ли мы устроить небольшой уголок на кухне, или, может быть, мы решим найти подходящее место в гостиной. Эти проблемы в первую очередь зависят от количества
Вы запрещаете своему ребенку играть в игры? Вы можете причинить им вред таким образом
Тема воздействия видеоигр на несовершеннолетних уже была прокручена миллион раз. Психологи спорят о том, сильно ли брутальные образы в избранных играх наносят детям вред, лишь незначительно или нет. Между тем, другая группа ученых решила измерить влияние игр на несовершеннолетних, проанализировав несколько иные факторы. Время, когда премьеры игр Doom и Mortal Kombat вызвали массовые протесты, уже позади. Точно так же, как обвинять Slayer
Как найти бесплатные электронные книги на iPad и iPhone
Чтение книг на iPad (или Kindle Fire и даже Nook в этом отношении) просто удивительно. Очевидно, это не то же самое, что держать книгу в мягкой обложке, но удобство iPad при чтении книги невероятно велико. Вы можете нажать, провести, выделить, скопировать, изменить шрифт / шаблон / цвет и т. Д. И многое другое. Еще более удивительным является то, что существует множество бесплатных книг, которые вы можете загрузить на свой iPad. Вам даже не нужно искать их: в Apple iBook
Как произвести хорошее первое впечатление? Искусство написания контент-маркетинговых текстов
... для читателей, она должна быть написана и отформатирована продуманно, вдумчиво. Скучные, схематичные и, следовательно, бесполезные тексты не только не увеличивают продажи, но и теряются в недрах Интернета, что на практике означает трату денег клиента, агентств, а также время и участие самого копирайтера. Интернет-пользователь - понять его точку зрения Из-за потока информации, которая публикуется в Интернете каждый день, интернет-пользователям
Как проверить IP-адрес роутера и найти пароль для входа
... или ли вы новое сетевое оборудование, например, в рамках продления контракта или смены интернет-провайдера, и вы не знаете IP-адрес маршрутизатора и не знаете регистрационные данные? Неважно - мы покажем вам, как проверить IP-адрес вашего роутера и где найти данные для панели настроек.
Планы уроков для печати - издание 2017 года
Но этот август дает нам ожог. Привыкнув к осеннему климату летом, я уже забыл, как может быть жарко. И это так невыносимо. Август всегда был для меня очень вдохновляющим периодом. Я уже думал в сентябре и готовился к предстоящему школьному периоду. На этот раз у меня больше вдохновения, чтобы поклоняться и пить ледяной чай, но по лозунгу, который вы видите,

Комментарии

Или, может быть, они просто не осознают своего существования или им они ни для чего не нужны?
Или, может быть, они просто не осознают своего существования или им они ни для чего не нужны? Количество представлений, из которых мы можем извлечь уроки, увеличивается с каждой версией SQL Server. В конце концов, появляется все больше и больше функциональных возможностей и, следовательно, знаний о потенциальных объектах и ​​структурах. Вы можете найти полную карту доступных системных представлений, взаимосвязи между ними для SQL Server 2008 R2
Как получить эффект размытия фона в другом случае, когда объекты находятся далеко?
Как получить эффект размытия фона в другом случае, когда объекты находятся далеко? Это то, что так называемый яркие линзы. Вот пример фотографии с зеркальной камеры, к которой был прикреплен яркий объектив . Я сделал снимок с еще большего расстояния, чтобы показать вам силу яркого объектива. Несмотря на еще большее расстояние, фон размыт сразу после субтитров на странице, а также перед ним.
Если они не обращают внимания на правила, которые они устанавливают, почему тогда их должны уважать водители?
Так что, если о бумаге и ручке не может быть и речи?
Так что, если о бумаге и ручке не может быть и речи? Все, что вам нужно сделать, это использовать ваш браузер в качестве портативного ноутбука. Как Mozilla Firefox, так и Google Chrome поддерживают сохранение коротких заметок. Введя соответствующую команду в адресную строку браузера, вы можете использовать небольшой текстовый редактор . Необходимые инструменты Mozilla Firefox
Когда нет запрета на воскресные торги и на кого это не влияет?
Когда нет запрета на воскресные торги и на кого это не влияет? Как будет выглядеть запрет на торговлю в воскресенье с 2019 года? Каковы штрафы за нарушение запрета? Мы уже писали о новых правилах запрета на воскресные торги в статье " Запрет на торги в воскресенье уже в новом году? ». Теперь закон вступил в силу. Что это значит для потребителей и розничных
Но тогда уже слишком поздно, не так ли?
Но тогда уже слишком поздно, не так ли? Нет. К счастью, вы можете понять это, прежде чем инвестировать один доллар, так как лучшие сайты для строителей предлагать бесплатные версии. Большинство из них даже не требуют ввода данных вашей кредитной карты. Дело в том: Если вы воспользуетесь бесплатными версиями, вы будете лучше, более уверенными
Вы говорите, что вы оторваны от реальности, так как вы справляетесь с повседневной логистикой?
Вы говорите, что вы оторваны от реальности, так как вы справляетесь с повседневной логистикой? Вы мама, партнер. Каждый день я открываю для себя силу дома, семьи. Очень медленно для моей флегматичной натуры. Мой партнер, дети, это команда, которая основала мой характер. Материнские обязанности позволяют мне вернуться к реальности. Я думаю, что если бы не мой парень, у которого совершенно другой менталитет, мне было бы трудно все организовать эффективно.
Вы хотите создать собственный технологический стек с нуля, а не лицензировать его у других людей, как это делают большинство технологических компаний?
Вы хотите создать собственный технологический стек с нуля, а не лицензировать его у других людей, как это делают большинство технологических компаний? Это сложный подход, требующий огромных капиталовложений, но он окупается. Фил Харви , Рейтинг пользователя: Light Sabre 06.09.2008 | 11:42:22 Re: Turkcell - абонент Huawei для 5G? Да, я думаю, что я видел кое-что из этого через видео-демонстрацию на MWC
А как насчет детей, которые играют каждый день, но в среднем не более часа в день?
А как насчет детей, которые играют каждый день, но в среднем не более часа в день? Здесь ситуация выглядит совершенно иначе. И дело не только в рефлексах, ориентации в пространстве и т. Д. Как выясняется, игры также оказывают положительное влияние на «психическое здоровье ребенка». Эти дети гораздо охотнее вступают в контакт с другими людьми, обладают высокими социальными навыками и наиболее удовлетворены своей жизнью. У них также меньше проблем, связанных с друзьями, эмоциями и нет проблем
Не зацикливайтесь на вопросах типа «почему бы клиентам просто не покупать у моего поставщика?
Не зацикливайтесь на вопросах типа «почему бы клиентам просто не покупать у моего поставщика?». Подумайте об этом - когда вы в последний раз покупали товары напрямую у поставщика, а не у бренда? 4. Доставка займет слишком много времени с AliExpress Dropshipping, будут ли мои клиенты ждать? Ваша задача - определить политику доставки, а затем отобразить ее на веб-сайте вашего магазина, чтобы установить четкие ожидания покупателей. С обычно любимым
Резюме - Как работает поиск изображений?
Резюме - Как работает поиск изображений? Сервис поиска изображений в Google Graphics позволяет быстро и удобно получать информацию путем поиска графического элемента. Есть 4 метода поиска изображений: Вставьте адрес изображения - вам нужен URL изображения Загрузите изображение - вам нужен файл изображения, например, с компьютерного диска Перетащите изображение сюда - перетащите файл изображения

Encoding = "UTF-8"?
Например, GET / ads?
Statement = {foo} или GET / ads?
Вы можете комбинировать элементы строки запроса, чтобы получить GET / ads?
Для чего они?
Мы отправляем сообщение, и это может привести к тому, что что-то сохранится в базе данных для сохранения истории, что может быть другим вызовом RPC, возможно, с теми же именами полей - кто знает?
Можно задаться вопросом: почему я пытаюсь встроить все эти действия в REST API?
Что если ни один из них не является явным победителем?
Какой подход вы выбираете?
Мы можем создавать новые экземпляры серверов и назначать их пользователям, что хорошо работает, но как нам перезапустить серверы и выполнить команды на пакетах серверов через API RESTful способом?


Новости
  • Виртуальный хостинг

    Виртуальный хостинг. Возможности сервера распределяются в равной мере между всеми... 
    Читать полностью

  • Редизайн сайта

    Редизайн сайта – это полное либо частичное обновление дизайна существующего сайта.... 
    Читать полностью

  • Консалтинг, услуги контент-менеджера

    Сопровождение любых интернет ресурсов;- Знание HTML и CSS- Поиск и обновление контента;-... 
    Читать полностью

  • Трафик из соцсетей

    Сравнительно дешевый способ по сравнению с поисковым и контекстным видами раскрутки... 
    Читать полностью

  • Поисковая оптимизация

    Поисковая оптимизация (англ. search engine optimization, SEO) — поднятие позиций сайта в результатах... 
    Читать полностью