Create rest api using node.js, mysql and express

Promise

Promises are created when we execute asynchronous code. This is common when using REST APIs.

To understand what a Promise does, let’s consider this sequence of events:

  • An HTTP request is sent for external data and a promise Promise object is created
  • 3 seconds (this is just an example duration) elapse while the data is retrieved over the network. Other Javascript may be executed.
  • The HTTP response is received and the Promise is fulfilled with requested data

This can be confusing at first but is very powerful once understood. A great resource for learning more about Promises is the MDN web documents explanation of a Promise. In the next section, I will list my favorite resources for getting started with Node.js and Javascript. However, if Javascript is not new to you, it can still help refresh your knowledge.

Ключевые составляющие RESTful

Веб-сервисы прошли долгий путь с момента их появления. В 2002 году W3C выпустил определения WSDL и SOAP веб-сервисов. Это сформировало стандарт по созданию веб-сервисов.

В 2004 году W3C выпустил определение ещё одного стандарта под названием RESTful. В последние годы этот стандарт стал довольно популярным. На данный момент он используется многими известными сайтами по всему миру, в число которых входят Facebook и Twitter.

Tech Lead (Sunkey)

МТС, Москва, По итогам собеседования

tproger.ru

Вакансии на tproger.ru

REST — это способ получить доступ к ресурсам, которые находятся в определённой среде. Например, у вас может быть сервер с важными документами или фотографиями. Всё это — ресурсы. Если клиенту, скажем, веб-браузеру, нужны какие-то из этих ресурсов, ему необходимо отправить запрос на сервер для получения доступа к ним. REST определяет, как может осуществляться доступ к этим ресурсам.

Ключевые составляющие реализации RESTful:

  1. Ресурсы. Допустим, у нас есть сервер с записями о сотрудниках, а адрес веб-приложения — http://server.com. Чтобы получить доступ к записи сотрудника, мы можем выполнить команду http://server.com/employee/1, которая говорит серверу предоставить запись сотрудника под номером 1.
  2. Методы запросов. Они говорят, что вы хотите сделать с ресурсом. Браузер использует метод GET, чтобы проинформировать удалённую сторону о том, что он хочет получить данные. Кроме GET есть много других методов вроде POST, PUT и DELETE. В примере с http://server.com/employee/1 выше браузер на самом деле использует метод GET, поскольку он хочет получить данные о сотруднике.
  3. Заголовки запроса. Это дополнительные инструкции, посылаемые вместе с запросом. Они могут определять тип необходимого ресурса или подробности авторизации.
  4. Тело запроса. Это данные, отправляемые вместе с запросом. Данные обычно отправляются, когда выполняется POST-запрос к REST веб-сервису. Зачастую в POST-запросе клиент говорит серверу, что он хочет добавить на него ресурс. Следовательно, тело запроса содержит подробную информацию о ресурсе, который необходимо добавить на сервер.
  5. Тело ответа. Это основная часть ответа. В нашем примере на запрос http://server.com/employee/1 сервер мог бы прислать XML-документ с данными о сотруднике в теле ответа.
  6. Коды ответа. Эти коды возвращаются сервером вместе с ответом. Например, код 200 обычно означает, что при отправке ответа не произошло никакой ошибки.

Провести тестирование черного ящика на API

Лучший способ протестировать API — это выполнить тестирование черного ящика на них. Тестирование черного ящика — это метод тестирования, который не заботится о внутренней структуре и принципе работы приложения. Ни одна часть системы не должна подвергаться проверке во время тестирования.

supertestЭто один из модулей, который можно использовать для тестирования интерфейса в «черном ящике».mochaТестовый пример, написанный для проверки того, может ли интерфейс вернуть один фрагмент пользовательских данных:

Некоторые люди могут спросить: как записываются данные в базе данных, связанные со службой API?

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

  • Выберите подмножество данных производственной среды для запуска тестов черного ящика;
  • Заполните базу данных вручную созданными данными перед запуском теста черного ящика

Кроме того, тестирование черного ящика не означает, что модульное тестирование не требуется.Юнит тестЭто все еще нужно написать.

Защита приложений, которые предоставляют API

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

Конфиденциальные данные в API-интерфейсе

Вызовы API часто включают учетные данные, ключи API, токены сеансов и другую конфиденциальную информацию. Если эти данные включены непосредственно в URL-адреса, эти данные могут быть сохранены в журналах веб-сервера и могут быть украдены, если к журналам получать доступ злоумышленники. Чтобы избежать утечки конфиденциальной информации, веб-службы RESTful всегда должны отправлять ее в заголовках HTTP-запроса или в теле запроса (для запросов POST и PUT).

Проверка Content Type

Продолжая тему клиентских ограничений API, службы REST должны точно определять разрешенные типы контента (content type) и отклонять запросы, которые не имеют правильных объявлений в своих заголовках HTTP. Это означает тщательное указание разрешенных типов как в Content-Type, так и в заголовке Accept, а также в charset (где это возможно). Если служба включает JavaScript (или другой код сценария), она должна гарантировать, что тип содержимого в заголовке такой же, как в теле запроса, например application/javascript. Это помогает предотвратить атаки с использованием заголовков (header injection).

Заголовки безопасности в ответах (Response Security Headers)

Дополнительные заголовки безопасности HTTP security headers могут быть установлены для дальнейшего ограничения типа и объема запросов. К ним относятся X-Content-Type-Options: nosniff для предотвращения атак XSS (XSS attacks) на основе сниффинга MIME и X-Frame-Options: deny для предотвращения попыток clickjacking в старых браузерах.

Если служба не поддерживает междоменные вызовы (cross-domain), она должна отключить CORS (совместное использование ресурсов между источниками) в своих заголовках ответа. Если такие вызовы ожидаются, заголовки CORS должны точно указывать разрешенные источники.

Проверка входных данных

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

Типичные рекомендации по проверке входных данных:

  • Рассматривайте все параметры, объекты и другие входные данные как ненадежные.
  • Используйте встроенные функции проверки, где это возможно.
  • Проверьте размер запроса, длину и тип контента.
  • Используйте строгую типизацию для параметров API (если поддерживается).
  • Чтобы предотвратить SQL injection, избегайте создания запросов вручную — используйте вместо этого параметризованные запросы.
  • Ведите белые списки разрешений (разрешено только то что указано в списке), везде где это возможно.
  • Логгируйте все ошибки проверки ввода данных для обнаружения попыток ввода учетных данных.

Step5: Run Application

Now we will go the project directory and execute the the command and the server will start on default port 5000. Now we will use Postman to run our Python RESTful API with (POST, GET, PUT or DELETE) methods to test it.

We will run the below URL with HTTP method to get the all employee and display data in JSON format.

http://localhost:5000/emp

The following JSON data response will be returned:

We will get the employee record in JSON data with id 1 using below URL with HTTP method.

http://localhost:5000/emp/1

The response will be JSON data:

We will add new employee record with HTTP method.

http://localhost:5000/add

The request body will be following:

{        
	"name": "Flower",
	"email": "[email protected]",
	"phone": "1234567890",
	"address":"Paris"
}

The response will JSON data employee add message.

We will update existing employee record with #1 using HTTP method.

http://localhost:5000/update

The request body will be following:

 {        
	"id": 1,
	"name": "Smith",
	"email": "[email protected]",
	"phone": "1234567890",
	"address":"Newyork, USA"
}

The response will employee record message.

We will delete existing employee with id #3 using HTTP method.

http://localhost:5000/delete/1

The response will employee record delete message.

You have completed tutorial about Python RESTFul API using Flask and MySQL with examples. You can further implement this into your project according to your requirement. If you have any query, you can submit your precious comments. Thanks!

You may also like:

  • User Management System with PHP & MySQL
  • Datatables Add Edit Delete with Ajax, PHP & MySQL
  • Build Helpdesk System with jQuery, PHP & MySQL
  • Build Online Voting System with PHP & MySQL
  • School Management System with PHP & MySQL
  • DataTables Add Edit Delete with CodeIgniter
  • Create RESTful API using CodeIgniter
  • Build Reusable Captcha Script with PHP
  • Product Search Filtering using Ajax, PHP & MySQL
  • Image Upload and Crop in Modal with jQuery, PHP & MySQL
  • Build Push Notification System with PHP & MySQL
  • Project Management System with PHP and MySQL
  • Hospital Management System with PHP & MySQL
  • Build Newsletter System with PHP and MySQL
  • Skeleton Screen Loading Effect with Ajax and PHP
  • Build Discussion Forum with PHP and MySQL
  • Customer Relationship Management (CRM) System with PHP & MySQL
  • Online Exam System with PHP & MySQL
  • Expense Management System with PHP & MySQL

You can download full the script from the Download link below.

Рекомендации по использованию REST API

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

Спецификация OpenAPI (OAS) определяет интерфейс для описания API, чтобы обеспечить разработчикам и приложениям полное понимание всех параметров и возможностей API, включая доступные конечные точки, разрешенные операции для каждой конечной точки, параметры операций, методы аутентификации и прочую информацию. Последняя версия, OAS3 (внешняя ссылка), содержит полезные инструменты, например OpenAPI Generator, для создания клиентов API и серверных заглушек на разных языках программирования.

Для обеспечения безопасности REST API также следует опираться на передовой отраслевой опыт, в частности использование алгоритмов хэширования для защиты паролей и HTTPS для безопасной передачи данных. Для ограничения прав доступа сторонних приложений можно использовать инфраструктуру авторизации, например OAuth 2.0 (внешняя ссылка). Кроме того, API может отклонять любые запросы, поступающие по истечении определенного периода времени, используя отметку времени в заголовке HTTP. Существуют и другие способы контроля доступа к API: проверка параметров и веб-маркеры JSON.

What is a Rest API?

A Rest API represents the interface between server and client. Via normal HTTP requests we reach the server and can execute programmed functions such as authenticating a user with the corresponding password.Advertisements

Since this tutorial is not suitable for absolute beginners, I assume that you are already a bit familiar with Node.js, so we’ll skip the installation and get straight to the exciting part. If you are not familiar with Node.js yet, you can take a look at this Node.js beginner tutorial. After that you will have learned all the basics and can start using your Node.js login system.

Не вкладывайте ресурсы

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

Например, мы ожидаем получить список статей, автором которых является определенный автор, предполагая, что автор. Есть два варианта:

Первое решение описывается размещением вложенного ресурса после связанного ресурса в URI, например:

Причина, по которой некоторые люди рекомендуют эту схему, заключается в том, что эта форма URI в некоторой степени описывает отношения «один ко многим» между автором и статьей. Но в то же время, в сочетании с передовой практикой пункта 4, мы не можем различить, являются ли данные, возвращаемые текущей конечной точкой, типом автора или типом статьи.

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

Просто извлеките логику фильтрации статей в строку запроса. Такой URI четко описывает значение «получение статей всех авторов (id = 12)», чем раньше.

Step4: Create REST API CRUD Operation

We will create script and import the and modules. We will connect to MySQL database and implement CRUD operations by defining all REST URIs. Here we have used HTTP method to add new records to database. We have used HTTP method to get all records or individual record and used HTTP method for record update. Also implemented HTTP method to delete record. If there are no record found then it defined 404 method to handle not found error.

import pymysql
from app import app
from config import mysql
from flask import jsonify
from flask import flash, request
		
@app.route('/add', methods=)
def add_emp():
	try:
		_json = request.json
		_name = _json
		_email = _json
		_phone = _json
        _address = _json		
		if _name and _email and _phone and _address and request.method == 'POST':			
			sqlQuery = "INSERT INTO rest_emp(name, email, phone, address) VALUES(%s, %s, %s, %s, %s)"
			bindData = (_name, _email, _phone, _address)
			conn = mysql.connect()
			cursor = conn.cursor()
			cursor.execute(sqlQuery, bindData)
			conn.commit()
			respone = jsonify('Employee added successfully!')
			respone.status_code = 200
			return respone
		else:
			return not_found()
	except Exception as e:
		print(e)
	finally:
		cursor.close() 
		conn.close()
		
@app.route('/emp')
def emp():
	try:
		conn = mysql.connect()
		cursor = conn.cursor(pymysql.cursors.DictCursor)
		cursor.execute("SELECT id, name, email, phone, address FROM rest_emp")
		empRows = cursor.fetchall()
		respone = jsonify(empRows)
		respone.status_code = 200
		return respone
	except Exception as e:
		print(e)
	finally:
		cursor.close() 
		conn.close()
		
@app.route('/emp/<int:id>')
def emp(id):
	try:
		conn = mysql.connect()
		cursor = conn.cursor(pymysql.cursors.DictCursor)
		cursor.execute("SELECT id, name, email, phone, address FROM rest_emp WHERE id =%s", id)
		empRow = cursor.fetchone()
		respone = jsonify(empRow)
		respone.status_code = 200
		return respone
	except Exception as e:
		print(e)
	finally:
		cursor.close() 
		conn.close()

@app.route('/update', methods=)
def update_emp():
	try:
		_json = request.json
		_id = _json
		_name = _json
		_email = _json
		_phone = _json
                _address = _json
                if _name and _email and _phone and _address and _id and request.method == 'PUT':			
			sqlQuery = "UPDATE rest_emp SET name=%s, email=%s, phone=%s, address=%s WHERE id=%s"
			bindData = (_name, _email, _phone, _address, _id,)
			conn = mysql.connect()
			cursor = conn.cursor()
			cursor.execute(sqlQuery, bindData)
			conn.commit()
			respone = jsonify('Employee updated successfully!')
			respone.status_code = 200
			return respone
		else:
			return not_found()	
                except Exception as e:
		 print(e)
	        finally:
		 cursor.close() 
		 conn.close()
@app.route('/delete/<int:id>', methods=)
def delete_emp(id):
	try:
		conn = mysql.connect()
		cursor = conn.cursor()
		cursor.execute("DELETE FROM rest_emp WHERE id =%s", (id,))
		conn.commit()
		respone = jsonify('Employee deleted successfully!')
		respone.status_code = 200
		return respone
	except Exception as e:
		print(e)
	finally:
		cursor.close() 
		conn.close()
		
@app.errorhandler(404)
def not_found(error=None):
    message = {
        'status': 404,
        'message': 'Record not found: ' + request.url,
    }
    respone = jsonify(message)
    respone.status_code = 404
    return respone
		
if __name__ == "__main__":
    app.run()

Make Asynchronous API Call

Add the code below to 

const AstrologyAPI = require('./astrology')

const asyncApiCall = async () => {
    const response = await AstrologyAPI.getCompatibility('Austin', '1987-05-21', 'Taylor', '1989-09-27')

    console.log(response.data.data.Compatibility.heading)
    console.log(response.data.data.Compatibility)
}

asyncApiCall()

At the top of the file, our function imports an object from . An asynchronous function is defined that calls the  function on the imported object. Then, the data is pulled from the response object and logged to the console.

In the terminal enter the command .

The response log to the terminal should be similar to;

An Excellent Match
{
  heading: 'An Excellent Match',
  details: 'Both the Gemini and the Libra are typical air signs and this should make for similar mental characteristics. Both of them have a strong sense of personal freedom, and more importantly, give each other the required space in a relationship. They both desire constant change and share a very active social life. A Gemini and a Libra couple will indeed be extremely popular in the party circuit. However, one thing to be noted is that Libra is not domestic minded, and this might create bitterness especially when the Gemini is in a mood to settle down. Libra however profusely praises his/her lover, and this pleases the Gemini who loves attention. In the bedroom, Libra is sexually active and fulfills all Gemini fantasies. At work, both of them should be good colleagues as well as friends, and both have a strong marketing ability.'
}

Notice the first line, “An Excellent Match”, is the value from the response object.

Well done! We have made a successful API call using Node.js. Next, let’s take a look at how this can fit into a larger web application.

Example Application

In a different directory, run the following command to download the example application;

Change directories into the file and run .

Add API Call

The RapidAPI dashboard can be a useful tool when building an application that makes API calls. Navigate to the API dashboard page or follow this link.

The dashboard has three sections. On the left, select an endpoint.

The middle section provides a definition and displays parameters for the selected endpoint.

Finally, the far-right section has code snippets and example responses for the selected endpoint. Select the Node (Axios) library from the dropdown at the top of the section on the right.

Our setup in the file will be slightly different than the code snippet, but this code is an excellent place to start.

Copy the code below and paste it into 

const axios = require("axios");

const BASE_URL = `https://astrology-horoscope.p.rapidapi.com`

module.exports = {
    getCompatibility: (yourName, yourBirthday, theirName, theirBirthday) => axios({
        method:"POST",
        url : BASE_URL + `/zodiac_compatibility/result/`,
        headers: {
            "content-type":"application/x-www-form-urlencoded",
            "x-rapidapi-host":"astrology-horoscope.p.rapidapi.com",
            "x-rapidapi-key": "yourapikey"
        },
        params: {
            mystic_dob: yourBirthday,
            mystic_dob2: theirBirthday,
            mystic_name: yourName,
            mystic_name2: theirName
        }
    })
}

In the above code, we attach an axios API call, named on to the file export. The function takes four parameters. We determined those parameters from the middle section of the dashboard.

Replace  with your API-key value from the dashboard. It will be different from mine. It’s important to keep this value secret!

POST

Параметры сообщения работают с помощью payload.

http://localhost:8000/messages

server.route({
    method: 'POST',
    path: '/messages',
    handler: function (request, reply) {

    const uid = request.payload.uid;
    connection.query('SELECT * FROM messages WHERE uid_fk = "' + uid + '"',
    function (error, results, fields) {
        if (error) throw error;

        reply(results);
    });
},
config: {
    validate: {
    payload: {
    uid: Joi.number().integer()
}
}

}
});

Удаление

Удаление данных о посте на основе идентификатора пользователя и сообщения.

http://localhost:8000/message/1/3

server.route({
    method: 'DELETE',
    path: '/message/{uid}/{mid}',
    handler: function (request, reply) {
    const uid = request.params.uid;
    const mid = request.params.mid;
    connection.query('DELETE FROM messages WHERE uid_fk = "' + uid + '"AND 
    mid = "' + mid + '"',
    function (error, result, fields) {
       if (error) throw error;

       if (result.affectedRows) {
           reply(true);
       } else {
           reply(false);
       }
});
},
config: {
     validate: {
     params: {
       uid: Joi.number().integer(),
       mid: Joi.number().integer()
      }
     }
}
}); 

Писать впереди

Я перевел эту статью потому, что с тех пор, как я стал фронтенд-программистом, настройка интерфейса стала обычным делом и сопровождается бесчисленными аргументами и беспомощностью

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

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

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

Register (/sign-up) route (with JWT)

To add a new user to the database, we have to check if the username does not yet exist. If the user exists, an error message is issued. If the user does not yet exist, our module bcrypt is used to hash (encrypt) the entered password and then enter all data into the database.Advertisements

// routes/router.js

router.post('/sign-up', userMiddleware.validateRegister, (req, res, next) => {
  db.query(
    `SELECT * FROM users WHERE LOWER(username) = LOWER(${db.escape(
			req.body.username
		)});`,
    (err, result) => {
      if (result.length) {
        return res.status(409).send({
          msg: 'This username is already in use!'
        });
      } else {
        // username is available
        bcrypt.hash(req.body.password, 10, (err, hash) => {
          if (err) {
            return res.status(500).send({
              msg: err
            });
          } else {
            // has hashed pw => add to database
            db.query(
              `INSERT INTO users (id, username, password, registered) VALUES ('${uuid.v4()}', ${db.escape(
								req.body.username
							)}, ${db.escape(hash)}, now())`,
              (err, result) => {
                if (err) {
                  throw err;
                  return res.status(400).send({
                    msg: err
                  });
                }
                return res.status(201).send({
                  msg: 'Registered!'
                });
              }
            );
          }
        });
      }
    }
  );
});

Important is the function , e.g. in line 25. This masks passed parameters to avoid SQL injection. If the entry of the user is successful, the status code 201 (“created”) is returned and the function call is terminated.

Setting up an Express Router and creating routes

Our entry file is the index.js and contains the starting of our web servers and the integration of the routes we define in the file routes/router.js.

// index.js

const express = require('express');
const app = express();
const cors = require('cors');

// set up port
const PORT = process.env.PORT || 3000;

app.use(express.json());
app.use(cors());

// add routes
const router = require('./routes/router.js');
app.use('/api', router);

// run server
app.listen(PORT, () => console.log(`Server running on port ${PORT}`));

In the router.js we define our routes and then pack the logic into them. The reason why we use an extra file here is the clarity. If your application has 20 or more routes at some point, the index.js will be chaotic. That’s why we outsource our routes.

// routes/router.js

const express = require('express');
const router = express.Router();

const bcrypt = require('bcryptjs');
const uuid = require('uuid');
const jwt = require('jsonwebtoken');

const db = require('../lib/db.js');
const userMiddleware = require('../middleware/users.js');

router.post('/sign-up', (req, res, next) => {});

router.post('/login', (req, res, next) => {});

router.get('/secret-route', (req, res, next) => {
	res.send('This is the secret content. Only logged in users can see that!');
});

module.exports = router;

Here we register the route /api/sign-up for registration and /api/login for login. We also have the route /api/secret-route, which you should only be able to call if you are logged in. Currently every user can access it. More about this later.

In line 10 we also include our file for the database connection.

We also include the file ../middleware/users.js, which contains the code to verify the requests. This means that we check if the user has entered a password and the username complies with the guidelines. We later switch these queries as middleware into the call of our routes.

Express Routes: URIs are REST Resources

Another important aspect of REST is that every URI acts as a resource. So far, you have only operated on the root URI with your CRUD operations, which doesn’t really represent a resource in REST. In contrast, a resource could be a user resource, for example. Change your previously introduced routes to the following:

...

app.get('/users',(req, res)=>{

return res.send('GET HTTP method on user resource');

});

app.post('/users',(req, res)=>{

return res.send('POST HTTP method on user resource');

});

app.put('/users',(req, res)=>{

return res.send('PUT HTTP method on user resource');

});

app.delete('/users',(req, res)=>{

return res.send('DELETE HTTP method on user resource');

});

...

With cURL on your command line, you can go through the resource — represented by one URI — which offers all the CRUD operations via HTTP methods:

C for Create: HTTP POSTR for Read: HTTP GETU for Update: HTTP PUTD for Delete: HTTP DELETE

You will see a similar output as before, but this time you are operating on a user resource. For example, if you want to create a user, you hit the following URI:

curl -X POST http://localhost:3000/users-> POST HTTP method on user resource

Obviously we don’t transfer any information for creating a user yet, however, the API endpoint for creating a user would be available now. One piece is missing to make the PUT HTTP method (update operation) and DELETE HTTP method (delete operation) RESTful from a URI’s point of view:

...

app.get('/users',(req, res)=>{

return res.send('GET HTTP method on user resource');

});

app.post('/users',(req, res)=>{

return res.send('POST HTTP method on user resource');

});

app.put('/users/:userId',(req, res)=>{

return res.send(

`PUT HTTP method on user/${req.params.userId} resource`,

);

});

app.delete('/users/:userId',(req, res)=>{

return res.send(

`DELETE HTTP method on user/${req.params.userId} resource`,

);

});

...

In order to delete or update a user resource, you would need to know the exact user. That’s where unique identifiers are used. In our Express routes, we can assign unique identifiers with parameters in the URI. Then the callback function holds the URI’s parameter in the request object’s properties. Try again a cURL operation on , or another identifier with a DELETE or UPDATE HTTP method and verify that the identifier shows up in the command line as output.

Exercises:

  • Confirm your source code for the last section

    Confirm your changes from the last section.

    .

  • Try to delete or update a user by identifier with cURL.
  • Read more about basic routing in Express.

Что такое API

В широком смысле API — это интерфейс веб-приложения, позволяет публично использовать методы для доступа и управления извне. Обычное использование API — это когда необходимо получать данные из приложения (например, статья или какие-то другие данные) без фактического посещения ресурса (например сайта). Чтобы сделать это возможным, для приложения реализуется  API, который позволяет сторонним приложениям совершать запросы и возвращать указанные данные пользователю извне. В Интернете это часто делается с использованием RESTful.

В примере запроса статьи  API может содержать URI:

example.com/api/v1/recipe/article

Если отправить запрос GET в этот URL, ответ может быть списком самых последних новостей, запрос PUT может добавить новость в БД.

Если запросить /article /141, то это будет определенная новость. Это примеры показывают способ взаимодействия с приложением.

Create Database Component

With Mysqljs npm package, connecting to the database is very simple. Below is our database component and a utility method to run a query and send results back.

database.js

JavaScript

import mysql from «mysql»;

const pool = mysql.createPool({
connectionLimit : 10,
host : ‘localhost’,
user : ‘lessroot’,
password : ‘lessroot’,
database : ‘localdb’,
debug : false
});

function executeQuery(sql, callback) {
pool.getConnection((err,connection) => {
if(err) {
return callback(err, null);
} else {
if(connection) {
connection.query(sql, function (error, results, fields) {
connection.release();
if (error) {
return callback(error, null);
}
return callback(null, results);
});
}
}
});
}

function query(sql, callback) {
executeQuery(sql,function(err, data) {
if(err) {
return callback(err);
}
callback(null, data);
});
}

module.exports = {
query: query
}

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41

import mysql from»mysql»;

constpool=mysql.createPool({

connectionLimit10,

host’localhost’,

user’lessroot’,

password’lessroot’,

database’localdb’,

debugfalse

});

functionexecuteQuery(sql,callback){

pool.getConnection((err,connection)=>{

if(err){

returncallback(err,null);

}else{

if(connection){

connection.query(sql,function(error,results,fields){

connection.release();

if(error){

returncallback(error,null);

}

returncallback(null,results);

});

}

}

});

}
 

functionquery(sql,callback){

executeQuery(sql,function(err,data){

if(err){

returncallback(err);

}

callback(null,data);

});

}
 

module.exports={

queryquery

}

Please note that we are simply exporting the utility method and not the entire component.

Обзор проекта

1.1 Что такое REST API?

REST — это концепция (архитектура) для организации взаимодействия между независимыми объектами (приложениями) посредством протокола HTTP. Включает в себя набор принципов (рекомендаций) взаимодействия клиент-серверных приложений. Обычно он представлен в формате JSON.

API — интерфейс взаимодействия с каким-либо объектом (программой, приложением), включающий в себя набор правил, которые позволяют одному приложению общаться с другим. Эти «правила» могут включать в себя операции создания, чтения, обновления и удаления. Примером API может служить всем известная библиотека jQuery.

REST API позволяет вашему приложению взаимодействовать с одним или несколькими различными приложениями, используя концепции REST.

1.2 Зачем нужен REST API?

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

1.3 Где используется REST API?

REST API может использоваться любым приложением, которое может подключаться к Интернету. Если данные из приложения могут быть созданы, прочитаны, обновлены или удалены с помощью другого приложения, это обычно означает, что используется REST API.

Различайте 401 и 403.

Когда мы сталкиваемся с сообщениями об ошибках безопасности в API, легко спутать эти два разных типа ошибок.Сертификацияс участиемАвторизация(Например, разрешения связанные) -Честно говоря, часто путаю себя.

Вот памятка, которую я резюмировал сам, в которой объясняется, как я различаю их в реальных ситуациях:

  • Пользователь не предоставил учетные данные для аутентификации? Сертификация еще действительна? Этот тип ошибки обычно не аутентифицируется ()。
  • Пользователь был правильно аутентифицирован, но не имеет необходимых разрешений для доступа к ресурсу? Это вообще неавторизовано ()
Рейтинг
( Пока оценок нет )
Editor
Editor/ автор статьи

Давно интересуюсь темой. Мне нравится писать о том, в чём разбираюсь.

Понравилась статья? Поделиться с друзьями:
Люкс-хост
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: