Request response что это

Описание, атрибуты и методы объекта requests.Response.

Синтаксис:

Параметры:

Описание:

Объект requests.Response модуля requests содержит всю информацию ответа сервера на HTTP-запрос requests.get(), requests.post() и т.д.

Объект ответа сервера requests.Response генерируется после того, как библиотека requests получают ответ от сервера. Объект ответа Response содержит всю информацию, возвращаемую сервером, а также объект запроса, который создали изначально.

Response.apparent_encoding :

Response.close() :

Метод Response.close() освобождает соединение с пулом. Как только этот метод был вызван, базовый необработанный объект больше не будет доступен.

Примечание: обычно не нужно вызывать явно.

Response.content :

Атрибут Response.content возвращает содержание ответа сервера, представленное в байтах.

Response.cookies = None :

Атрибут Response.cookies возвращает хранилище CookieJar файлов cookie, которые сервер отправил обратно.

Response.elapsed = None :

Атрибут Response.elapsed возвращает время, прошедшее между отправкой запроса и получением ответа (в виде timedelta ).

Response.encoding = None :

Response.headers = None :

Атрибут Response.headers возвращает словарь без учета регистра, с заголовками сервера, которые он вернул во время ответа.

Response.history = None :

Атрибут Response.history возвращает список объектов ответа сервера из истории запроса. Здесь окажутся все перенаправленные ответы.

Список сортируется от самого старого до самого последнего запроса.

Response.is_permanent_redirect :

Response.is_redirect :

Атрибут Response.is_redirect возвращает True если этот ответ является хорошо сформированным HTTP-перенаправлением, которое могло бы быть обработано автоматически ( Session.resolve_redirects ).

Response.iter_content(chunk_size=1, decode_unicode=False) :

Response.iter_lines(chunk_size=512, decode_unicode=False, delimiter=None) :

Обратите внимание, что этот метод не является безопасным для повторного входа.

Response.json(**kwargs) :

Метод Response.json() возвращает закодированное в json содержимое ответа, если таковое имеется.

Response.links :

Атрибут Response.links возвращает проанализированные ссылки заголовка ответа, если таковые имеются.

Response.next :

Атрибут Response.next возвращает объект подготовленного запроса PreparedRequest для следующего запроса в цепочке перенаправления, если таковой имеется.

Response.ok :

Источник

Урок 3. Requests и responses, роутинг и контроллеры

Request response что это. drupal8 lesson3. Request response что это фото. Request response что это-drupal8 lesson3. картинка Request response что это. картинка drupal8 lesson3

Содержание

Requests и responses

Запросы и ответы в Drupal 8 представлены компонентом Symfony HttpFoundation (был рассмотрен в Уроке 2) и классами Request и Response соответственно.

Request

Объект запроса содержит информацию о клиентском запросе. Данные могут быть получены через паблик свойства класса:

Каждое свойство — это экземпляр класса ParameterBag (класс, который представляет собой контейнер для хранения пары ключ/значение). Соответственно все экземпляры данного класса имеют методы для получения/обновления данных, а также фильтрации входных значений.
Чтобы получить информацию о запрашиваемом пути в классе Request существует метод getPathInfo().
Для примера обратимся к странице example.com/example

В переменной $path получим значение /example.
Пример имитации запроса.

Примеры неполного списка команд для получения тех или иных значений от запроса

Значение которые пришли по урлу /example?foo=123
Request response что это. d8 requests. Request response что это фото. Request response что это-d8 requests. картинка Request response что это. картинка d8 requests

Response

Response [2] объект хранит всю необходимую информацию для построения ответа клиенту. Конструктор класса Response принимает три аргумента:

Пример создания респонса.

Ответ также можно модифицировать после его создания

Класс Response содержит довольно большое количество методов для управления HTTP заголовками (setPublic(), setPrivate(), expire() и т.д.).
Для редиректа пользователя на другой урл компонент HttpFoundation имеет в своем арсенале класс RedirectResponse, наследуемый от базового класса Response. Пример редиректа

Роутинг и контроллеры

Друпаловская роутинговая система работает на основе компонента Симфони HttpKernel. Роут — это путь, определенный в Друпале, при обращении по которому возвращается определенный контент.
Как правило, большинство фреймворков или систем умеют управлять повторяющимися задачами (например роутинг, проверки доступа и т.д.), поэтому разработчики могут довольно просто создавать страницы приложения. HttpKernel компонент предоставляет интерфейс, который формализует процесс запроса и создание соответствующего ответа. Т.е. таким образом компонент является “сердцем” любого приложения или системы и не имеет значения насколько они отличаются по внутренней архитектуре.
Структура интерфейса HttpKernel приведена ниже.

Создание кастомного модуля

В данном пункте рассмотрим создание кастомного модуля. Для этого перво-наперво создадим папку нашего модуля в директории modules/custom. Данный модуль по мере написания статей и изучения новых материалов мы будет постоянно расширять и дополнять. Модуль не будет тривиальным (наподобие Hello world), а будет выполнять достаточно конкретную задачу: тянуть ленту новостей с какого-либо новостного портала. Имя модулю дадим соответствующее — news.
Итак в папке modules/custom создаем папку news.
В ней создаем файл news.info.yml. Содержимое данного файла приведено ниже

Все, модуль готов:) Этого вполне достаточно, чтобы модуль был отображен в панели управления и мы могли его включить.
Request response что это. news module. Request response что это фото. Request response что это-news module. картинка Request response что это. картинка news module

Домашнее задание

Создать модуль news, добавить на страницу admin/config под блоком Web Services ссылку News с описанием. Урл ссылки News — admin/config/services/news. По этому урлу отображать пустую страницу с заголовком News.
Для выполнения данного задания потребуется создать свой роутинг, также необходимо разрешить доступ к данной странице только группе «администраторы».

Источник

Выбор Request-Response парадигмы API: REST, RPC или GraphQL?

Авторизуйтесь

Выбор Request-Response парадигмы API: REST, RPC или GraphQL?

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

Чтобы сэкономить время, силы, а самое главное деньги, стоит посмотреть на best practices, которые применяются на текущий момент. Это поможет разработать API, который позволит вносить необходимые изменения в будущем. За прошедшие годы появилось несколько форматов API, рассмотрим самые популярные из них.

Request-Response APIs

Первую группу API, которую мы рассмотрим, можно выделить как Request-Response API. Основные отличия данной группы:

Самые популярные request-response API: REST, RPC и GraphQL.

Самый популярный подход на данный момент. Используется такими поставщиками API, как, например, Google, Twitter и GitHub.

Когда мы говорим про REST, мы говорим про ресурсы. Ресурс — это объект, который может быть идентифицирован, назван, адресован или обработан в сети. REST представляет данные как ресурсы и использует стандартные HTTP-методы для представления транзакций создания, чтения, обновления и удаления этих ресурсов, то есть стандартные CRUD операции. По сути, все бизнес-сущности, которыми оперирует сервис, могут быть определены как ресурсы.

Общие правила, которым следует RESTful API:

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

Для API, предоставляющего CRUD-операции.

Remote Procedure Call (RPC)

Удаленный вызов процедур (RPC) — это одна из простейших парадигм API, в которой клиент вызывает исполнение блока кода на сервере. В то время как REST рассматривает всё как ресурсы, RPC рассматривает действия. Клиенты обычно передают имя метода и аргументы серверу и получают обратно JSON или XML.

Для API, предоставляющего действия, которые сложно инкапсулировать в CRUD операциях.

GraphQL

GraphQL — это язык запросов для API, который в последнее время приобрел значительную популярность. Он был разработан внутри Facebook в 2012 году до публичного выпуска в 2015 году. GraphQL позволяет клиентам определять структуру требуемых данных. Сервер возвращает именно эту структуру

В отличие от REST и RPC API, GraphQL требует только один эндпоинт URL. Также вам не нужны разные HTTP-методы для описания операции. Вместо этого вы указываете в теле JSON выполняете ли вы запрос или мутацию. GraphQL поддерживает методы GET и POST.

Плюсы:

Минусы:

Источник

Библиотека Requests в Python

Библиотека requests фактически является стандартом для выполнения HTTP-запросов.

Он абстрагирует сложности создания запросов за красивым и простым API, чтобы вы могли сосредоточиться на взаимодействии с сервисами, и использовании данных в своем приложении.

Вы узнаете как эффективно использовать запросы и как предотвратить замедление запросов к внешним службам вашего приложения.

Из данного руководства вы узнаете как:

В статье добавлено столько информации, сколько нужно для понимания функций и приведенных примеров.

Для того, чтобы ознакомится с базовыми понятиями работы HTTP-запросов, можно прочитать статью w3schools.

Начало работы с библиотекой requests

Начнем с установки библиотеки запросов. Для этого в консоли выполните команду:

Если вы используете pipenv для управления пакетами python, то выполните команду:

После установки библиотеки, вы можете импортировать ее в приложение:

Теперь, когда всё настроено, самое время начать работать с библиотекой. Первой целью будет научиться как делать GET-запросы.

GET-запросы

HTTP-методы, такие как GET и POST, определяют какое действие вы пытаетесь выполнить при отправке запроса. Помимо GET и POST есть и другие и методы, которые мы будем позже использовать в этой статье.

Поздравляем! Вы сделали первый запрос. Давайте теперь погрузимся немного глубже в ответ на этот запрос.

Объект Response

Давайте сделаем тот же запрос, но на этот раз сохраним его в переменную, чтобы мы могли более подробно изучить его атрибуты и поведение:

Код ответа HTTP

Например, статус 200 OK означает, что ваш запрос был успешно выполнен, а статус 404 NOT FOUND означает, что ресурс не найден. Есть множество других ответов сервера, которые могут дать вам информацию о том, что произошло с вашим запросом.

.status_code вернул 200 — это значит, что запрос успешно выполнен и сервер отдал вам запрашиваемые данные.

Иногда эту информацию можно использовать в коде для принятия решений:

Поэтому вы можете сделать проще последний пример, переписав if :

Техническая деталь: Этот тест истинного значения возможен благодаря тому, что __bool__() — перегруженный метод в Response.
Это означает, что стандартное поведение Response было переопределено для учета кода состояния (ответа сервера) при опеределении значения истинности.

Например, статус 204 говорит о том, что запрос был успешным, но в теле ответа нет содержимого.

Поэтому убедитесь, что вы используете этот сокращенный вид записи, только если хотите узнать был ли запрос успешен в целом. А затем обработать код состояния соответствующим образом.

Что еще прочитать: Если вы не знакомы f-строками в Python, то я призываю вас воспользоваться ими, так это отличный способ упростить отформатированные строки.

Теперь вы знаете многое о том, что делать с кодом ответа от сервера. Но когда вы делаете GET-запрос, вы редко заботитесь только об ответе сервера — обычно вы хотите увидеть больше.

Далее вы узнаете как просмотреть фактические данные, которые сервер отправил в теле ответа.

Content

Ответ на Get-запрос, в теле сообщения часто содержит некую ценную информацию, известную как «полезная нагрузка» («Payload»). Используя атрибуты и методы Response, вы можете просматривать payload в разных форматах.

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

Заголовки

.headers возвращает похожий на словарь объект, позволяющий получить доступ к значениям объекта по ключу. Например, чтобы получить тип содержимого ответа, вы можете получить доступ к Content-Type:

Используя ключ content-type или Content-Type — вы получите одно и то же значение.

Теперь вы узнали основное о Response. Вы увидели его наиболее используемые атрибуты и методы в действии. Давайте сделаем шаг назад и посмотрим как изменяются ответы при настройке Get-запросов.

Параметры строки запроса

Вы даже можете передать значение в байтах:

Строки запроса полезны для параметризации GET-запросов. Вы также можете изменить ваши запросы, добавив или изменив отправляемые вами заголовки.

Заголовки запросов

Заголовок Accept сообщает серверу, какие типы контента может обрабатывать ваше приложение.

Прежде чем вы узнаете больше способов настройки запросов, давайте расширим кругозор, изучив другие методы HTTP.

Другие методы HTTP

В стороне от GET, есть другие популярные методы включая: POST, DELETE, PUT, HEAD, PATCH и OPTIONS. Библиотека Requests предоставляет похожие возможности для работы с каждым из вышеперечисленных методов HTTP:

Каждый вызов функции делает запрос в службу httpbin с использованием соответствующего метода HTTP. Для каждого метода вы можете проверить ответ:

Заголовки, тело ответов, коды состояния и многое другое возвращается в ответе для каждого метода. Далее вы познакомитесь с методами PUT, POST и PATCH и узнаете, чем они отличаются от других типов запросов.

Тело сообщения

Согласно спецификации HTTP — POST, PUT и менее распространенный метод PATCH, передают свои данные через тело сообщения, а не через параметры в строке запроса. Используя эти запросы, вы передатите полезную нагрузку в параметр data соответствующей функции.

Data принимает словарь, список кортежей, байтов или файлоподобный объект.
Вы можете захотеть адаптировать данные, которые отправляете в теле запроса, к конкретным потребностям сервиса, с которым взаимодействуете.

Вы также можете отправить данные в списке кортежей:

Проверка вашего запроса

Когда вы делаете запрос, библиотека requests подготавливает данные, перед тем как отправить их на сервер. Подготовка включает в себя такие вещи, как сериализация JSON и проверка заголовков.

Проверка PreparedRequest дает вам доступ ко всей информации о выполняемом запросе, такой как полезная нагрузка, URL, заголовки, аутенфикация и многое другое.

До сих пор, вы делали много разных видов запросов, но у них всех было одно общее — это неаутентированные запросы к публичным API. Многие службы, с которыми вы можете столкнуться, захотят, чтобы вы каким-то образом идентифицировали себя.

Аутентификация

Одним из примеров API, которые требует аутентификации, является GitHub’s Authenticated User API. Это конечная точка предоставляет информацию о профиле аутентифицированного пользователя. Чтобы сделать запрос к Authenticated User API, вы можете передать свое имя пользователя и пароль в кортеже get() :

Здесь ваш пользовательский механизм TokenAuth получает токен, а затем включает этот токен в заголовок X-TokenAuth вашего запроса.

Проверка SSL-сертификата

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

Хорошей новостью является то, что requests делает это за вас по умолчанию. Однако, в некоторых случаях, вы можете изменить это поведение.

Если вы хотите отключить проверку SSL-сертификата, вы передаете False в параметр verify функции requests :

Библиотека requests даже предупреждает вас, когда вы делаете небезопасный запрос, чтобы помочь сохранить ваши данные в безопасности.

Производительность

Время ожидания

Когда вы отправляете запрос во внешнюю службу, вашей системе потребуется дождаться ответа, прежде чем двигаться дальше. Если ваше предложение слишком долго ожидает ответа — запросы к службе могут быть скопированы, пользовательский интерфейс может пострадать или фоновые задания могут зависнуть.

В первом запросе, время ожидания истекает через одну секунду. Во втором — через 3,05 секунд.

Вы также можете передать кортеж тайм-ауту. Первый элемент в кортеже является тайм-аутом соединения (время, которое позволяет установить клиенту соединение с сервером), а второй элемент — время ожидания чтения (время ожидания ответа после того, как клиент установил соединение):

Если запрос устанавливает соединение в течение 2 секунд и получает данные в течение 5 секунд после установки соединения, то ответ будет возвращен. Если время ожидания истекло — функция вызовет исключение Timeout :

Ваша программа может перехватить исключение и ответить соответствующим образом.

Объект Session

Сеансы используются для сохранения параметров в запросах. Например, если вы хотите использовать одну и ту же аутентификацию для нескольких запросов, вы можете использовать сеанс:

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

Максимальное количество попыток

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

Когда вы монтируете HTTPAdapter и github_adapter в Session — Session будет придерживаться этой конфигурации в каждом запросе к https://api.github.com.

Время ожидания, транспортные адаптеры и сеансы, предназначены для обеспечения эффективности вашего кода и отказоустойчивости приложения.

Заключение

Вы прошли долгий путь в изучении мощной библиотеки Requests в Python.

Поскольку вы узнали как использовать запросы, у вас появилась возможность исследовать широкий мир веб-сервисов, создавать потрясающие приложения и использовать данные, которые они предоставляют.

Источник

Формальная логика “request-response” в изучении английского: преимущества программистов

Request response что это. fcf0f5a67c65d7c344d6191920f9b8de. Request response что это фото. Request response что это-fcf0f5a67c65d7c344d6191920f9b8de. картинка Request response что это. картинка fcf0f5a67c65d7c344d6191920f9b8de

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

Для раскрытия темы приведу несколько историй из жизни. Когда в СССР был дефицит, а мой муж был маленьким мальчиком, его родители где-то достали колбасу и подали на стол на праздник. Гости ушли, мальчик посмотрел на оставшуюся на столе колбасу, нарезанную аккуратными кружками, и спросил, нужна ли она ещё. “Бери бери!” — разрешили родители. Ну, он взял, пошел во двор, и стал с помощью колбасы учить соседских кошек ходить на задних лапках. Папа с мамой увидели и возмутились разбазариванием дефицитного продукта. А мальчик недоумевал, и даже обиделся. Ведь он же не втихушку стащил, а честно спросил, нужна ли еще колбаса…

Нет нужды говорить, что этот мальчик, когда вырос, стал программистом.

К зрелому возрасту таких забавных историй у айтишника накопилось множество. Например, однажды я попросила мужа купить курицу. Покрупнее и побелее по цвету чтобы птичка была. Он с гордостью принес домой огромную белую… утку. Я спросила, неужели он хотя бы по цене (утка стоит гораздо дороже) не задумался, ту ли птицу он покупает? Ответом мне было: “Ну, ты же о цене ничего не говорила. Сказала, птичку покрупнее и побелее. Я и выбрал из всего ассортимента самую крупную и самую белую ощипанную птицу! Задачу выполнил.” Я облегченно выдохнула, поблагодарив про себя небеса за то, что в магазине в тот день не было индейки. В общем, на ужин была утка.

Ну, и масса других ситуаций, в которых человек неподготовленный может заподозрить жесткий троллинг и даже обидеться. Гуляем по восхитительному южному пляжу, я мечтательно говорю: “Эх, так хочется чего-нибудь вкусненького…” Он, оглядевшись, заботливо спрашивает: “Хочешь, нарву плодов кактуса?”

Request response что это. 7a8a44c3c0a88bf477d637fbcb7119d6. Request response что это фото. Request response что это-7a8a44c3c0a88bf477d637fbcb7119d6. картинка Request response что это. картинка 7a8a44c3c0a88bf477d637fbcb7119d6

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

Обижаться? Обнять и простить? Посмеяться?

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

Проиллюстрированный выше способ мышления (не будучи психологом, рискну условно охарактеризовать его как формально-логический),

а) резонирует с некоторыми принципами работы человеческого подсознания;

б) как нельзя лучше резонирует с некоторыми аспектами грамматической логики английского.

Особенности подсознательного восприятия запроса

Психология считает, что человеческое подсознание понимает все буквально и не обладает чувством юмора. Как и компьютер, с которым айтишник “общается” больше времени, чем с людьми. Подслушала у одного практикующего психолога метафору: “Подсознание — это великан, у которого нет глаз, нет чувства юмора, и который всё понимает буквально. А сознание — это зрячий лилипут, который сидит на шее великана и им управляет.”

Какая команда считывается великаном-подсознанием, когда лилипут-сознание произносит: “Мне нужно изучить английский”? Подсознание принимает REQUEST: “изучить английский”. Простодушный “великан” усердно начинает работать над выполнением команды, выдавая RESPONSE: процесс изучения. Вы узнаете, что в английском есть герундий, есть глагол to be, есть активный залог, есть пассивный залог, есть видовременные формы, есть сложное дополнение и сослагательное наклонение, есть актуальное членение, есть синтагмы, и т.д.

Изучали ли вы язык? Да. “Великан” выполнил поставленную задачу — вы честно изучали язык. Овладели ли вы английским на практике? Вряд ли. Запроса на овладение подсознание не получало.

Чем же различается изучение и овладение?

Изучение — это анализ, расчленение целого на части. Овладение — это синтез, сборка частей в целое. Подходы, прямо скажем, противоположные. Методики у изучения и у практического овладения разные.

Если конечная цель — научиться пользоваться языком как инструментом, то и формулировать задачу следует буквально: “Мне нужно овладеть английским.” Будет меньше разочарований.

Каков request, таков и response

Как упоминалось выше, английскому языку присущ некий формализм. К примеру, на поставленный вопрос нельзя в английском ответить как угодно. Можно ответить лишь в той форме, в которой он задан. Таким образом, на вопрос “Have you eaten the cake?” можно ответить лишь в той же грамматической форме с have: “Yes, I have / No, I haven’t.” Никаких “do” или “am”. Точно так же, на “Did you eat the cake?” правильно будет ответить “Yes, I did / No, I didn’t.”, и никаких “had” или “was”. Каков вопрос, таков ответ.

У русскоязычных часто вызывает недоумение момент, когда в английском, чтобы разрешить что-то, необходимо ответить отрицательно, а чтобы запретить, — положительно. Например:

Ведь естественный инстинкт русскоязычного сознания — разрешая, ответить “да”, а запрещая, — “нет”. Почему же в английском все наоборот?

Формальная логика. Отвечая на вопрос в английском, мы откликаемся не столько на реальную ситуацию, сколько на грамматику предложения, которое слышим. А в грамматике у нас вопрос звучит: “Do you mind?” — “Возражаете ли Вы?”. Соответственно, отвечая “Yes, I do.” — собеседник, откликаясь на грамматическую логику, утверждает “Да, возражаю”, т.е., запрещает, а вовсе не разрешает действие, как было бы логично для ситуативной логики. Каков вопрос, таков и ответ.

Аналогичное столкновение ситуативной и грамматической логики провоцируют просьбы типа “Could you…?” Не удивляйтесь, если в ответ на Ваше:

… и спокойно продолжит свою трапезу, так и не передав вам соль. Вы его спросили, может ли он передать соль. Он ответил, что может. Вы ведь не попросили его передать ее вам: “Would you…?” Носители английского частенько так шутят. Возможно, истоки знаменитого английского юмора кроются как раз на стыке противоречия грамматической и ситуативной логики… Совсем как юмор программистов, не находите?

Таким образом, приступая к освоению английского, имеет смысл пересмотреть формулировку запроса. Ведь когда мы приходим, например, в автошколу, мы говорим: “Мне нужно научиться водить автомобиль”, а не “Мне нужно изучить автомобиль”.

Более того, работая с преподавателем, студент вступает во взаимодействие с его когнитивной системой. У преподавателя тоже есть подсознание, работающее, как у всех людей, по принципу “request-response”. Если преподаватель не настолько опытный, чтобы “переводить” запрос обучаемого на язык его реальных потребностей, подсознание преподавателя также может воспринять запрос ученика как запрос на изучение, а не на овладение. И преподаватель с энтузиазмом откликнется и удовлетворит запрос, но предложенная к изучению информация не будет являться реализацией истинной потребности студента.

“Бойтесь своих желаний” (С)? Ищите преподавателя-телепата, умеющего переводить ваши запросы на язык ваших реальных потребностей? Корректно формулируйте ‘request’? Необходимое подчеркнуть. При грамотном подходе к делу, лучше всех обучающихся английским должны владеть именно программисты, как из-за особенностей их мировосприятия, так и из-за особенностей английского языка как такового. Залог успеха — правильный подход.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *