Создание REST API с Node.js и базой данных Oracle. Часть 4
В предыдущей статье вы добавили логику в API для запросов GET, которые извлекали данные из базы данных. В этом посте вы завершите построение базовой функциональности API CRUD, добавив логику для обработки запросов POST, PUT и DELETE
Добавление логики маршрутизации
Чтобы упростить логику маршрутизации, вы будете перенаправлять все методы HTTP через существующий маршрут (с необязательным параметром id). Откройте файл services / router.js и замените текущую логику маршрутизации (строки 5-6) следующим кодом:
Обновленная логика маршрутизации отображает четыре наиболее распространенных метода HTTP, используемых для основных операций CRUD, на правильную логику контроллера.
Обработка POST-запросов
HTTP POST-запросы используются для создания новых ресурсов (в данном случае это записи сотрудников). Основная идея состоит в том, чтобы извлечь данные из тела HTTP-запроса и использовать его для создания новой строки в базе данных. Чтобы добавить логику контроллера для запросов POST, откройте файл controllers / employee.js и добавьте следующий код:
Функция getEmployeeFromRec принимает объект запроса и возвращает объект со свойствами, необходимыми для создания записи сотрудника. Функция была объявлена вне функции post, чтобы ее можно было использовать позже и для запросов PUT.
Функция post использует getEmployeeFromRec для инициализации переменной, которая затем передается методу create API базы данных сотрудников. После операции создания клиенту отправляется код состояния «201 Создан» вместе с JSON сотрудника (включая новое значение идентификатора сотрудника).
Теперь вы можете обратите внимание на логику в API базы данных. Откройте файл db_apis / employee.js и добавьте следующий код внизу.
Приведенная выше логика начинается с объявления константы с именем createSql для хранения оператора вставки. Обратите внимание, что он использует переменные связывания, а не конкатенацию строк, для ссылки на значения, которые нужно вставить. Стоит повторить, насколько важны bind variables по соображениям безопасности и производительности. Старайтесь избегать конкатенации строк, когда это возможно.
Внутри функции create постоянная сотрудника определяется и инициализируется для копии параметра emp с помощью Object.assign. Это предотвращает прямую модификацию объекта, переданного из контроллера.
Затем свойство employee_id добавляется к объекту employee (настроенному как «out bind»), чтобы оно содержало все переменные связывания, необходимые для выполнения оператора SQL. Затем функция simpleExecute используется для выполнения оператора вставки, а свойство outBinds для перезаписи свойства employee.employee_id перед возвратом объекта.
Поскольку на модуль oracledb есть ссылка, вам потребуется добавить следующую строку в начало файла.
Обработка запросов PUT
Запросы PUT будут использоваться для обновления существующих ресурсов. Важно отметить, что PUT используется для замены всего ресурса — он не выполняет частичные обновления (я покажу вам, как сделать это с PATCH в будущем). Вернитесь в файл controllers / employee.js и добавьте следующий код внизу.
Функция put использует getEmployeeFromRec для инициализации объекта с именем employee, а затем добавляет свойство employee_id из параметра id в URL. Затем объект employee передается в функцию обновления API базы данных, и клиенту на основании результата отправляется соответствующий ответ.
Чтобы добавить логику обновления в API базы данных, добавьте следующий код в файл db_apis / employee.js.
Логика обновления очень похожа на логику создания. Объявлена переменная для хранения оператора SQL, а затем simpleExecute используется для выполнения оператора с переданными динамическими значениями (после копирования их в другой объект). result.rowsAffected используется, чтобы определить, было ли обновление успешным, и вернуть правильное значение.
Обработка запросов DELETE
Последний метод, который вам нужно реализовать, это DELETE, который, что неудивительно, удалит ресурсы из базы данных. Добавьте следующий код в конец файла controllers / employee.js.
Движок JavaScript выдаст исключение, если вы попытаетесь объявить функцию с именем «delete», используя оператор функции. Чтобы обойти это, объявляется функция с именем «del», а затем экспортируется как «delete».
На этом этапе вы должны уметь читать и понимать логику. В отличие от предыдущих примеров, этот HTTP-запрос не имеет тела, используется только параметр id в пути маршрута. Код состояния «204 Нет содержимого» часто используется с запросами DELETE, когда тело ответа не отправляется.
Чтобы завершить логику базы данных, вернитесь в файл db_apis / employee.js и добавьте следующий код в конец.
Поскольку таблица JOB_HISTORY имеет ограничение внешнего ключа, которое ссылается на таблицу EMPLOYEES, простой блок PL / SQL используется для удаления необходимых строк из обеих таблиц за один цикл.
Разбор JSON-запросов
Если вы посмотрите на функцию getEmployeeFromRec в controllers / employee.js, вы заметите, что свойство body запроса — это объект JavaScript. Это обеспечивает простой способ получения значений из тела запроса, но это не происходит автоматически.
API, который вы создаете, ожидает, что клиенты будут отправлять данные в формате JSON в теле запросов POST и PUT. Кроме того, клиенты должны установить заголовок Content-Type запроса на application / json, чтобы веб-сервер знал, какой тип тела запроса отправляется. Вы можете использовать встроенное промежуточное программное обеспечение express.json, чтобы Express мог анализировать такие запросы.
Откройте файл services / web-server.js и добавьте следующие строки чуть ниже вызова app.use, который добавляет morgan в конвейер запросов.
Когда данные JSON распарсятся в native объекты JavaScript, тогда только типы данных, поддерживаемые в JSON, будут правильно сопоставлены с типами JavaScript. Даты не поддерживаются в JSON и обычно представлены в виде строк ISO 8601. Используя функцию reviver, переданную промежуточному программному обеспечению express.json, вы можете выполнить преобразования вручную. Добавьте следующий код в конец файла services / web-server.js.
Тестирование API
Пришло время протестировать новую функциональность CRUD! До сих пор вы использовали браузер для тестирования API, но это не будет работать для запросов POST, PUT и DELETE. Я покажу вам, как тестировать API с помощью команд curl, потому что он легко доступен в виртуальной машине. Но можно использовать и графический инструмент, такой как Postman, Insomina (бесплатно).
Запустите приложение, а затем откройте другое окно терминала и выполните следующую команду, чтобы создать нового сотрудника.
Если запрос был успешным, ответ должен содержать объект employee с атрибутом employee_id. Вот пример:

В моем случае значение employee_id было 227 — вам нужно будет изменить следующие команды, основываясь на полученном значении employee_id.
Например, чтобы обновить новую запись, введите PUT для URL с этим значением идентификатора.
Триггер UPDATE_JOB_HISTORY в схеме HR обнаружит изменение задания и добавит строку в таблицу JOB_HISTORY. Если вы посмотрите в эту таблицу, вы должны увидеть запись для нового сотрудника. Выполните следующую команду, чтобы удалить историю заданий и записи сотрудников.
И вот, у вас есть все, полная функциональность CRUD!
API продвигается хорошо, но есть над чем поработать. В последнем посте я покажу вам, как добавить возможности разбивки на страницы, сортировки и фильтрации в запросах GET.
Как заставить POST-запрос PHP правильно работать в CRUD API в качестве слоя для подключения к базе данных MySQL?
Я не могу отправить значения в базу данных через Postman.
Недавно я начал создавать CRUD API для практических целей. Я нашел несколько хороших руководств о том, как подключиться к базе данных с помощью PHP. Мне удалось собрать базу данных MySQL с помощью phpMyAdmin и подключить ее к PHP. Также запрос GET возвращает значения из базы данных: http://ivanzarkovic.com/movies/fetch_all_movies.php
Хотя я ошибся с типом данных, поэтому я изменил тип в БД на строку (VARCHAR), но это не решило проблему.
Я ожидаю зафиксировать новую запись в базе данных, но она привязана к «отсутствующим обязательным параметрам». isset($_POST[‘movie_name’]) возвращает false.



Ответы 1
Предоставленный вами пример URL-адреса содержит данные в качестве параметров запроса. Это означает, что вы должны обращаться к $_GET , а не $_POST .
Ваш код подходит для приема данных по почте, можете ли вы поделиться запросом почтальона?
Поскольку я впервые использовал Postman, надеюсь, это то, что вы просите меня отправить. Для записи я выбрал POST в качестве метода, добавил пары ключ-значение и нажал кнопку «Отправить». Я полагаю, что ошибаюсь. POST /movies/add_movie.php?movie_name=some andsf&genre=sf&year=2005&rating=4.6 HTTP/1.1 Host: ivanzarkovic.com Cache-Control: no-cache Postman-Token: 545fb30d-1e92-5327-8717 -857b78164b7b Content-Type: multipart/form-data; граница=—- WebKitFormBoundary7MA4YWxkTrZu0gW
Вы случайно не добавляете их в поле для параметров запроса, а не в тело сообщения?
Вы были правы, я не отправил правильный POST-запрос. Я понятия не имел, почему это не работает, но мне удалось опубликовать данные в БД. Достаточно ли безопасен этот способ подключения к базе данных, если я добавлю только авторизацию входа с токеном?
Какие методы HTTP соответствуют каким методам CRUD?
в программировании стиля RESTful мы должны использовать методы HTTP в качестве наших строительных блоков. Я немного смущен, хотя какие методы соответствуют классическим методам CRUD. GET/Read и DELETE / Delete достаточно очевидны.
однако, в чем разница между PUT / POST? Соответствуют ли они один к одному с Create и Update?
9 ответов
PUT может сопоставлять как создание, так и обновление в зависимости от существования URI, используемого с PUT.
разместить карты для создания.
исправление: POST также может отображать обновление, хотя обычно используется для создания. Сообщение также может быть частичным обновлением, поэтому нам не нужен предлагаемый метод исправления.
все ли вы делаете идемпотентных изменить или нет. То есть, если действие над сообщением дважды приведет к тому, что «то же самое» будет там, как если бы это было сделано только один раз, у вас есть идемпотентное изменение, и оно должно быть сопоставлено с PUT. Если нет, он сопоставляется с POST. Если вы никогда не разрешаете клиенту синтезировать URL-адреса, PUT довольно близок к обновлению, и POST может обрабатывать создание просто отлично, но это, безусловно, не единственный способ сделать это; если клиент знает, что он хочет создать /foo/abc и знает, какой контент положить туда, он отлично работает как положить.
каноническое описание поста — это когда вы совершаете покупку чего-то: это действие, которое никто не хочет повторять, не зная об этом. Напротив, установка адреса отправки для заказа заранее может быть выполнена с помощью PUT just fine: не имеет значения, сказали ли вам отправить в 6 Anywhere Dr, Nowhereville раз, два или сто раз: это все тот же адрес. Это значит, что это Новости? Может быть. все зависит от того как вы хотите записать бэк-конец. (Обратите внимание, что результаты могут быть не идентичными: вы можете сообщить пользователю, когда они в последний раз делали PUT как часть представления ресурса, что гарантировало бы, что повторные put не вызывают идентичного результата, но результат все равно будет «одинаковым» в функциональном смысле.)
Я искал тот же ответ, вот что говорит IBM. IBM Link
есть отличный YouTube видео разговор stormpath с на самом деле объясняет это, URL должен перейти к правильной части видео:
также стоит посмотреть, что это более часа разговора, но очень интересно, если вы думаете инвестировать время в создание REST api.
Это зависит от конкретной ситуации.. но в общем:
PUT = обновить или изменить конкретный ресурс с конкретным URI ресурса.
POST = создать новый ресурс под источник данного URI.
редактировать записи в блоге:
пост: / блог / запись
PUT может создать новый ресурс в некоторых случаях, когда URI нового ressource перед запросом понятен. POST можно использовать и для реализации нескольких других вариантов использования, которые не охватываются другими (GET, PUT, DELETE, HEAD, OPTIONS)
общее понимание для систем CRUD-GET = request, POST = create, Put = update, DELETE = delete
прямо сейчас (2016) последние http глаголы GET, POST,патч, поставить и удалить
- HTTP-запрос GET — выберите/запрос
- HTTP PUT-UPDATE
- HTTP POST — INSERT/Create
- адресу http патч — когда поставитьting полное представление ресурса громоздко и использует больше пропускной способности, например: когда вам нужно частично обновить столбец
- HTTP УДАЛИТЬ — Удалить
надеюсь, что это помогает!
Если вы заинтересованы в разработке REST API, это ansewome чтение, чтобы иметь! веб-сайт онлайн-версия github хранилище
строительные блоки REST-это в основном ресурсы (и URI) и гипермедиа. В этом контексте GET — Это способ получить представление ресурса (который действительно может быть сопоставлен с SELECT в терминах CRUD).
однако вы не обязательно должны ожидать сопоставления один к одному между операциями CRUD и HTTP-глаголами. Основное различие между PUT и POST об их идемпотентном свойстве. POST также чаще используется для частичного обновления, как PUT обычно подразумевает отправку полного нового представления ресурса.
Я бы предложил прочитать это:
на спецификация HTTP тоже полезная ссылка:
метод PUT запрашивает, чтобы закрытый сущности храниться под поставила запрос URI.
[. ]
принципиальная разница между Запросы POST и PUT отражены в различное значение Запрос URI. URI в запросе POST определяет ресурс, который будет обработайте вложенный объект. Что ресурс может принимать данные процесс, врата в другие протокол или отдельный объект, который принимает аннотации. В отличие от URI в PUT запрос идентифицирует объект, вложенный в запрос — агент пользователя знает, что такое URI предназначен и сервер не должен пытаться применить запрос к некоторым другой ресурс. Если сервер желает этот запрос применяется к другой URI,