{"id":353990,"date":"2024-05-20T22:39:23","date_gmt":"2024-05-20T22:39:23","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=353990"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=353990","title":{"rendered":"<span>\u041a\u0430\u043a \u043f\u0438\u0441\u0430\u0442\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0442\u0435\u0441\u0442\u044b \u0434\u043b\u044f \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041f\u0440\u0438\u0432\u0435\u0442! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0413\u0440\u0438\u0448\u0430 \u0438 \u044f \u0431\u044d\u043a\u0435\u043d\u0434 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043d\u0430 .net\u00a0<\/p>\n<p>\u0421 \u0434\u0440\u0443\u0437\u044c\u044f\u043c\u0438 \u043c\u044b \u0447\u0430\u0441\u0442\u043e \u043e\u0431\u0441\u0443\u0436\u0434\u0430\u0435\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u043a\u0430\u043a \u043f\u0438\u0448\u0443\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u0442\u0435\u0441\u0442\u044b. \u042f \u0447\u0430\u0441\u0442\u043e \u0441\u043b\u044b\u0448\u0443 \u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435\u0441\u0443\u0442 \u0431\u043e\u043b\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c \u0438 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441 \u044d\u0442\u0438\u043c \u043f\u0440\u0438\u043d\u043e\u0441\u044f\u0442 \u043c\u0430\u043b\u043e \u043f\u043e\u043b\u044c\u0437\u044b.\u00a0<\/p>\n<p>\u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u044f \u0441\u0442\u0440\u043e\u044e \u0432\u0435\u0441\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u043d\u0430 \u0442\u0435\u0441\u0442\u0430\u0445. \u042f \u0431\u044b \u0445\u043e\u0442\u0435\u043b \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0441\u0432\u043e\u0438\u043c \u0432\u0437\u0433\u043b\u044f\u0434\u043e\u043c \u043d\u0430 \u0442\u043e, \u043a\u0430\u043a \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043d\u044b\u0435 \u0442\u0435\u0441\u0442\u044b \u0438 \u0432 \u0447\u0451\u043c \u043e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u044b \u043f\u043e\u043c\u0438\u043c\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u0435\u0440\u0432\u0438\u0441\u0430.<\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043c\u0435\u0441\u0442\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043d\u044b\u0445 \u0442\u0435\u0441\u0442\u043e\u0432 \u0432 \u043f\u0438\u0440\u0430\u043c\u0438\u0434\u0435 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0437\u0430\u0447\u0435\u043c \u043e\u043d\u0438 \u043d\u0443\u0436\u043d\u044b \u0438 \u043a\u043e\u043c\u0443. \u041f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043f\u0440\u043e \u0442\u043e \u043a\u0430\u043a\u0438\u043c\u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u043e\u0431\u043b\u0430\u0434\u0430\u0442\u044c \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u044b\u0435 \u0442\u0435\u0441\u0442\u044b. \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u043e\u0434\u0445\u043e\u0434 \u043a \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u043e\u0431\u043b\u0430\u0434\u0430\u044e\u0449\u0438\u0445 \u0432\u0441\u0435\u043c\u0438 \u044d\u0442\u0438\u043c\u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438 \u0442\u0435\u0441\u0442\u043e\u0432 \u0438 \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u043f\u0430\u0440\u043e\u0447\u043a\u0443.<\/p>\n<h3>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/h3>\n<p>\u0412\u0441\u0435 \u0437\u043d\u0430\u044e\u0442 \u0447\u0442\u043e \u043b\u044e\u0431\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u043f\u0440\u043e \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u043e\u043b\u0436\u043d\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c\u0441\u044f \u0441 \u043f\u0438\u0440\u0430\u043c\u0438\u0434\u044b. \u042f \u043d\u0435 \u0432\u0435\u0440\u044e \u0432 \u043f\u0438\u0440\u0430\u043c\u0438\u0434\u0443 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u0430\u0445, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u043c\u0435\u0441\u0442\u043e \u043d\u0435\u0451 \u0431\u0443\u0434\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0447\u043a\u0430.<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td><\/td>\n<td>\n<p align=\"left\">\u0435nd2\u0435nd\u00a0<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043d\u044b\u0435\u00a0<\/p>\n<\/td>\n<td data-colwidth=\"142\" width=\"142\">\n<p align=\"left\">\u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041c\u043e\u0434\u0443\u043b\u044c\u043d\u044b\u0435<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0427\u0442\u043e \u0442\u0435\u0441\u0442\u0438\u0440\u0443\u044e\u0442<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0433\u0440\u0443\u043f\u043f\u0443 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0441\u0435\u0440\u0432\u0438\u0441 \u0432 \u0438\u0437\u043e\u043b\u044f\u0446\u0438\u0438\u00a0<\/p>\n<\/td>\n<td data-colwidth=\"142\" width=\"142\">\n<p align=\"left\">\u0447\u0430\u0441\u0442\u044c \u0441\u0435\u0440\u0432\u0438\u0441\u0430, \u043b\u0438\u0431\u043e \u0432\u0435\u0441\u044c \u0441\u0435\u0440\u0432\u0438\u0441 \u0441 \u0437\u0430\u043c\u043e\u043a\u0430\u043d\u044b\u043c\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043a\u043b\u0430\u0441\u0441 \u0438\u043b\u0438 \u043c\u0435\u0442\u043e\u0434<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0421\u043a\u043e\u0440\u043e\u0441\u0442\u044c<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e<\/p>\n<\/td>\n<td data-colwidth=\"142\" width=\"142\">\n<p align=\"left\">\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0431\u044b\u0441\u0442\u0440\u043e<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u041a\u0442\u043e \u043f\u0438\u0448\u0435\u0442<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0441\u043a\u043e\u0440\u0435\u0435 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0438 \u043d\u043e \u043c\u043e\u0433\u0443\u0442 \u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0441\u043a\u043e\u0440\u0435\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u043d\u043e \u043c\u043e\u0433\u0443\u0442 \u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0438<\/p>\n<\/td>\n<td data-colwidth=\"142\" width=\"142\">\n<p align=\"left\">\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0413\u0434\u0435 \u0436\u0438\u0432\u0443\u0442<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0441 \u043a\u043e\u0434\u043e\u043c<\/p>\n<\/td>\n<td data-colwidth=\"142\" width=\"142\">\n<p align=\"left\">\u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0441 \u043a\u043e\u0434\u043e\u043c<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0441 \u043a\u043e\u0434\u043e\u043c<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0411\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0442 \u043b\u0438 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d \u0432 ci<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043d\u0435\u0442<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0434\u0430<\/p>\n<\/td>\n<td data-colwidth=\"142\" width=\"142\">\n<p align=\"left\">\u0434\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0434\u0430<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0423\u0434\u043e\u0431\u043d\u043e \u043b\u0438 \u0434\u0435\u0431\u0430\u0436\u0438\u0442\u044c<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043d\u0435\u0442, \u0442\u043e\u043b\u044c\u043a\u043e remote debug<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0434\u0430<\/p>\n<\/td>\n<td data-colwidth=\"142\" width=\"142\">\n<p align=\"left\">\u0434\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0434\u0430<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u041a\u043e\u0433\u0434\u0430 \u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f \u043f\u0440\u0430\u0432\u043a\u0438<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043f\u043e\u043c\u0435\u043d\u044f\u043b\u0441\u044f \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043f\u043e\u043c\u0435\u043d\u044f\u043b\u0441\u044f \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442<\/p>\n<\/td>\n<td data-colwidth=\"142\" width=\"142\">\n<p align=\"left\">\u043f\u043e\u043c\u0435\u043d\u044f\u043b\u0430\u0441\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043f\u043e\u043c\u0435\u043d\u044f\u043b\u0430\u0441\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f\u00a0<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u041c\u043e\u0433\u0443\u0442 \u043b\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u043d\u0435\u0433\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043d\u0435\u0442<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0434\u0430<\/p>\n<\/td>\n<td data-colwidth=\"142\" width=\"142\">\n<p align=\"left\">\u0434\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0434\u0430<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0413\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0442 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 \u043c\u0430\u0448\u0438\u043d\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043d\u0435\u0442<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0434\u0430<\/p>\n<\/td>\n<td data-colwidth=\"142\" width=\"142\">\n<p align=\"left\">\u043d\u0435\u0442<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043d\u0435\u0442<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u041f\u043e\u043b\u0435\u0437\u043d\u044b \u0434\u043b\u044f \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0431\u0430\u0433\u043e\u0432<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043d\u0435\u0442<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0434\u0430\u00a0<\/p>\n<\/td>\n<td data-colwidth=\"142\" width=\"142\">\n<p align=\"left\">\u0441\u043a\u043e\u0440\u0435\u0435 \u043d\u0435\u0442\u00a0<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0441\u043a\u043e\u0440\u0435\u0435 \u043d\u0435\u0442<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u041f\u043e\u0434\u043d\u0438\u043c\u0430\u044e\u0442 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043d\u0435\u0442<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0434\u0430<\/p>\n<\/td>\n<td data-colwidth=\"142\" width=\"142\">\n<p align=\"left\">\u043d\u0435\u0442<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043d\u0435\u0442<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<ol>\n<li>\n<p>\u041c\u043e\u0434\u0443\u043b\u044c\u043d\u044b\u0435 \u0442\u0435\u0441\u0442\u044b \u0431\u044b\u0441\u0442\u0440\u044b\u0435, \u043f\u0440\u043e\u0441\u0442\u044b\u0435, \u043d\u043e \u043b\u043e\u043c\u0430\u044e\u0442\u0441\u044f \u043f\u0440\u0438 \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433\u0435. \u041e\u0431\u044b\u0447\u043d\u043e \u0438\u0445 \u043f\u0438\u0448\u0443\u0442 \u0434\u043b\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u0438\u043b\u0438 \u043a\u0430\u043a\u0438\u0445-\u0442\u043e \u0434\u0440\u0443\u0433\u0438\u0445 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0443\u0447\u0430\u0441\u0442\u043a\u043e\u0432 \u043a\u043e\u0434\u0430.<\/p>\n<p>\u042f \u0438\u0445 \u043f\u0438\u0448\u0443 \u043d\u0430 \u0434\u043e\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b, \u0435\u0441\u043b\u0438 \u0441\u0435\u0440\u0432\u0438\u0441 \u043d\u0430 \u0414\u0414\u0414. \u0415\u0441\u043b\u0438 \u0441\u0435\u0440\u0432\u0438\u0441 &#8212; \u044d\u0442\u043e \u043f\u0435\u0440\u0435\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u043d\u0438\u0435 json \u0438\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u043c\u0435\u0441\u0442\u0430 \u0432 \u0434\u0440\u0443\u0433\u043e\u0435, \u0442\u043e \u043c\u043e\u0433\u0443 \u0438 \u043d\u0435 \u043f\u0438\u0441\u0430\u0442\u044c \u0432\u043e\u043e\u0431\u0449\u0435.<\/p>\n<\/li>\n<li>\n<p>\u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0442\u0435\u0441\u0442\u044b &#8212; \u0447\u0442\u043e-\u0442\u043e \u0447\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u0435\u0435 \u0447\u0435\u043c Unit \u0442\u0435\u0441\u0442, \u043d\u043e \u043c\u0435\u043d\u044c\u0448\u0435 \u0447\u0435\u043c \u0442\u0435\u0441\u0442, \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u0432\u0435\u0441\u044c \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441. \u042d\u0442\u043e \u0442\u0435\u0441\u0442\u044b \u043d\u0430 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u0432 \u0441\u0432\u044f\u0437\u043a\u0435 \u0441 \u0411\u0414, \u0442\u0435\u0441\u0442\u044b \u043d\u0430 \u0441\u0435\u0440\u0432\u0438\u0441, \u043d\u043e \u0441 \u0437\u0430\u043c\u043e\u043a\u0430\u043d\u043d\u044b\u043c\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438 &#8212; \u043e\u0431\u044b\u0447\u043d\u043e \u043e\u043d\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e\u0442 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0447\u0430\u0441\u0442\u0435\u0439 \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d \u0437\u0430\u043f\u0440\u043e\u0441\u0430.\u00a0\u00a0<\/p>\n<p>\u042f \u0442\u0430\u043a\u0438\u0435 \u0442\u0435\u0441\u0442\u044b \u043d\u0435 \u043f\u0438\u0448\u0443 \u0437\u0430 \u0440\u0435\u0434\u043a\u0438\u043c\u0438 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f\u043c\u0438 &#8212; \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u043e\u0433\u0434\u0430 \u0432 \u0411\u0414 \u0438\u0434\u0443\u0442 \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0438 \u0438\u0445 \u043d\u0430\u0434\u043e \u043f\u043e\u0442\u0435\u0441\u0442\u0438\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e.<\/p>\n<\/li>\n<li>\n<p>\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043d\u044b\u0435 \u0442\u0435\u0441\u0442\u044b \u0442\u0435\u0441\u0442\u0438\u0440\u0443\u044e\u0442 \u0441\u0435\u0440\u0432\u0438\u0441 \u0446\u0435\u043b\u0438\u043a\u043e\u043c, \u043d\u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u0445 (\u041c\u044b \u043d\u0435 \u0432\u043c\u0435\u0448\u0438\u0432\u0430\u0435\u043c\u0441\u044f \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e DI \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0438 \u043d\u0435 \u043f\u043e\u0434\u0441\u043e\u0432\u044b\u0432\u0430\u0435\u043c \u0442\u0443\u0434\u0430 \u0437\u0430\u0433\u043b\u0443\u0448\u043a\u0438 &#8212; \u0441\u0435\u0440\u0432\u0438\u0441 \u0448\u043b\u0451\u0442 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0435 \u043e\u0442\u0432\u0435\u0442\u044b). \u0412 \u0438\u0434\u0435\u0430\u043b\u0435 \u0442\u0430\u043a\u0438\u0435 \u0442\u0435\u0441\u0442\u044b \u0442\u0430\u043a\u0436\u0435 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u044e\u0442 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0442\u0430\u0432\u0438\u043b\u0438\u0441\u044c \u043f\u0435\u0440\u0435\u0434 \u0435\u0433\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439, \u0438 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u044e\u0442 \u0447\u0442\u043e \u0441\u0435\u0440\u0432\u0438\u0441 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0438\u043c.\u00a0<\/p>\n<p>\u042f \u0441\u0442\u0430\u0440\u0430\u044e\u0441\u044c \u043f\u0438\u0441\u0430\u0442\u044c \u0438\u0445 \u0432\u0441\u0435\u0433\u0434\u0430.<\/p>\n<\/li>\n<li>\n<p>End2End \u0442\u0435\u0441\u0442\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e\u0442 \u0441\u0432\u044f\u0437\u043a\u0443 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 &#8212; \u043e\u0431\u044b\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u044b\u0435 \u043f\u043e\u0437\u0438\u0442\u0438\u0432\u043d\u044b\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438. \u0415\u0441\u043b\u0438 \u0432\u0441\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0432 \u0441\u0432\u044f\u0437\u043a\u0435 \u043f\u043e\u043a\u0440\u044b\u0442\u044b \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u0442\u043d\u044b\u043c\u0438 \u0442\u0435\u0441\u0442\u0430\u043c\u0438, \u0442\u043e e2e \u043f\u043e \u0441\u0443\u0442\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043b\u0438\u0448\u044c, \u0447\u0442\u043e \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442 \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0441\u044f, \u0438 \u0441\u0432\u044f\u0437\u043a\u0430 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u0435.<\/p>\n<p>\u042f \u0440\u0435\u0434\u043a\u043e \u043f\u0438\u0448\u0443 \u044d\u0442\u0438 \u0442\u0435\u0441\u0442\u044b &#8212; \u043e\u0431\u044b\u0447\u043d\u043e, \u043a\u043e\u0433\u0434\u0430 \u0441\u043e\u043c\u043d\u0435\u0432\u0430\u044e\u0441\u044c, \u0447\u0442\u043e \u0432\u0442\u043e\u0440\u0430\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u0430 \u043d\u0435 \u043f\u043e\u043c\u0435\u043d\u044f\u0435\u0442 \u043d\u0430\u0448 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442.<\/p>\n<\/li>\n<\/ol>\n<p>\u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u0432 \u0441\u0435\u0440\u0432\u0438\u0441 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435 \u0442\u0435\u0441\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0443\u0436\u043d\u044b &#8212; \u0432 \u043c\u043e\u0451\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u0431\u044b\u043b \u0431\u044b \u0441\u043a\u043e\u0440\u0435\u0435 \u0440\u043e\u043c\u0431 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0415\u0441\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b &#8212; \u0435\u0441\u0442\u044c \u044e\u043d\u0438\u0442 \u0442\u0435\u0441\u0442\u044b. \u0415\u0441\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0438\u0437 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 &#8212; \u043d\u0435\u043f\u043b\u043e\u0445\u043e \u0431\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u04352\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439. \u0412\u043e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043d\u044b\u0435 \u0442\u0435\u0441\u0442\u044b \u044f \u0441\u0442\u0430\u0440\u0430\u044e\u0441\u044c \u043f\u0438\u0441\u0430\u0442\u044c \u0432\u0441\u0435\u0433\u0434\u0430 \u0438 \u043c\u043d\u043e\u0433\u043e. \u0418 \u0433\u043b\u0430\u0432\u043d\u0430\u044f \u043f\u0440\u0438\u0447\u0438\u043d\u0430 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e &#8212; \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 3 \u043f\u0443\u043d\u043a\u0442\u0430 \u0432 \u0442\u0430\u0431\u043b\u0438\u0447\u043a\u0435.\u00a0\u042f \u043f\u0440\u043e\u0431\u0435\u0433\u0443\u0441\u044c \u043f\u043e \u043a\u0430\u0436\u0434\u043e\u043c\u0443:<\/p>\n<ol>\n<li>\n<p>\u041f\u043e\u0434\u043d\u0438\u043c\u0430\u044e\u0442 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 &#8212; \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b \u0442\u0435\u0441\u0442\u044b, \u043e\u043d\u0438 \u043f\u0440\u043e\u0448\u043b\u0438 \u0438\u043b\u0438 \u0443\u043f\u0430\u043b\u0438 &#8212; \u0443 \u0442\u0435\u0431\u044f \u0443\u0436\u0435 \u0432\u0441\u0435 \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0434\u043b\u044f \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u043f\u043e\u0434\u043d\u044f\u0442\u043e \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u0432 \u0434\u043e\u043a\u0435\u0440\u0435 &#8212; \u0431\u0430\u0437\u0430, RabbitMq \u0438\u043b\u0438 Kafka, http \u043c\u043e\u043a\u0438 &#8212; \u0432\u0441\u0435 \u0447\u0442\u043e \u0432\u043e\u043e\u0431\u0449\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u043d\u044f\u0442\u044c \u0442\u0430\u043c. \u042d\u0442\u043e \u0443\u0434\u043e\u0431\u043d\u043e.<\/p>\n<\/li>\n<li>\n<p>\u0413\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0442 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 \u043c\u0430\u0448\u0438\u043d\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 &#8212; \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0434\u0435\u0431\u0430\u0436\u0438\u0442\u044c \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u043e\u0434 \u0434\u043b\u044f \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0434\u0440\u0443\u0433\u043e\u0439, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0442\u0440\u0435\u0442\u0435\u0439 \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435 &#8212; \u0437\u0430\u043f\u0443\u0441\u0442\u0438 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u0442\u0435\u0441\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432 \u0441\u0432\u043e\u0438\u0445 \u0448\u0430\u0433\u0430\u0445 \u044d\u0442\u0438 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0442. \u0418 \u0434\u0430 &#8212; \u043e\u043d \u0431\u0443\u0434\u0435\u0442 &#8212; \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043d\u0430 \u0432\u0441\u0435 CRUD \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0442\u0430\u043a\u0438\u0435 \u0442\u0435\u0441\u0442\u044b \u043f\u0438\u0448\u0443\u0442\u0441\u044f. \u042d\u0442\u043e \u0441\u0443\u043f\u0435\u0440 \u0443\u0434\u043e\u0431\u043d\u043e.<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u043b\u0435\u0437\u043d\u044b \u0434\u043b\u044f \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0431\u0430\u0433\u043e\u0432 &#8212; \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u0432\u043c\u0435\u0441\u0442\u043e \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u0448\u0430\u0433\u043e\u0432\u043e\u0433\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0431\u0430\u0433\u0430 \u0434\u0435\u043b\u0430\u0435\u0442 \u043c\u0435\u0440\u0436 \u0440\u0435\u043a\u0432\u0435\u0441\u0442 \u0441 \u0442\u0435\u0441\u0442\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442. \u0422\u044b \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0448\u044c \u0435\u0433\u043e \u0438 \u0434\u0435\u0431\u0430\u0436\u0438\u0448\u044c. \u042d\u0442\u043e \u0441\u0443\u043f\u0435\u0440 \u043c\u0435\u0433\u0430 \u0443\u0434\u043e\u0431\u043d\u043e &#8212; \u043f\u043e \u043a\u0440\u0430\u0439\u043d\u0435\u0439 \u043c\u0435\u0440\u0435 \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 ?<\/p>\n<\/li>\n<\/ol>\n<h2>\u0427\u0430\u0441\u0442\u044c 1. \u0421\u0445\u0435\u043c\u0430 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430<\/h2>\n<p>\u0411\u043b\u0438\u0436\u0435 \u043a \u0434\u0435\u043b\u0443! \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u043a\u0440\u043e\u0435\u043c \u0442\u0438\u043f\u043e\u0432\u043e\u0439 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043d\u044b\u043c\u0438 \u0442\u0435\u0441\u0442\u0430\u043c\u0438 \u0438 \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0443\u0434\u043e\u0431\u043d\u043e \u044d\u0442\u043e \u0438\u043b\u0438 \u043d\u0435\u0442. \u0421\u0445\u0435\u043c\u0430 \u0442\u0435\u0441\u0442\u0430 \u0443 \u043d\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f <\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/faf\/d9b\/427\/fafd9b4270f6af4f61dcca6f1c223c83.jpg\" alt=\"\u0421\u0445\u0435\u043c\u0430 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430\" title=\"\u0421\u0445\u0435\u043c\u0430 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430\" width=\"1280\" height=\"889\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/faf\/d9b\/427\/fafd9b4270f6af4f61dcca6f1c223c83.jpg\" data-blurred=\"true\"\/><\/p>\n<div><figcaption>\u0421\u0445\u0435\u043c\u0430 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430<\/figcaption><\/div>\n<\/figure>\n<ol>\n<li>\n<p>\u041f\u0435\u0440\u0435\u0434 \u0437\u0430\u043f\u0443\u0441\u043a\u043e\u043c \u0442\u0435\u0441\u0442\u043a\u0435\u0439\u0441\u043e\u0432 \u043f\u043e\u0434\u043d\u0438\u043c\u0435\u043c \u0432\u0441\u0451 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u0443 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u0432 \u0434\u043e\u043a\u0435\u0440\u0435 &#8212; \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0441 \u0431\u0430\u0437\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445, \u0431\u0440\u043e\u043a\u0435\u0440\u043e\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0438 \u043f\u0440\u043e\u0447\u0438\u043c. \u0415\u0441\u043b\u0438 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0435 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f &#8212; \u043f\u043e\u0434\u043d\u0438\u043c\u0435\u043c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0434\u043b\u044f \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0437\u0430\u0433\u043b\u0443\u0448\u0435\u043a \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e Mountebank &#8212; \u0430 \u0437\u0430\u0433\u043b\u0443\u0448\u043a\u0438 \u0442\u0430\u043c \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f imposter.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0435\u0440\u0435\u0434 \u043a\u0430\u0436\u0434\u044b\u043c \u0442\u0435\u0441\u0442\u043a\u0435\u0439\u0441\u043e\u043c \u0431\u0443\u0434\u0435\u043c \u043e\u0447\u0438\u0449\u0430\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u043e\u0442 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u043b\u0438 \u0442\u0430\u043c \u043e\u0441\u0442\u0430\u0442\u044c\u0441\u044f \u043e\u0442 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u043a\u0435\u0439\u0441\u043e\u0432.<\/p>\n<\/li>\n<li>\n<p>\u041a\u0430\u0436\u0434\u044b\u0439 \u0442\u0435\u0441\u0442\u043a\u0435\u0439\u0441 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u0442\u044c \u0438\u0437 3 \u044d\u0442\u0430\u043f\u043e\u0432:<\/p>\n<ul>\n<li>\n<p>Given &#8212; \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f. \u042d\u0442\u043e\u0442 \u044d\u0442\u0430\u043f \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439. \u041e\u0431\u044b\u0447\u043d\u043e \u0442\u0430\u043c \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0438\u043c\u043f\u043e\u0441\u0442\u0435\u0440\u044b \u0441 \u0442\u0440\u0435\u0431\u0443\u0435\u043c\u044b\u043c \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435\u043c \u0434\u043b\u044f \u043f\u0440\u043e\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u0442\u0435\u0441\u0442\u043a\u0435\u0439\u0441\u0430.<\/p>\n<\/li>\n<li>\n<p>When &#8212; \u0438\u043d\u0438\u0446\u0438\u0438\u0440\u0443\u044e\u0449\u0435\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435. \u041e\u0431\u044b\u0447\u043d\u043e \u044d\u0442\u043e \u0437\u0430\u043f\u0440\u043e\u0441 \u0432 \u0441\u0435\u0440\u0432\u0438\u0441, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043e\u0442\u0432\u0435\u0442\u0430 \u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u043e\u0442\u0432\u0435\u0442\u0430 \u0432 \u043e\u0431\u0449\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e.<\/p>\n<\/li>\n<li>\n<p>Then &#8212; \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430. \u041e\u0431\u044b\u0447\u043d\u043e \u044d\u0442\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 http \u043e\u0442\u0432\u0435\u0442\u0430 + \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439, \u0442\u0440\u0435\u0431\u0443\u0435\u043c\u044b\u0445 \u043f\u043e \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u0443. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0432 RabbitMQ \u0432\u044b\u0433\u0440\u0443\u0437\u0438\u043b\u043e\u0441\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0438 \u043e\u043d\u043e \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e. <br \/>\u0422\u0430\u043a\u0436\u0435 \u0432 \u044d\u0442\u043e\u043c \u043c\u0435\u0442\u043e\u0434\u0435 \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u044e\u0442\u0441\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b \u0434\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0438\u0445 \u0448\u0430\u0433\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438 \u043f\u043e\u043c\u0435\u0449\u0430\u044e\u0442\u0441\u044f \u0432 \u043e\u0431\u0449\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u043e\u0436\u043d\u043e \u0438\u0437\u0432\u043b\u0435\u0447\u044c id \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0442\u043e\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0435\u0451 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<h2>\u0427\u0430\u0441\u0442\u044c 2. \u041f\u0438\u0448\u0435\u043c \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a<\/h2>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u044d\u0442\u0443 \u0441\u0445\u0435\u043c\u0443 \u0432 \u043a\u043e\u0434\u0435 \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0447\u0430\u0441\u0442\u043e \u0437\u0430\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0445 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432 FAQ:<\/p>\n<ol>\n<li>\n<p>\u0421\u0435\u0440\u0432\u0438\u0441 \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c API \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439 \u0438 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432.\u00a0<\/p>\n<\/li>\n<li>\n<p>\u041e\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u0443\u043c\u0435\u0442\u044c \u0438\u0441\u043a\u0430\u0442\u044c \u043f\u043e \u0442\u0435\u043a\u0441\u0442\u0443 \u0432\u043e\u043f\u0440\u043e\u0441\u0430.<\/p>\n<\/li>\n<li>\n<p>\u0421\u0435\u0440\u0432\u0438\u0441 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0437\u0430\u043a\u0440\u044b\u0442 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0447\u0435\u0440\u0435\u0437 jwt \u0442\u043e\u043a\u0435\u043d.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0432\u043e\u043f\u0440\u043e\u0441\u0430 \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0435\u0433\u043e \u0432 \u0441\u0435\u0440\u0432\u0438\u0441 \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u0438 \u0447\u0435\u0440\u0435\u0437 RabbitMQ.<\/p>\n<\/li>\n<\/ol>\n<p>\u0412\u043e\u0442 \u043a\u043e\u0434 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u0432 \u0441\u0435\u0440\u0432\u0438\u0441\u0430.<\/p>\n<details class=\"spoiler\">\n<summary>CategoryController<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cs\">[ApiController] [Authorize] [Route(\"api\/v1\/categories\")] public class CategoryController : ControllerBase {     private readonly FaqDbContext _dbContext;          public CategoryController(FaqDbContext dbContext) => _dbContext = dbContext;      [HttpGet]     public async Task&lt;List&lt;CategoryDto>> GetAllCategoriesAsync()          => await _dbContext.Categories.Include(x=>x.Questions)             .Select(x=>new CategoryDto(x)).ToListAsync();      [HttpGet(\"{id}\")]     public async Task&lt;CategoryDto> GetCategoryById([FromRoute] Guid id)     {         var category = await _dbContext.Categories.Include(x=>x.Questions)             .FirstAsync(x => x.Id == id);                  return new CategoryDto(category);     }      [HttpPost]     public async Task&lt;CategoryDto> CreateCategory([FromBody] CategoryDto categoryDto)     {         var category = new Category(categoryDto.Id, categoryDto.Name);                  await _dbContext.Categories.AddAsync(category);         await _dbContext.SaveChangesAsync();                  return new CategoryDto(category);     }      [HttpPut(\"{id}\")]     public async Task&lt;CategoryDto> UpdateCategory([FromRoute] Guid id, [FromBody] CategoryDto categoryDto)     {         var category = await _dbContext.Categories.FirstAsync(x => x.Id == id);         category.Name = categoryDto.Name;                  await _dbContext.SaveChangesAsync();                  return new CategoryDto(category);     }      [HttpDelete(\"{id}\")]     public async Task DeleteCategory([FromRoute] Guid id)     {         var category = await _dbContext.Categories.FirstAsync(x => x.Id == id);                  _dbContext.Categories.Remove(category);         await _dbContext.SaveChangesAsync();     } }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>QuestionController<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cs\">[ApiController] [Authorize] [Route(\"api\/v1\/questions\")] public class QuestionController : ControllerBase {     private readonly FaqDbContext _dbContext;      public QuestionController(FaqDbContext dbContext) => _dbContext = dbContext;      [HttpGet(\"{id}\")]     public async Task&lt;QuestionDto?> GetQuestionById([FromRoute] Guid id)     {         var question = await _dbContext.Questions.FirstAsync(x => x.Id == id);         return new QuestionDto(question);     }          [HttpGet]     public async Task&lt;List&lt;QuestionDto>> Search([FromQuery]string? search)     {         var questionQuery = _dbContext.Questions.AsQueryable();                  if (search != null)         {             questionQuery = questionQuery.Where(x =>                 EF.Functions.ILike(x.Title, $\"%{search}%\") ||                 EF.Functions.ILike(x.Answer, $\"%{search}%\")             );         }         var questions = await questionQuery.ToListAsync();         return questions.Select(x => new QuestionDto(x)).ToList();     }      [HttpPost]     public async Task&lt;QuestionDto> CreateQuestion([FromBody] QuestionDto questionDto)     {         var question = new Question(questionDto.Id, questionDto.Title, questionDto.Answer, questionDto.CategoryId);          _dbContext.Questions.Add(question);         await _dbContext.SaveChangesAsync();                  var factory = new ConnectionFactory         {             UserName = \"guest\",             Password = \"guest\",             VirtualHost = \"\/\",             HostName = \"localhost\",             Port = 5672         };                  using (var connection = factory.CreateConnection())         using (var channel = connection.CreateModel())         {             channel.ExchangeDeclare(\"FaqExchange\", ExchangeType.Direct, durable: true);             channel.QueueDeclare(\"FaqQueue\", true, false, false);             channel.QueueBind(\"FaqQueue\", \"FaqExchange\", \"FaqRoutingKey\");              var body = Encoding.UTF8.GetBytes(JsonSerializer.Serialize(question));                          channel.BasicPublish(exchange:\"FaqExchange\",                 routingKey:\"FaqRoutingKey\",                 basicProperties:null,                 body: body);         }                  return new QuestionDto(question);     }      [HttpPut(\"{id}\")]     public async Task&lt;QuestionDto> UpdateQuestion([FromRoute] Guid id, [FromBody] QuestionDto questionDto)     {         var question = await _dbContext.Questions.FirstAsync(x => x.Id == id);                  question.Title = questionDto.Title;         question.Answer = questionDto.Answer;         question.CategoryId = questionDto.CategoryId;                  await _dbContext.SaveChangesAsync();         return new QuestionDto(question);     }      [HttpDelete(\"{id}\")]     public async Task DeleteQuestion([FromRoute] Guid id)     {         var question = await _dbContext.Questions.FirstAsync(x => x.Id == id);                  _dbContext.Questions.Remove(question);         await _dbContext.SaveChangesAsync();     } }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0412\u0430\u043c \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0447\u0442\u043e \u043a\u043e\u0434 \u043f\u043b\u043e\u0445\u043e\u0439 \u0438 \u0435\u0433\u043e \u043d\u0430\u0434\u043e \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c? \u0412\u0430\u043c \u043d\u0435 \u043a\u0430\u0436\u0435\u0442\u0441\u044f. \u041d\u043e \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u0442\u044c \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441, \u043c\u044b \u0436\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u043e\u043a\u0440\u044b\u0442\u044c \u0435\u0433\u043e \u0442\u0435\u0441\u0442\u0430\u043c\u0438, \u0447\u0442\u043e\u0431\u044b \u0431\u044b\u0442\u044c \u0443\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u043c\u0438, \u0447\u0442\u043e \u043c\u044b \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0441\u043b\u043e\u043c\u0430\u0435\u043c ?<\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043f\u0440\u043e\u0435\u043a\u0442 \u0441 \u0434\u043b\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043d\u044b\u0445 \u0442\u0435\u0441\u0442\u043e\u0432 \u0441\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438<\/p>\n<details class=\"spoiler\">\n<summary>csproj \u0444\u0430\u0439\u043b \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0441 \u0442\u0435\u0441\u0442\u0430\u043c\u0438<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"xml\">&lt;ItemGroup>    &lt;!-- \u043a\u043b\u0438\u0435\u043d\u0442 \u0434\u043b\u044f mountebank -->    &lt;PackageReference Include=\"MbDotNet\" Version=\"5.0.0\" \/>      &lt;!-- \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c jwt \u0442\u043e\u043a\u0435\u043d -->    &lt;PackageReference Include=\"jose-jwt\" Version=\"4.1.0\" \/>      &lt;!-- \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c\/\u0437\u0430\u043a\u0440\u044b\u0442\u044b\u043c RSA \u043a\u043b\u044e\u0447\u0430\u043c\u0438 -->    &lt;PackageReference Include=\"Portable.BouncyCastle\" Version=\"1.9.0\" \/>      &lt;!-- \u043a\u043b\u0438\u0435\u043d\u0442 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0434\u043e\u043a\u0435\u0440 -->    &lt;PackageReference Include=\"Docker.DotNet\" Version=\"3.125.15\" \/>      &lt;!-- \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u044b\u0440\u0430\u0437\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0432 \u0442\u0435\u0441\u0442\u0435  -->    &lt;PackageReference Include=\"FluentAssertions\" Version=\"6.12.0\" \/>       &lt;!-- \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u043b\u044f \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u0432 \u0432 BDD \u0441\u0442\u0438\u043b\u0435 -->    &lt;PackageReference Include=\"SpecFlow\" Version=\"3.9.74\" \/>    &lt;PackageReference Include=\"SpecFlow.xUnit\" Version=\"3.9.74\" \/>      &lt;!-- \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u0442\u0435\u0441\u0442\u0432\u043e\u0430\u044f \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 -->    &lt;PackageReference Include=\"Microsoft.AspNetCore.Mvc.Testing\" Version=\"7.0.10\" \/>    &lt;PackageReference Include=\"Microsoft.NET.Test.Sdk\" Version=\"17.7.2\" \/>    &lt;PackageReference Include=\"xunit.runner.visualstudio\" Version=\"2.5.0\">      &lt;PrivateAssets>all&lt;\/PrivateAssets>      &lt;IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive&lt;\/IncludeAssets>    &lt;\/PackageReference> &lt;\/ItemGroup> <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043d\u0430\u0448 \u043c\u0438\u043a\u0440\u043e\u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u0442\u044c \u0438\u0437 4 \u0444\u0430\u0439\u043b\u043e\u0432:<\/p>\n<details class=\"spoiler\">\n<summary>ScenarioBeforeAndAfter<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cs\">[assembly: CollectionBehavior(DisableTestParallelization = true)] namespace ComponentTests;  [Binding] public static class ScenarioBeforeAndAfter {     \/\/\/ &lt;summary>     \/\/\/ \u041f\u0435\u0440\u0435\u0434 \u0437\u0430\u043f\u0443\u0441\u043a\u043e\u043c \u0442\u0435\u0441\u0442\u043e\u0432 \u043f\u043e\u0434\u043d\u0438\u043c\u0435\u043c \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u0432 \u0434\u043e\u043a\u0435\u0440\u0435     \/\/\/ &lt;\/summary>     [BeforeTestRun]     public static async Task BeforeTestRun()     {         await ExtEnvironment.Start();     }      \/\/\/ &lt;summary>     \/\/\/ \u041f\u0435\u0440\u0435\u0434 \u043a\u0430\u0436\u0434\u044b\u043c \u0442\u0435\u0441\u0442\u043e\u043c \u043f\u043e\u0447\u0438\u0441\u0442\u0438\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435     \/\/\/ &lt;\/summary>     [BeforeScenario]     public static async Task BeforeScenario()     {         await ExtEnvironment.PostgresContainer.DeleteAllData();         await ExtEnvironment.MountebankClient.DeleteImposterAsync(4501);         await ExtEnvironment.RabbitMqClient.ClearQueue(\"FaqQueue\");                  Common.ClearState();     } }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u041f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u0442\u0435\u0441\u0442\u043e\u0432 \u043c\u044b \u043f\u0435\u0440\u0432\u044b\u043c \u0434\u0435\u043b\u043e\u043c \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u043c \u0441\u044e\u0434\u0430. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u044b \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0432\u043d\u0435\u0448\u043d\u0435\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0441\u0435\u0440\u0432\u0438\u0441\u0430, \u0437\u0430\u0442\u0435\u043c \u043f\u0435\u0440\u0435\u0434 \u043a\u0430\u0436\u0434\u044b\u043c \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u043c \u043e\u0447\u0438\u0449\u0430\u0435\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u0445.<\/p>\n<details class=\"spoiler\">\n<summary>ExtEnvironment<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cs\">\/\/\/ &lt;summary> \/\/\/ \u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0432\u043d\u0435\u0448\u043d\u0438\u043c\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438 \/\/\/ &lt;\/summary> public static class ExtEnvironment {     \/\/\/ &lt;summary>     \/\/\/ Postgres \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440     \/\/\/ &lt;\/summary>     public static PostgresContainer PostgresContainer { get; set; }              \/\/\/ &lt;summary>     \/\/\/ MountebankContainer \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440     \/\/\/ &lt;\/summary>     public static MountebankContainer MountebankContainer { get; set; }          \/\/\/ &lt;summary>     \/\/\/ Postgres \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440     \/\/\/ &lt;\/summary>     public static RabbitmqContainer RabbitmqContainer { get; set; }      \/\/\/ &lt;summary>     \/\/\/ \u0422\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u0441\u0435\u0440\u0432\u0435\u0440 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f     \/\/\/ &lt;\/summary>     public static TestServer TestServer { get; set;}          \/\/\/ &lt;summary>     \/\/\/ \u041a\u043b\u0438\u0435\u043d\u0442 \u0434\u043b\u044f \u043c\u0430\u0443\u043d\u0442\u0431\u0430\u043d\u043a\u0430     \/\/\/ &lt;\/summary>     public static MountebankClient MountebankClient { get; private set; } = new(new Uri(\"http:\/\/localhost:2525\"));          \/\/\/ &lt;summary>     \/\/\/ \u041a\u043b\u0438\u0435\u043d\u0442 \u0434\u043b\u044f RabbitMq     \/\/\/ &lt;\/summary>     public static RabbitMqClient RabbitMqClient { get; private set; } = new();      \/\/\/ &lt;summary>     \/\/\/ ctor     \/\/\/ &lt;\/summary>     public static async Task Start()     {         var dockerClient = new DockerClientConfiguration(new Uri(DockerApiUri())).CreateClient();                  \/\/ \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438         PostgresContainer = new PostgresContainer(dockerClient);         RabbitmqContainer = new RabbitmqContainer(dockerClient);         MountebankContainer = new MountebankContainer(dockerClient);                  \/\/ \u0413\u043e\u0442\u043e\u0432\u0438\u043c \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 - \u0443\u0434\u0430\u043b\u044f\u0435\u043c \u043b\u0438\u0448\u043d\u0435\u0435 \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043d\u0443\u0436\u043d\u044b\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b         await RemoveAllContainers(dockerClient);         await Task.WhenAll(PostgresContainer.StartContainer(), RabbitmqContainer.StartContainer(), MountebankContainer.StartContainer());          \/\/ \u0421\u0442\u0430\u0440\u0442\u0443\u0435\u043c \u0441\u0435\u0440\u0432\u0435\u0440 \u0441 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c         TestServer = CreateServer();     }      \/\/\/ &lt;summary>     \/\/\/ \u0421\u0442\u0430\u0440\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0441 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c     \/\/\/ &lt;\/summary>     private static TestServer CreateServer()     {         \/\/ \u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0443\u0435\u043c \u043d\u0430\u0448\u0435 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0435\u0436\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f         Environment.SetEnvironmentVariable(\"ASPNETCORE_ENVIRONMENT\", \"Development\");                  Environment.SetEnvironmentVariable(\"DBSETTINGS__USER\", \"faq\");         Environment.SetEnvironmentVariable(\"DBSETTINGS__PASSWORD\", \"faq\");         Environment.SetEnvironmentVariable(\"DBSETTINGS__HOST\", \"127.0.0.1\");         Environment.SetEnvironmentVariable(\"DBSETTINGS__PORT\", \"5432\");         Environment.SetEnvironmentVariable(\"DBSETTINGS__DBNAME\", \"faq\");                  Environment.SetEnvironmentVariable(\"AUTHENTICATION_AUTHORITY\", \"http:\/\/localhost:4501\/auth\/realms\/myrealm\");          return new WebApplicationFactory&lt;Program>().Server;     }      \/\/\/ &lt;summary>     \/\/\/ \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 Url API Docker     \/\/\/ &lt;\/summary>     \/\/\/ &lt;returns>Url&lt;\/returns>     \/\/\/ &lt;exception cref=\"Exception\">\u041e\u0448\u0438\u0431\u043a\u0430 \u0435\u0441\u043b\u0438 \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u041e\u0421&lt;\/exception>     private static string DockerApiUri()     {         var isWindows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows);         if (isWindows)         {             return \"npipe:\/\/.\/pipe\/docker_engine\";         }          var isLinux = RuntimeInformation.IsOSPlatform(OSPlatform.Linux);         if (isLinux)         {             return \"tcp:\/\/127.0.0.1:2375\";         }                      var isOsx = RuntimeInformation.IsOSPlatform(OSPlatform.OSX);         if (isOsx)         {             return \"unix:\/\/\/var\/run\/docker.sock\";         }          throw new Exception(\"Was unable to determine what OS this is running on\");     }          \/\/\/ &lt;summary>     \/\/\/ \u041e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0432\u0441\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b     \/\/\/ &lt;\/summary>     private static async Task RemoveAllContainers(DockerClient dockerClient)     {         IList&lt;ContainerListResponse> containers = await dockerClient.Containers.ListContainersAsync(new ContainersListParameters());         foreach (var container in containers)         {             await dockerClient.Containers.KillContainerAsync(container.ID, new ContainerKillParameters());             await dockerClient.Containers.RemoveContainerAsync(container.ID, new ContainerRemoveParameters());         }     } }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u041a\u043b\u0430\u0441\u0441 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0432\u043d\u0435\u0448\u043d\u0435\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435. \u041f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u0442\u0435\u0441\u0442\u043e\u0432 \u0443\u0434\u0430\u043b\u044f\u0435\u0442 \u0432\u0441\u0435 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u043d\u0443\u0436\u043d\u044b\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u0443 \u0438 \u0434\u043e\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u043a\u0430 \u043e\u043d\u0438 \u043f\u043e\u0434\u043d\u0438\u043c\u0443\u0442\u0441\u044f. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e 3 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430:<\/p>\n<ul>\n<li>\n<p>PostgresContainer \u0434\u043b\u044f \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u0430<\/p>\n<\/li>\n<li>\n<p>RabbitmqContainer \u0434\u043b\u044f \u0448\u0438\u043d\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u0432 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0441\u0435\u0440\u0432\u0438\u0441<\/p>\n<\/li>\n<li>\n<p>MountebankContainer \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f http \u043c\u043e\u043a\u043e\u0432 &#8212; \u043d\u0430\u043c \u043e\u043d \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u043c\u043e\u043a\u0430\u0442\u044c keyCloak<\/p>\n<\/li>\n<\/ul>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0437\u0434\u0435\u0441\u044c \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0441\u0435\u0440\u0432\u0435\u0440 \u0441 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c.<\/p>\n<details class=\"spoiler\">\n<summary>BaseContainer<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cs\">\/\/\/ &lt;summary> \/\/\/  \u0411\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 Docker Api \/\/\/ &lt;\/summary> public abstract class BaseContainer {     protected readonly DockerClient DockerClient;     protected string? ContainerId;              protected readonly string Image;     protected readonly string Tag;      protected string ImageFull => $\"{Image}:{Tag}\";              protected BaseContainer(string image, string tag, DockerClient dockerClient)     {         Image = image;         Tag = tag;         DockerClient = dockerClient;     }      \/\/\/ &lt;summary>     \/\/\/ \u0421\u043a\u0430\u0447\u0430\u0442\u044c \u043e\u0431\u0440\u0430\u0437     \/\/\/ &lt;\/summary>     \/\/\/ &lt;param name=\"image\">Image&lt;\/param>     \/\/\/ &lt;param name=\"tag\">tag&lt;\/param>     protected async Task PullImage(string image,string tag)     {         await DockerClient.Images             .CreateImageAsync(new ImagesCreateParameters                 {                     FromImage = image,                     Tag = tag                 },                 new AuthConfig(),                 new Progress&lt;JSONMessage>());     }      \/\/\/ &lt;summary>     \/\/\/ \u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440     \/\/\/ &lt;\/summary>     public abstract Task StartContainer();              \/\/\/ &lt;summary>     \/\/\/ \u041e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u0433\u043e\u0442\u043e\u0432\u043d\u043e\u0441\u0442\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430     \/\/\/ &lt;\/summary>     protected abstract Task WaitContainer(); }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0411\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439. \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u043e\u0431 \u043e\u0431\u0440\u0430\u0437\u0435 \u0438 \u0434\u0435\u043a\u043b\u0430\u0440\u0438\u0440\u0443\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430.<\/p>\n<details class=\"spoiler\">\n<summary>Common<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cs\">\/\/\/ &lt;summary> \/\/\/ \u041a\u043b\u0430\u0441\u0441 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0434\u0430\u043d\u043d\u044b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u043c\u0435\u0436\u0434\u0443 \u0448\u0430\u0433\u0430\u043c\u0438 \u0432 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438 \/\/\/ &lt;\/summary> public static class Common {     \/\/\/ &lt;summary>     \/\/\/ http \u043e\u0442\u0432\u0435\u0442     \/\/\/ &lt;\/summary>     public static HttpResponseMessage? HttpResponseMessage { get; set; }      \/\/\/ &lt;summary>     \/\/\/ \u0421\u043e\u0437\u0434\u0430\u043d\u043d\u0430\u044f \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f     \/\/\/ &lt;\/summary>     public static CategoryDto? Category { get; set; }          \/\/\/ &lt;summary>     \/\/\/ \u0421\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u0432\u043e\u043f\u0440\u043e\u0441     \/\/\/ &lt;\/summary>     public static QuestionDto? Question { get; set; }          \/\/\/ &lt;summary>     \/\/\/ \u0422\u043e\u043a\u0435\u043d \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438     \/\/\/ &lt;\/summary>     public static string? AuthToken { get; set; }         \/\/\/ &lt;summary>     \/\/\/ \u041f\u043e\u0447\u0438\u0441\u0442\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u0442\u0435\u0441\u0442\u043a\u0435\u0439\u0441\u0430\u043c\u0438     \/\/\/ &lt;\/summary>     public static void ClearState()     {         HttpResponseMessage = null;         Category = null;         Question = null;         AuthToken = null;     } }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u041a\u043b\u0430\u0441\u0441 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0434\u0430\u043d\u043d\u044b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u043c\u0435\u0436\u0434\u0443 \u0448\u0430\u0433\u0430\u043c\u0438 \u0432 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u0438\u0445 \u043e\u0447\u0438\u0441\u0442\u043a\u0438 &#8212; \u0447\u0442\u043e\u0431\u044b \u043e\u0434\u0438\u043d \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439 \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u043c\u043e\u0433 \u0432\u043b\u0438\u044f\u0442\u044c \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u0439.<\/p>\n<h2>\u0427\u0430\u0441\u0442\u044c 3. \u0411\u0430\u0437\u043e\u0432\u044b\u0439 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439<\/h2>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u043d\u0430\u0448 \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439. <\/p>\n<pre><code class=\"swift\">  Scenario: \u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440 \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0442\u044c\/\u043e\u0442\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c\/\u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439\/\u0443\u0434\u0430\u043b\u0438\u0442\u044c \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438     When \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044e \u0441 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c \"SomeCategoryName\"     Then \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0430     And \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \"SomeCategoryName\"     When \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u043d\u0430 \"SomeCategoryNameUpdated\"     Then \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0430     And \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \"SomeCategoryNameUpdated\"     When \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440 \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0441\u0435\u0445 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439     Then \u0441\u043f\u0438\u0441\u043e\u043a \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439 \u043f\u043e\u043b\u0443\u0447\u0435\u043d c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 1         When \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440 \u0443\u0434\u0430\u043b\u044f\u0435\u0442 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044e     Then \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0430     When \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440 \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0441\u0435\u0445 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439     Then \u0441\u043f\u0438\u0441\u043e\u043a \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439 \u043f\u043e\u043b\u0443\u0447\u0435\u043d c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 0<\/code><\/pre>\n<p>\u0421\u0430\u043c\u0438 \u0448\u0430\u0433\u0438 \u043e\u043f\u0438\u0448\u0435\u043c \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0444\u0430\u0439\u043b\u0430\u0445<\/p>\n<details class=\"spoiler\">\n<summary>When<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cs\">[Binding] public class WhenCategoryStepDefinitions {     [When(@\"\u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044e \u0441 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c \"\"(.*)\"\"\")]     public async Task ClientCreateCategoryWithName(string name)     {         \/\/ \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u043e\u0431\u044a\u0435\u043a\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0439 DTO \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438         var category = new CategoryDto         (             Guid.NewGuid(),             name         );          \/\/ \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0432 json \u044d\u0442\u043e\u0442 \u043e\u0431\u044a\u0435\u043a\u0442         var body = JsonSerializer.Serialize(category);                      \/\/ \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u043e\u0431\u044a\u0435\u043a\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0439 http \u0437\u0430\u043f\u0440\u043e\u0441         var request = new HttpRequestMessage(HttpMethod.Post, \"\/api\/v1\/categories\")         {             \/\/ \u0437\u0430\u0434\u0430\u0451\u043c \u043a\u043e\u043d\u0442\u0435\u043d\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u0430             Content = new StringContent(body, Encoding.UTF8, \"application\/json\"),         };                     \/\/ \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0445\u044d\u0434\u0435\u0440 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438         request.Headers.Authorization = AuthenticationHeaderValue.Parse(\"Bearer \" + Common.AuthToken);                  \/\/ \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440 \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0435\u0433\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442         Common.HttpResponseMessage = await ExtEnvironment.TestServer.CreateClient().SendAsync(request);     }              [When(@\"\u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u043d\u0430 \"\"(.*)\"\"\")]     public async Task ClientUpdateCategoryNameTo(string name)     {         \/\/ \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u043e\u0431\u044a\u0435\u043a\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0439 DTO \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438         var category = new CategoryDto         (             Guid.NewGuid(),             name         );          \/\/ \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0432 json \u044d\u0442\u043e\u0442 \u043e\u0431\u044a\u0435\u043a\u0442         var body = JsonSerializer.Serialize(category);                      \/\/ \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u043e\u0431\u044a\u0435\u043a\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0439 http \u0437\u0430\u043f\u0440\u043e\u0441         var request = new HttpRequestMessage(HttpMethod.Put, $\"\/api\/v1\/categories\/{Common.Category!.Id}\")         {             \/\/ \u0437\u0430\u0434\u0430\u0451\u043c \u043a\u043e\u043d\u0442\u0435\u043d\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u0430             Content = new StringContent(body, Encoding.UTF8, \"application\/json\")         };                      \/\/ \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0445\u044d\u0434\u0435\u0440 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438         request.Headers.Authorization = AuthenticationHeaderValue.Parse(\"Bearer \" + Common.AuthToken);                  \/\/ \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440 \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0435\u0433\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442         Common.HttpResponseMessage = await ExtEnvironment.TestServer.CreateClient().SendAsync(request);     }              [When(\"\u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440 \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0441\u0435\u0445 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439\")]     public async Task ClientRequestAllCategories()     {         \/\/ \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u043e\u0431\u044a\u0435\u043a\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0439 http \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u043a\u0430\u0442\u0435\u0433\u0440\u0438\u0439         var request = new HttpRequestMessage(HttpMethod.Get, $\"\/api\/v1\/categories\");                  \/\/ \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0445\u044d\u0434\u0435\u0440 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438         request.Headers.Authorization = AuthenticationHeaderValue.Parse(\"Bearer \" + Common.AuthToken);                  \/\/ \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440 \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0435\u0433\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442         Common.HttpResponseMessage = await ExtEnvironment.TestServer.CreateClient().SendAsync(request);     }              [When(@\"\u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440 \u0443\u0434\u0430\u043b\u044f\u0435\u0442 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044e\")]     public async Task ClientDeleteCategory()     {         \/\/ \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u043e\u0431\u044a\u0435\u043a\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0439 http \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u043f\u043e id         var request = new HttpRequestMessage(HttpMethod.Delete, $\"\/api\/v1\/categories\/{Common.Category!.Id}\");                  \/\/ \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0445\u044d\u0434\u0435\u0440 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438         request.Headers.Authorization = AuthenticationHeaderValue.Parse(\"Bearer \" + Common.AuthToken);                  \/\/ \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440 \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0435\u0433\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442         Common.HttpResponseMessage = await ExtEnvironment.TestServer.CreateClient().SendAsync(request);     } }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>Then<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cs\">[Binding] public class ThenCategoryStepDefinitions {     [Then(@\"\u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0430\")]     public void CategorySuccessfullyCreated()     {         \/\/ \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c, \u0447\u0442\u043e \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0435 \u043f\u0443\u0441\u0442\u043e\u0439         Common.HttpResponseMessage.Should().NotBeNull();                  \/\/ \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c, \u0447\u0442\u043e \u043a\u043e\u0434 \u043e\u0442\u0432\u0435\u0442\u0430 200         Common.HttpResponseMessage!.StatusCode.Should().Be(HttpStatusCode.OK);                      \/\/ \u0434\u0435\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u0443\u044e \u0432 \u043e\u0442\u0432\u0435\u0442\u0435 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044e         Common.Category = Common.HttpResponseMessage.Content.ReadAs&lt;CategoryDto>();     }              [Then(@\"\u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \"\"(.*)\"\"\")]     public void CategoryNameShouldBe(string name)     {         \/\/ \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c {name}         Common.Category!.Name.Should().Be(name);     }              [Then(@\"\u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0430\")]     public void CategorySuccessfullyUpdated()     {         \/\/ \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c, \u0447\u0442\u043e \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0435 \u043f\u0443\u0441\u0442\u043e\u0439         Common.HttpResponseMessage.Should().NotBeNull();                          \/\/ \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c, \u0447\u0442\u043e \u043a\u043e\u0434 \u043e\u0442\u0432\u0435\u0442\u0430 200         Common.HttpResponseMessage!.StatusCode.Should().Be(HttpStatusCode.OK);                      \/\/ \u0434\u0435\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u0443\u044e \u0432 \u043e\u0442\u0432\u0435\u0442\u0435 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044e         Common.Category = Common.HttpResponseMessage.Content.ReadAs&lt;CategoryDto>();     }                      [Then(@\"\u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0430\")]     public void CategorySuccessfullyDeleted()     {         \/\/ \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c, \u0447\u0442\u043e \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0435 \u043f\u0443\u0441\u0442\u043e\u0439         Common.HttpResponseMessage.Should().NotBeNull();                  \/\/ \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c, \u0447\u0442\u043e \u043a\u043e\u0434 \u043e\u0442\u0432\u0435\u0442\u0430 200         Common.HttpResponseMessage!.StatusCode.Should().Be(HttpStatusCode.OK);     }              [Then(@\"\u0441\u043f\u0438\u0441\u043e\u043a \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439 \u043f\u043e\u043b\u0443\u0447\u0435\u043d c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 (.*)\")]     public void ClientGotCategoryListWithCount(int count)     {         \/\/ \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c, \u0447\u0442\u043e \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0435 \u043f\u0443\u0441\u0442\u043e\u0439         Common.HttpResponseMessage.Should().NotBeNull();                  \/\/ \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c, \u0447\u0442\u043e \u043a\u043e\u0434 \u043e\u0442\u0432\u0435\u0442\u0430 200         Common.HttpResponseMessage!.StatusCode.Should().Be(HttpStatusCode.OK);                      \/\/ \u0434\u0435\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439         var result = Common.HttpResponseMessage.Content.ReadAs&lt;List&lt;CategoryDto>>();                     \/\/ \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439 \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c {count}         result!.Count.Should().Be(count);     } }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u042f \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043f\u0440\u043e\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043b \u0448\u0430\u0433\u0438 \u0438 \u043d\u0435 \u0434\u0443\u043c\u0430\u044e, \u0447\u0442\u043e \u0442\u0443\u0442 \u0435\u0441\u0442\u044c \u0447\u0442\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c. \u041d\u043e \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0442\u043e\u0442 \u0444\u0430\u043a\u0442, \u0447\u0442\u043e \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043d\u0430\u0448\u0438 \u0442\u0435\u0441\u0442\u044b \u0436\u0438\u0432\u0443\u0442 \u0432 \u0442\u043e\u043c \u0436\u0435 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u043d\u0430 \u0442\u043e\u043c \u0436\u0435 \u044f\u0437\u044b\u043a\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c DTO \u043c\u043e\u0434\u0435\u043b\u0438 \u0438\u0437 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0441\u0435\u0440\u0432\u0438\u0441\u0430. \u042d\u0442\u043e \u0443\u0434\u043e\u0431\u043d\u0435\u0435, \u0447\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 json \u043a\u0430\u043a \u0442\u0435\u043a\u0441\u0442\u043e\u043c \u0438\u043b\u0438 \u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u043c\u043e\u0434\u0435\u043b\u044c\u043a\u0438 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u043e\u0432.<\/p>\n<p>\u041d\u0430\u0448 \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439 \u0433\u043e\u0442\u043e\u0432. \u0423\u0440\u0430! <\/p>\n<h2>\u0427\u0430\u0441\u0442\u044c 4. \u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f<\/h2>\n<p>\u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u0435\u0440\u0432\u0438\u0441\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u0430 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f. \u0427\u0442\u043e\u0431\u044b \u0437\u0430\u043f\u0440\u043e\u0441 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u043b, \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0441 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u043d\u0435\u0433\u043e \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0439 JWT \u0442\u043e\u043a\u0435\u043d, \u0441 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u0442\u044c \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443, \u0447\u0442\u043e\u0431\u044b \u0441\u0435\u0440\u0432\u0438\u0441 \u043c\u043e\u0433 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0432\u0430\u043b\u0438\u0434\u043d\u043e\u0441\u0442\u044c \u044d\u0442\u043e\u0433\u043e \u0442\u043e\u043a\u0435\u043d\u0430.<\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0432\u0441\u043f\u043e\u043c\u043d\u0438\u043c \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 JWT \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/6e3\/1d5\/d6b\/6e31d5d6b52338b90d89a1cc1dbffbdb.jpeg\" alt=\"JWT flow\" title=\"JWT flow\" width=\"978\" height=\"1280\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/6e3\/1d5\/d6b\/6e31d5d6b52338b90d89a1cc1dbffbdb.jpeg\" data-blurred=\"true\"\/><\/p>\n<div><figcaption>JWT flow<\/figcaption><\/div>\n<\/figure>\n<p>KeyCloak \u043d\u0435 \u0442\u0430\u043a \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u0434\u043d\u044f\u0442\u044c \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c. \u041c\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c &#8212; \u0432\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u0435\u0433\u043e \u0437\u0430\u043c\u043e\u043a\u0430\u0435\u043c. \u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e \u0438\u0437 \u0441\u0445\u0435\u043c\u044b, \u043d\u0430\u0448\u0430 \u0437\u0430\u0433\u043b\u0443\u0448\u043a\u0430 keyCloak \u0434\u043e\u043b\u0436\u043d\u0430 \u0443\u043c\u0435\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c 3 \u0437\u0430\u043f\u0440\u043e\u0441\u0430:<\/p>\n<ol>\n<li>\n<p>\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0442\u043e\u043a\u0435\u043d\u0430.<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0442\u043e\u043a\u0435\u043d\u0430.<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0442\u043e\u043a\u0435\u043d\u0430.<\/p>\n<\/li>\n<\/ol>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0448\u0430\u0433 \u0441 \u0442\u0438\u043f\u043e\u043c Given &#8212; \u043a\u0430\u043a \u043c\u044b \u043f\u043e\u043c\u043d\u0438\u043c, \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a\u0438\u0435 \u0448\u0430\u0433\u0438 \u043d\u0443\u0436\u043d\u044b \u0434\u043b\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f. \u0412 \u043d\u0451\u043c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Mountebank \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u043d\u0443\u0436\u043d\u044b\u0439 \u043d\u0430\u043c \u0438\u043c\u043f\u043e\u0441\u0442\u0435\u0440.<\/p>\n<details class=\"spoiler\">\n<summary>[Given(&#171;\u043a\u0435\u0439\u043a\u043b\u043e\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d&#187;)]<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cs\">[Binding] public class GivenCommonStepDefinitions {     [Given(\"\u043a\u0435\u0439\u043a\u043b\u043e\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\")]     public async Task KeyCloakIsWorking()     {         \/\/ \u0443\u0434\u0430\u043b\u0438\u043c \u0438\u043c\u043f\u043e\u0441\u0442\u0435\u0440, \u0435\u0441\u043b\u0438 \u043e\u043d \u0443\u0436\u0435 \u0435\u0441\u0442\u044c         await ExtEnvironment.MountebankClient.DeleteImposterAsync(4501);                  \/\/ \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u043c \u0438\u043c\u043f\u043e\u0441\u0442\u0435\u0440 \u043a\u0435\u0439\u043a\u043b\u043e\u0430\u043a\u0430         await ExtEnvironment.MountebankClient.CreateHttpImposterAsync(new HttpImposter(4501, \"keyCloak\",             new HttpImposterOptions()             {                 \/\/ \u0440\u0430\u0437\u0440\u0435\u0448\u0438\u043c cors, \u0447\u0442\u043e\u0431\u044b \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0443\u0434\u043e\u0431\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0442\u043e\u043a\u0435\u043d \u0438\u0437 UI \u0441\u0432\u0430\u0433\u0433\u0435\u0440\u0430                 AllowCORS = true             }));          \/\/ \u043c\u043e\u043a\u0430\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0442\u043e\u043a\u0435\u043d\u0430         await ExtEnvironment.MountebankClient.AddHttpImposterStubAsync(4501,             new HttpStub()                 .OnPathAndMethodEqual($\"\/auth\/realms\/myrealm\/.well-known\/openid-configuration\", Method.Get)                 .ReturnsJson(HttpStatusCode.OK, KeyCloakResponseGenerator.GetOpenidConfiguration(\"myrealm\")), 0);          \/\/ \u043c\u043e\u043a\u0430\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0442\u043e\u043a\u0435\u043d\u0430         await ExtEnvironment.MountebankClient.AddHttpImposterStubAsync(4501,             new HttpStub()                 .OnPathAndMethodEqual($\"\/auth\/realms\/myrealm\/protocol\/openid-connect\/certs\", Method.Get)                 .ReturnsJson(HttpStatusCode.OK, KeyCloakResponseGenerator.GetCertificates()), 1);                  \/\/ \u043c\u043e\u043a\u0430\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0442\u043e\u043a\u0435\u043d\u0430          await ExtEnvironment.MountebankClient.AddHttpImposterStubAsync(4501,             new HttpStub()                 .OnPathAndMethodEqual($\"\/auth\/realms\/myrealm\/protocol\/openid-connect\/token\", Method.Post)                 .ReturnsJson(HttpStatusCode.OK, KeyCloakResponseGenerator.GetToken(\"myrealm\", new Dictionary&lt;string, string>())));     } }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0422\u0430\u043a\u0436\u0435 \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u0448\u0430\u0433, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043a\u043b\u0438\u0435\u043d\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442 \u0442\u043e\u043a\u0435\u043d \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442 \u0435\u0433\u043e \u0434\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0438\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432.<\/p>\n<details class=\"spoiler\">\n<summary>[When(&#171;\u043a\u043b\u0438\u0435\u043d\u0442 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f&#187;)]<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cs\">[Binding] public class WhenCommonStepDefinitions {     [When(\"\u043a\u043b\u0438\u0435\u043d\u0442 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\")]     public async Task ClientIsAdmin()     {         \/\/ \u0441\u043e\u0437\u0434\u0430\u0451\u043c http \u043a\u043b\u0438\u0435\u043d\u0442 \u0434\u043b\u044f \u043e\u0442\u043f\u0430\u0432\u043a\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043d\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0442\u043e\u043a\u0435\u043d\u0430         using var httpClient = new HttpClient();                  \/\/ \u0437\u0430\u0434\u0430\u0451\u043c \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u0430\u0434\u0440\u0435\u0441 \u043a\u0435\u0439\u043a\u043b\u043e\u0430\u043a\u0430         httpClient.BaseAddress = new Uri($\"http:\/\/localhost:4501\");                  \/\/ \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0442\u043e\u043a\u0435\u043d\u0430         var request = new HttpRequestMessage(HttpMethod.Post, $\"\/auth\/realms\/myrealm\/protocol\/openid-connect\/token\");                  \/\/ \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441         var response = await httpClient.SendAsync(request);                  \/\/ \u0434\u0435\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442 \u0438 \u043f\u0440\u0438\u0445\u0440\u0430\u043d\u0438\u0432\u0430\u0435\u043c AccessToken \u0434\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u0445 \u043a \u0441\u0435\u0440\u0432\u0438\u0441\u0443         Common.AuthToken = response.Content.ReadAs&lt;Token>()!.AccessToken;     } }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0431\u043b\u043e\u043a Background, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u043f\u0435\u0440\u0435\u0434 \u043a\u0430\u0436\u0434\u044b\u043c \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0435\u043c.<\/p>\n<pre><code class=\"swift\">#noinspection SpellCheckingInspection,CucumberUndefinedStep,NonAsciiCharacters Feature: Category   Background:     Given \u043a\u0435\u0439\u043a\u043b\u043e\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d     When \u043a\u043b\u0438\u0435\u043d\u0442 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f      Scenario: \u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440 \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0442\u044c\/\u043e\u0442\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c\/\u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439\/\u0443\u0434\u0430\u043b\u0438\u0442\u044c \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438     When \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044e \u0441 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c \"SomeCategoryName\"     Then \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0430     And \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \"SomeCategoryName\"     When \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u043d\u0430 \"SomeCategoryNameUpdated\"     Then \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0430     And \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \"SomeCategoryNameUpdated\"     When \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440 \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0441\u0435\u0445 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439     Then \u0441\u043f\u0438\u0441\u043e\u043a \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439 \u043f\u043e\u043b\u0443\u0447\u0435\u043d c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 1         When \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440 \u0443\u0434\u0430\u043b\u044f\u0435\u0442 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044e     Then \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0430     When \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440 \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0441\u0435\u0445 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439     Then \u0441\u043f\u0438\u0441\u043e\u043a \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439 \u043f\u043e\u043b\u0443\u0447\u0435\u043d c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 0<\/code><\/pre>\n<p>\u0412\u043e\u0442 \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0448 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0433\u043e\u0442\u043e\u0432!<\/p>\n<p>Mountebank \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u044b &#8212; grpc, websockets \u0438 \u0442.\u0434. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u044d\u0442\u043e\u0442 \u043f\u043e\u0434\u0445\u043e\u0434 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0437\u0430\u043c\u043e\u043a\u0430\u0442\u044c \u043b\u044e\u0431\u043e\u0435 \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0435 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 &#8212; \u0433\u043b\u0430\u0432\u043d\u043e\u0435, \u0447\u0442\u043e\u0431\u044b \u043c\u044b \u043c\u043e\u0433\u043b\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0443\u0436\u043d\u0443\u044e \u043b\u043e\u0433\u0438\u043a\u0443 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043e\u0442\u0432\u0435\u0442\u043e\u0432.<\/p>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e \u0438\u0437 \u043a\u043e\u0434\u0430 \u0448\u0430\u0433\u0430 Given &#8212; \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043b\u043e\u0433\u0438\u043a\u0430 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u043e\u0442\u0432\u0435\u0442\u043e\u0432 keyCloak \u0438\u043d\u043a\u0430\u043f\u0441\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u0432 \u043a\u043b\u0430\u0441\u0441 KeyCloakResponseGenerator.<\/p>\n<details class=\"spoiler\">\n<summary>KeyCloakResponseGenerator<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cs\">\/\/\/ &lt;summary> \/\/\/ \u0413\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u043e\u0442\u0432\u0435\u0442\u043e\u0432 \u043e\u0442 KeyCloak \/\/\/ &lt;\/summary> internal static class KeyCloakResponseGenerator {     \/\/\/ &lt;summary>     \/\/\/ \u042d\u043c\u0443\u043b\u0438\u0440\u0443\u0435\u043c \u043e\u0442\u0432\u0435\u0442 \u043e\u0442 \u043a\u0435\u0439\u043a\u043b\u043e\u0430\u043a \u043d\u0430 \u0437\u0430\u043f\u0440\u043e\u0441 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438     \/\/\/ &lt;\/summary>     public static OpenidConfiguration GetOpenidConfiguration(string realm)     {         return new OpenidConfiguration         {             Issuer = $\"http:\/\/localhost:4501\/auth\/realms\/{realm}\",             AuthorizationEndpoint = $\"http:\/\/localhost:4501\/auth\/realms\/{realm}\/protocol\/openid-connect\/auth\",             TokenEndpoint = $\"http:\/\/localhost:4501\/auth\/realms\/{realm}\/protocol\/openid-connect\/token\",             UserinfoEndpoint = $\"http:\/\/localhost:4501\/auth\/realms\/{realm}\/protocol\/openid-connect\/userinfo\",             JwksUri = $\"http:\/\/localhost:4501\/auth\/realms\/{realm}\/protocol\/openid-connect\/certs\",             CheckSessionIframe = $\"http:\/\/localhost:4501\/auth\/realms\/{realm}\/protocol\/openid-connect\/login-status-iframe.html\",             GrantTypesSupported = new List&lt;string>             {                 \"authorization_code\",                 \"implicit\",                 \"refresh_token\",                 \"password\",                 \"client_credentials\"             },             ResponseTypesSupported = new List&lt;string>             {                 \"code\",                 \"none\",                 \"id_token\",                 \"token\",                 \"id_token token\",                 \"code id_token\",                 \"code token\",                 \"code id_token token\"             },             SubjectTypesSupported = new List&lt;string>             {                 \"public\",                 \"pairwise\"             },             IdTokenSigningAlgValuesSupported = new List&lt;string>             {                 \"RS256\"             },             IdTokenEncryptionAlgValuesSupported = new List&lt;string>             {                 \"RSA-OAEP\",                 \"RSA1_5\"             },             IdTokenEncryptionEncValuesSupported = new List&lt;string>             {                 \"A128GCM\",                 \"A128CBC-HS256\"             },             UserinfoSigningAlgValuesSupported = new List&lt;string>             {                 \"RS256\"             },             RequestObjectSigningAlgValuesSupported = new List&lt;string>             {                 \"RS256\"             },             ResponseModesSupported = new List&lt;string>             {                 \"query\",                 \"fragment\",                 \"form_post\"             },             RegistrationEndpoint =                 $\"http:\/\/localhost:4501\/auth\/realms\/{realm}\/clients-registrations\/openid-connect\",             TokenEndpointAuthMethodsSupported = new List&lt;string>             {                 \"private_key_jwt\",                 \"client_secret_basic\",                 \"client_secret_post\",                 \"tls_client_auth\",                 \"client_secret_jwt\"             },             TokenEndpointAuthSigningAlgValuesSupported = new List&lt;string>             {                 \"RS256\"             },             ClaimsSupported = new List&lt;string>             {                 \"aud\",                 \"sub\",                 \"iss\",                 \"auth_time\",                 \"name\",                 \"given_name\",                 \"family_name\",                 \"preferred_username\",                 \"clientId\",                 \"email\",                 \"acr\"             },             ClaimTypesSupported = new List&lt;string>             {                 \"normal\"             },             ClaimsParameterSupported = false,             ScopesSupported = new List&lt;string>             {                 \"openid\",                 \"profile\",                 \"email\",                 \"address\",                 \"phone\",                 \"offline_access\",                 \"roles\",                 \"web-origins\",                 \"microprofile-jwt\",                 \"aud-fins\",                 \"aud-my-app\"             },             RequestParameterSupported = true,             RequestUriParameterSupported = true,             CodeChallengeMethodsSupported = new List&lt;string>             {                 \"plain\",                 \"S256\"             },             TlsClientCertificateBoundAccessTokens = true,             IntrospectionEndpoint = $\"http:\/\/localhost:4501\/auth\/realms\/{realm}\/protocol\/openid-connect\/token\/introspect\"          };     }      \/\/\/ &lt;summary>     \/\/\/ \u042d\u043c\u0443\u043b\u0438\u0440\u0443\u0435\u043c \u043e\u0442\u0432\u0435\u0442 \u043e\u0442 \u043a\u0435\u0439\u043a\u043b\u043e\u0430\u043a\u0430 \u043d\u0430 \u0437\u0430\u043f\u0440\u043e\u0441 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0442\u043e\u043a\u0435\u043d\u0430     \/\/\/ &lt;\/summary>     public static Certificates GetCertificates()     {         return new Certificates()         {             Keys = new List&lt;Key>()             {                 new()                 {                     Kid = \"0-CDYkLdNn_158pWcWIH3H_sO5m-eu2uBXH0KZE1pZM\",                     Kty = \"RSA\",                     Alg = \"RS256\",                     Use = \"sig\",                     N = \"jWrUiboTNuiejJM9jY0K_oCiuhoiZje18VQH7KlPWnihA7S8SvpVclr5nxuT75Rg2iBpR6RmfDfubkuMDOXlT86PRcgMAkDAFfoZ8OGlhKGLGgVSf-Tduv8fJ7lN28OgEzEFgE8G-B84FwOeoUV7VxMk39MxAsN6ajXM-IU-gLohj4c5UKrWHjor3tdqrYSjIZmK7-tcCR-_0U9GXPu-mHYKEi9B5WmyO-EoQ31OUjghFwCXJYMsvSiLIoDbX_P9I6NUkZkJRPYcL96ixLpRHKC5hGL61tEOFBlvFu1mDvkX6swU5EfD1sxlME7Ytnzw98S0yPzYcaYXI_WGWb2QsQ\",                     E = \"AQAB\",                     X5C = new[]                     {                         \"MIICmzCCAYMCBgFhUT+\/kjANBgkqhkiG9w0BAQsFADARMQ8wDQYDVQQDDAZCcm9rZXIwHhcNMTgwMjAxMTIwMTI3WhcNMjgwMjAxMTIwMzA3WjARMQ8wDQYDVQQDDAZCcm9rZXIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCNatSJuhM26J6Mkz2NjQr+gKK6GiJmN7XxVAfsqU9aeKEDtLxK+lVyWvmfG5PvlGDaIGlHpGZ8N+5uS4wM5eVPzo9FyAwCQMAV+hnw4aWEoYsaBVJ\/5N26\/x8nuU3bw6ATMQWATwb4HzgXA56hRXtXEyTf0zECw3pqNcz4hT6AuiGPhzlQqtYeOive12qthKMhmYrv61wJH7\/RT0Zc+76YdgoSL0HlabI74ShDfU5SOCEXAJclgyy9KIsigNtf8\/0jo1SRmQlE9hwv3qLEulEcoLmEYvrW0Q4UGW8W7WYO+RfqzBTkR8PWzGUwTti2fPD3xLTI\/Nhxphcj9YZZvZCxAgMBAAEwDQYJKoZIhvcNAQELBQADggEBAEP7uuF7qtcxgyUPH1NlvsWIaOvDCmK2\/xjnnr2UKzhiwXPvr+7QVNmH+oM+AeNUgXEy4B7C1mHQ4dYJd\/QD7XGYE4nEadEnr\/heo3Zj9RPX+ldq9ttFutUVTTW\/7bESkaxEmoK018LZDlnTkiA8Q6ZPN1K\/eqUJVfZ60aoNUnDG6UPFROWtmG8uB9fnos1SUBnroy+cEjtSTEnear1DpDk9DXwBeeCU91YYLzjOO\/RmBLxgG2WuLkL4bWSLz\/RDTRyVeCDpi7SoTzrg\/NxoKtGvBUyxTAdyI6TBRo56I4O8lzD7pOUDjSN+khfM18JW9kUO6lsfecg5EJznf5GONG4=\"                     },                     X5T = \"n5fx46hNQ83PWi9k8gp3ULhVU9c\",                     Hash = \"Gk6c2paGOti48FHFNfG2VkhDhePaQ7gaAXQazyJ1ZFs\"                 }             }         };     }              \/\/\/ &lt;summary>     \/\/\/ \u042d\u043c\u0443\u043b\u0438\u0440\u0443\u0435\u043c \u043e\u0442\u0432\u0435\u0442 \u043e\u0442 \u043a\u0435\u0439\u043a\u043b\u043e\u0430\u043a\u0430 \u043d\u0430 \u0437\u0430\u043f\u0440\u043e\u0441 \u0442\u043e\u043a\u0435\u043d\u0430     \/\/\/ &lt;\/summary>     public static Token GetToken(string realm, Dictionary&lt;string, string> claims)     {         return new Token         {             AccessToken =  new JwtTokenBuilder().WithIssuer(realm).WithDefaultClaims().WithClaims(claims).CreateToken(),             ExpiresIn = 100000,             NotBeforePolicy = 1518534968,             SessionState = Guid.NewGuid(),             Scope = \"email profile\",             RefreshToken =  new JwtTokenBuilder().WithIssuer(realm).CreateToken(),             RefreshExpiresIn = 18000000,             TokenType =  \"Bearer\"         };     } }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u041c\u0435\u0442\u043e\u0434\u044b GetOpenidConfiguration \u0438 GetCertificates \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u00a0 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043a\u043e\u043d\u0442\u0435\u043d\u0442. \u041e\u043d\u0438 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b\u0438\u0441\u044c \u043f\u0440\u043e\u0441\u0442\u043e &#8212; \u044f \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u0438\u043b \u043e\u0442\u0432\u0435\u0442\u044b \u0438\u0437 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e KeyCloak \u0438 \u043f\u043e \u043d\u0438\u043c \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u043b \u043c\u043e\u0434\u0435\u043b\u044c\u043a\u0438. \u041e\u0431\u044b\u0447\u043d\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u044b-\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043d\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0439 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043e\u0442\u0432\u0435\u0442 &#8212; \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0432 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0437\u0430\u0433\u043b\u0443\u0448\u0435\u043a \u043d\u0430 \u0442\u0430\u043a\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043d\u0435 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442.<\/p>\n<p>\u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u0441\u0435 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u0435\u0435. \u041d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0447\u0442\u043e\u0431\u044b \u043c\u044b \u043c\u043e\u0433\u043b\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u043a\u043b\u0435\u0439\u043c\u044b \u0432 \u0442\u043e\u043a\u0435\u043d \u0438 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u0442\u044c \u0435\u0433\u043e. \u041a \u0442\u043e\u043c\u0443 \u0436\u0435 \u0435\u0441\u043b\u0438 \u0431\u044b \u043c\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u0438\u043b\u0438 \u0442\u043e\u043a\u0435\u043d \u0441 \u0442\u0435\u0441\u0442\u0430 \u0438 \u0437\u0430\u0445\u0430\u0440\u0434\u043a\u043e\u0434\u0438\u043b\u0438 \u0435\u0433\u043e &#8212; \u043e\u043d \u0431\u044b \u0431\u044b\u0441\u0442\u0440\u043e \u043f\u0440\u043e\u0442\u0443\u0445 \u0438 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043b \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0442\u043e\u043a\u0435\u043d \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0440\u0443\u043a\u0430\u043c\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e JwtTokenBuilder<\/p>\n<details class=\"spoiler\">\n<summary>JwtTokenBuilder<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cs\">\/\/\/ &lt;summary> \/\/\/ \u0411\u0438\u043b\u0434\u0435\u0440 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f jwt \/\/\/ &lt;\/summary> public class JwtTokenBuilder {     \/\/\/ &lt;summary>     \/\/\/ \u0421\u043f\u0438\u0441\u043e\u043a \u043a\u043b\u0435\u0439\u043c\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b \u0432 \u0442\u043e\u043a\u0435\u043d     \/\/\/ &lt;\/summary>     private readonly List&lt;Claim> _claims = new();      \/\/\/ &lt;summary>     \/\/\/ \u041f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0439 rsa \u043a\u043b\u044e\u0447 - \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043f\u043e\u0434\u043f\u0438\u0441\u0438 \u0442\u043e\u043a\u0435\u043d\u0430     \/\/\/ &lt;\/summary>     private static string PrivateKey =>          \"\"\"         -----BEGIN RSA PRIVATE KEY-----         MIIEogIBAAKCAQEAjWrUiboTNuiejJM9jY0K\/oCiuhoiZje18VQH7KlPWnihA7S8SvpVclr5nxuT75Rg2iBpR6RmfDfubkuMDOXlT86PRcgMAkDAFfoZ8OGlhKGLGgVSf+Tduv8fJ7lN28OgEzEFgE8G+B84FwOeoUV7VxMk39MxAsN6ajXM+IU+gLohj4c5UKrWHjor3tdqrYSjIZmK7+tcCR+\/0U9GXPu+mHYKEi9B5WmyO+EoQ31OUjghFwCXJYMsvSiLIoDbX\/P9I6NUkZkJRPYcL96ixLpRHKC5hGL61tEOFBlvFu1mDvkX6swU5EfD1sxlME7Ytnzw98S0yPzYcaYXI\/WGWb2QsQIDAQABAoIBAF6JUwm7FYs4WH07FQPijL3z+lSUkfhpN7zbYuzHhl\/Bkknq8ZDh5msq\/AJsKioXs+M9lYOqGETkEwUyha49pV0Dhe2tPLHo3UAT0HGiNscCQv4jHrKWqc+PKyGgE7ddAE60D6xlqBAItrNT3SCMVVaxWo4yHWpuiRAlZR+h21WrmbKeem4ZfiUUPlzCSrkEOAiz9GMrFt58oFPyg2cnX2B8DcZRMhe3nYCaEdojJFH5S+1sGvYE5aTyqXnQvRlNUV+tup5RIOMe411j4xG6goRDF7w9KuKsk4LgslnCs4Awyxlby8jmLuvNWaXA\/q6VgR3x4kofdeMtmZN4wezcZK0CgYEAw80DgGoX0SRIPc48OEKD\/YdRZ\/Kwq5KYl\/HrC0CxzlPkaD0vzU0WAE+b+\/dDFYMskNtu3la8PwwZJtuJthQqF4eDNIxAALuEz13756Fn3XinX5ZkPLa0j8YJur8z\/HTJe9pDvsLpqHYOWp3\/Ig3Z+thOMuD+giiCVdxXGSlYFH8CgYEAuOVtV5tOtEb8hu5R4+Hp5JIAfd53qepHzFKUwF\/Tp97UOH42sIkxzX2B6UqpVcdx\/yhHxd9g75vw0rHlbeqGWbjDR4nqcTTE1rDCNeDbci5YX+9Dfna8OWd1++KYa3kHi+C3tQPsak8ckMAMgGUHWcoEQJ0FEwUb\/Z92\/OakAs8CgYBUYHrL0exlki8Xg1JsJC3hCXlJREpiBZCAmh3iAYUeFwTs7sE0xa1fgO8FS+66zIZd\/lHuuo3w1XPZTO4xassgzKL7+Bx0tFptSmEN1n598EqgZJzZlRqGgp8avN7YQjO5jbt372Ll18ojvsZ9lF6FPMWmI1NKH87a1VMrYqe0XQKBgA0zXB4gGXtnggoEI9aYP4GxJtXVt0drUZr13mbpsIvQregmorLx6JtaNZc5XGOibLIh5xXqf9o7kPMJ\/m5diyAGv\/Jwl0tj0BXf4s3D8wbw5iBbTb9OrNuQVm0YXXd22aIT9im3UP66DTkMbRgRnne7o5gVXdJg0AHIi888jEMjAoGAStEkWhJONuHawMFSqJM+dcMVDSyx6wRDjleeZTzMqXBbDH0I1AT6v+zMsCeAsirA8LTa0kfvMT+E6HqRO9daaH\/hhw1Qtxwdgh6EGus3oMz4Yk9Kvl\/yIQWLtonEWMO76ZCFe4x40ZCodLp\/CZuvH+ybhDRYHv60L63tP6XYf+M=         -----END RSA PRIVATE KEY-----         \"\"\";          \/\/\/ &lt;summary>     \/\/\/ \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0442\u043e\u043a\u0435\u043d     \/\/\/ &lt;\/summary>     public string CreateToken()     {          RSAParameters rsaParams;         using (var pk = new StringReader(PrivateKey))         {             var pemReader = new PemReader(pk);             var keyPair = pemReader.ReadObject() as AsymmetricCipherKeyPair;             if (keyPair == null)             {                 throw new EncryptionException(\"Could not read RSA private key\");             }              var privateRsaParams = keyPair.Private as RsaPrivateCrtKeyParameters;             rsaParams = DotNetUtilities.ToRSAParameters(privateRsaParams);         }          using var rsa = new RSACryptoServiceProvider();         rsa.ImportParameters(rsaParams);                      var payload = _claims.ToDictionary(k => k.Type, v => (object)v.Value);         return Jose.JWT.Encode(payload, rsa, Jose.JwsAlgorithm.RS256);     }          \/\/\/ &lt;summary>     \/\/\/ \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u043a\u043b\u0435\u0439\u043c\u044b     \/\/\/ &lt;\/summary>     public JwtTokenBuilder WithDefaultClaims()     {         _claims.Add(new Claim(\"exp\", \"1883314464\"));         _claims.Add(new Claim(\"iat\", \"1883314404\"));         _claims.Add(new Claim(\"jti\", \"1a35839e-bb3e-4010-a9ca-7fd96f73037c\"));         _claims.Add(new Claim(\"aud\", \"account\"));         _claims.Add(new Claim(\"typ\", \"Bearer\"));         _claims.Add(new Claim(\"azp\", \"localhost\"));         _claims.Add(new Claim(\"session_state\", \"657f0fdc-d21e-4d4e-ada4-0eb91acf9d9c\"));         _claims.Add(new Claim(\"acr\", \"1\"));         _claims.Add(new Claim(\"scope\", \"profile email\"));         _claims.Add(new Claim(\"sid\", \"657f0fdc-d21e-4d4e-ada4-0eb91acf9d9c\"));         return this;     }          \/\/\/ &lt;summary>     \/\/\/ \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u043b\u0435\u0439\u043c iss     \/\/\/ &lt;\/summary>     public JwtTokenBuilder WithIssuer(string issuer)     {         _claims.Add(new Claim(\"iss\", $\"http:\/\/localhost:4501\/auth\/realms\/{issuer}\"));         return this;     }          \/\/\/ &lt;summary>     \/\/\/ \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u043b\u0435\u0439\u043c\u044b     \/\/\/ &lt;\/summary>     public JwtTokenBuilder WithClaims(Dictionary&lt;string, string> withClaims)     {         foreach (var claim in withClaims)         {             _claims.Add(new Claim(claim.Key, claim.Value));         }          return this;     } }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u042d\u0442\u043e\u0442 \u043a\u043b\u0430\u0441\u0441 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0442\u043e\u043a\u0435\u043d\u0430 \u0441 \u043d\u0443\u0436\u043d\u044b\u043c\u0438 \u043a\u043b\u0435\u0439\u043c\u0430\u043c\u0438, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0439 \u043a\u043b\u044e\u0447, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0442\u043e\u043a\u0435\u043d. \u041f\u0443\u0431\u043b\u0438\u0447\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043a\u043b\u044e\u0447\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043f\u043e\u0434\u043f\u0438\u0441\u044c, \u043e\u0442\u0434\u0430\u0451\u0442\u0441\u044f \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 GetCertificates.<\/p>\n<p>\u0423\u0445\u0445, \u044d\u0442\u043e \u0431\u044b\u043b\u043e \u0441\u043b\u043e\u0436\u043d\u043e, \u043d\u043e \u043c\u044b \u0441\u043f\u0440\u0430\u0432\u0438\u043b\u0438\u0441\u044c, \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435\u043c\u043d\u043e\u0433\u043e.<\/p>\n<h3>\u0427\u0430\u0441\u0442\u044c 5. \u041f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438<\/h3>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439 \u0434\u043b\u044f \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0432\u043e\u043f\u0440\u043e\u0441 \u043d\u0435\u043b\u044c\u0437\u044f \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0431\u0435\u0437 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438, \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0431\u043b\u043e\u043a Background, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043d\u0443\u0436\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0441\u0435\u0440\u0432\u0438\u0441\u0435 (\u043f\u0440\u043e \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044e \u0442\u043e\u0436\u0435 \u043d\u0435 \u0437\u0430\u0431\u0443\u0434\u0435\u043c).<\/p>\n<pre><code class=\"swift\">#noinspection SpellCheckingInspection,CucumberUndefinedStep,NonAsciiCharacters Feature: Question   Background:     Given \u043a\u0435\u0439\u043a\u043b\u043e\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d     When \u043a\u043b\u0438\u0435\u043d\u0442 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f     When \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044e \u0441 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c \"SomeCategoryName\"     Then \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0430      Scenario: \u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440 \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0442\u044c\/\u043e\u0442\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c\/\u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432\/\u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0432\u043e\u043f\u0440\u043e\u0441     When \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0432\u043e\u043f\u0440\u043e\u0441 \u0441 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c \"SomeQuestionName\" \u0438 \u0442\u0435\u043b\u043e\u043c \"SomeQuestionBody\"     Then \u0432\u043e\u043f\u0440\u043e\u0441 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u043d     And \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0432\u043e\u043f\u0440\u043e\u0441\u0430 \"SomeQuestionName\"     And \u0442\u0435\u043b\u043e \u0432\u043e\u043f\u0440\u043e\u0441\u0430 \"SomeQuestionBody\"     When \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0432\u043e\u043f\u0440\u043e\u0441\u0430 \u043d\u0430 \"SomeQuestionNameUpdated\" \u0438 \u0442\u0435\u043b\u043e \u043d\u0430 \"SomeQuestionBodyUpdated\"     Then \u0432\u043e\u043f\u0440\u043e\u0441 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d     And \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0432\u043e\u043f\u0440\u043e\u0441\u0430 \"SomeQuestionNameUpdated\"     And \u0442\u0435\u043b\u043e \u0432\u043e\u043f\u0440\u043e\u0441\u0430 \"SomeQuestionBodyUpdated\"     When \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440 \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0441\u0435\u0445 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432     Then \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432 \u043f\u043e\u043b\u0443\u0447\u0435\u043d c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 1         When \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440 \u0443\u0434\u0430\u043b\u044f\u0435\u0442 \u0432\u043e\u043f\u0440\u043e\u0441     Then \u0432\u043e\u043f\u0440\u043e\u0441 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0443\u0434\u0430\u043b\u0435\u043d     When \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440 \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0441\u0435\u0445 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432     Then \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432 \u043f\u043e\u043b\u0443\u0447\u0435\u043d c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 0<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u044f \u0431\u044b \u0445\u043e\u0442\u0435\u043b \u0437\u0430\u043e\u0441\u0442\u0440\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0435 \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0448\u0430\u0433\u043e\u0432 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043d\u0443\u0436\u043d\u043e\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0441\u0435\u0440\u0432\u0438\u0441\u0430. \u0423 \u043d\u0430\u0441 \u0432 \u0431\u043b\u043e\u043a\u0435 Background \u0432\u0441\u0435\u0433\u043e \u043d\u0438\u0447\u0435\u0433\u043e &#8212; 4 \u0441\u0442\u0440\u043e\u043a\u0438. \u041d\u043e \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445 \u0441\u043e \u0441\u043b\u043e\u0436\u043d\u044b\u043c\u0438 \u0441\u0445\u0435\u043c\u0430\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445, \u0442\u0430\u043a\u0438\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u0431\u043e\u043b\u044c\u0448\u0435. \u0418 \u044d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u043e, \u043a\u043e\u0433\u0434\u0430 \u0442\u044b \u0432 \u043b\u044e\u0431\u043e\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0442\u0435\u0441\u0442\u0430 \u043c\u043e\u0436\u0435\u0448\u044c \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043b\u044e\u0431\u044b\u0435 \u043d\u0443\u0436\u043d\u044b\u0435 \u0442\u0435\u0431\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0441\u0435\u0440\u0432\u0438\u0441\u0435 &#8212; \u0443\u0434\u043e\u0431\u043d\u043e \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0442\u0435\u0441\u0442\u043e\u0432, \u043d\u043e \u0438 \u0434\u043b\u044f \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0438 \u0440\u0430\u0437\u0431\u043e\u0440\u0430 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0431\u0430\u0433\u043e\u0432.<\/p>\n<p>\u041d\u0430\u043f\u0438\u0448\u0435\u043c \u0447\u0443\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0439 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439 \u043d\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u043f\u043e\u0438\u0441\u043a\u0430 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u043e \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u044f\u0437\u044b\u043a\u0430 Gherkin. \u041e\u043d \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043a\u0430\u043a \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0447\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 \u043c\u0435\u0442\u043e\u0434, \u0442\u0430\u043a \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u043f\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432. <\/p>\n<pre><code class=\"swift\">  Scenario Outline: \u041f\u043e\u0438\u0441\u043a \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432\u0435\u0440\u043d\u043e     When \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0432\u043e\u043f\u0440\u043e\u0441\u044b       | Name   | Answer    |       | First  | AbcXXX    |       | Second | XXXcda    |       | Third  | SecondYYY |     When \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043f\u043e\u0438\u0441\u043a \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432 \"&lt;SearchQuery>\"     Then \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432 \u043f\u043e\u043b\u0443\u0447\u0435\u043d c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 &lt;Count>   Examples:      | SearchQuery | Count |     | First       | 1     |     | Fir         | 1     |     | ZZZ         | 0     |     | first       | 1     |     | XXX         | 2     |     | Second      | 2     |<\/code><\/pre>\n<p>\u0412\u043e\u0442 \u043a\u043e\u0434 \u043c\u0435\u0442\u043e\u0434\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0447\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435<\/p>\n<details class=\"spoiler\">\n<summary>[When(&#171;\u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0432\u043e\u043f\u0440\u043e\u0441\u044b&#187;)]<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cs\">[When(\"\u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0432\u043e\u043f\u0440\u043e\u0441\u044b\")]     public async Task AdministratorCreateQuestions(Table table)     {         \/\/ \u043f\u0435\u0440\u0435\u0431\u0435\u0440\u0451\u043c \u0432 \u0446\u0438\u043a\u043b\u0435 \u0432\u0441\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0441\u043e\u0437\u0434\u0430\u0442\u044c         foreach (var row in table.Rows)         {             \/\/ \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u043e\u0431\u044a\u0451\u043a\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0439 DTO \u0432\u043e\u043f\u0440\u043e\u0441\u0430             var question = new QuestionDto             (                 Guid.NewGuid(),                 row[0],                 row[1],                 Common.Category!.Id             );              \/\/ \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0432\u043e\u043f\u0440\u043e\u0441 \u0432 json             var body = JsonSerializer.Serialize(question);                          \/\/ \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u043e\u0431\u044a\u0435\u043a\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0432\u043e\u043f\u0440\u043e\u0441\u0430             var request = new HttpRequestMessage(HttpMethod.Post, \"\/api\/v1\/questions\")             {                 Content = new StringContent(body, Encoding.UTF8, \"application\/json\")             };                          \/\/ \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0445\u044d\u0434\u0435\u0440 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438             request.Headers.Authorization = AuthenticationHeaderValue.Parse(\"Bearer \" + Common.AuthToken);                          \/\/ \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440 \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0435\u0433\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442             Common.HttpResponseMessage = await ExtEnvironment.TestServer.CreateClient().SendAsync(request);         }     }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u044b \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u0442\u0435\u0441\u0442 \u043d\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0440\u0430\u0437\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u044b\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u043f\u043e\u0438\u0441\u043a\u0430 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432. \u042f \u0441\u043b\u044b\u0448\u0430\u043b \u043c\u043d\u0435\u043d\u0438\u0435 \u0447\u0442\u043e Grerkin \u043d\u0435 \u0443\u0434\u043e\u0431\u0435\u043d \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432, \u043c\u043d\u043e\u0433\u043e\u0441\u043b\u043e\u0432\u0435\u043d \u0438 \u0447\u0442\u043e \u043f\u0440\u043e\u0449\u0435 \u043f\u0438\u0441\u0430\u0442\u044c \u0432\u0441\u0435 \u0442\u0435\u0441\u0442\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0432 \u043a\u043e\u0434\u0435. \u042f \u043d\u0435 \u0441\u043e\u0433\u043b\u0430\u0441\u0435\u043d \u0441 \u044d\u0442\u0438\u043c \u043c\u043d\u0435\u043d\u0438\u0435\u043c &#8212; \u043f\u043b\u043e\u0445\u043e \u0441\u0435\u0431\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e \u043a\u0430\u043a \u044d\u0442\u043e\u0442 \u0442\u0435\u0441\u0442 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0441\u0442\u043e\u043b\u044c \u0436\u0435 \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u043e \u0438 \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u043a\u043e\u0434\u0435. \u0417\u043d\u0430\u043a\u043e\u043c\u0441\u0442\u0432\u043e \u0441 \u044f\u0437\u044b\u043a\u043e\u043c Grerkin \u0438 specflow \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c \u0442\u0443\u0442 <a href=\"https:\/\/specflow.org\/\" rel=\"noopener noreferrer nofollow\"><u>https:\/\/specflow.org\/<\/u><\/a><\/p>\n<h4>\u0427\u0430\u0441\u0442\u044c 6. \u0422\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u043c \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0443 \u0432 RabbitMQ<\/h4>\n<p>\u041f\u0435\u0440\u0435\u0439\u0434\u0451\u043c \u043a \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043d\u0430\u0448\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 &#8212; \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 RabbitMQ. <\/p>\n<p>\u041d\u0430\u043f\u0438\u0448\u0435\u043c \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439<\/p>\n<pre><code class=\"swift\">  Scenario: \u0412\u043e\u043f\u0440\u043e\u0441 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432 rabbitMq     When \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0432\u043e\u043f\u0440\u043e\u0441 \u0441 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c \"SomeQuestionName\" \u0438 \u0442\u0435\u043b\u043e\u043c \"SomeQuestionBody\"     Then \u0432\u043e\u043f\u0440\u043e\u0441 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u043d     And \u0432\u043e\u043f\u0440\u043e\u0441 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d<\/code><\/pre>\n<p>\u0427\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0447\u0442\u043e \u0432\u043e\u043f\u0440\u043e\u0441 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0435\u0433\u043e \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 RabbitMQ &#8212; \u044d\u0442\u043e \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u0430\u043c\u043e\u043f\u0438\u0441\u043d\u044b\u0439 \u043a\u043b\u0438\u0435\u043d\u0442 \u0434\u043b\u044f REST API<\/p>\n<details class=\"spoiler\">\n<summary>RabbitMqClient<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cs\">\/\/\/ &lt;summary> \/\/\/ \u041a\u043b\u0438\u0435\u043d\u0442 \u0434\u043b\u044f REST API RabbitMQ. \u041f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0440\u0435\u0431\u0431\u0438\u0442\u043e\u043c \u043f\u043e pull \u043c\u043e\u0434\u0435\u043b\u0438 - \u0447\u0442\u043e \u0443\u0434\u043e\u0431\u043d\u043e \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u043e\u0432 \/\/\/ &lt;\/summary> public class RabbitMqClient {     private readonly HttpClient _httpClient;     const string Vhost = \"%2F\";      public RabbitMqClient()     {         var httpClientHandler = new HttpClientHandler { Credentials = new NetworkCredential(\"guest\", \"guest\") };         _httpClient = new HttpClient(httpClientHandler);     }              \/\/\/ &lt;summary>     \/\/\/ \u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438     \/\/\/ &lt;\/summary>     public async Task&lt;ModelMessageRabbit?> GetMessageFromQueue(string queue)     {         var content = new StringContent(\"{\\\"count\\\":1,\\\"ackmode\\\":\\\"ack_requeue_false\\\",\\\"encoding\\\":\\\"auto\\\",\\\"truncate\\\":50000}\");         var httpResponseMessage = await _httpClient.PostAsync($\"http:\/\/localhost:15672\/api\/queues\/{Vhost}\/{queue}\/get\", content);          var payload = httpResponseMessage.Content.ReadAs&lt;ModelMessageRabbit[]>();         return payload!.FirstOrDefault();     }              \/\/\/ &lt;summary>     \/\/\/ \u041e\u0447\u0438\u0441\u0442\u0438\u0442\u044c \u043e\u0447\u0435\u0440\u0435\u0434\u044c     \/\/\/ &lt;\/summary>     public async Task ClearQueue(string queue) =>         await _httpClient.DeleteAsync($\"http:\/\/localhost:15672\/api\/queues\/{Vhost}\/{queue}\/contents\"); }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0410 \u0441\u0430\u043c \u0448\u0430\u0433 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0442\u0430\u043a<\/p>\n<details class=\"spoiler\">\n<summary>[Then(@&#187;\u0432\u043e\u043f\u0440\u043e\u0441 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d&#187;)]<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cs\">[Then(@\"\u0432\u043e\u043f\u0440\u043e\u0441 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\")]     public async Task QuestionSuccessfullySent()     {         \/\/ \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0435\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0438\u0437 RabbitMQ, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u043d\u0430\u043c\u0438 \u0432\u043e\u043f\u0440\u043e\u0441         var messagesFromQueue = await ExtEnvironment.RabbitMqClient.GetMessageFromQueue(\"FaqQueue\");                  \/\/ \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c, \u0447\u0442\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0431\u044b\u043b\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e         messagesFromQueue.Should().NotBeNull();          \/\/ \u0434\u0435\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u0432\u043e\u043f\u0440\u043e\u0441 \u0438\u0437 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0438\u0437 RabbitMQ         var question = messagesFromQueue!.Payload!.ReadAs&lt;QuestionDto>();                  \/\/ \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c, \u0447\u0442\u043e \u043f\u043e\u043b\u044f \u0432\u043e\u043f\u0440\u043e\u0441\u0430 \u0432\u044b\u0433\u0440\u0443\u0436\u0435\u043d\u044b \u0432\u0435\u0440\u043d\u043e         question.Should().NotBeNull();         question!.Id.Should().Be(Common.Question!.Id);         question.Title.Should().Be(Common.Question.Title);         question.Answer.Should().Be(Common.Question.Answer);         question.CategoryId.Should().Be(Common.Question.CategoryId);     }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u041d\u0443 \u0432\u043e\u0442 \u043c\u044b \u0438 \u0434\u043e\u0431\u0440\u0430\u043b\u0438\u0441\u044c \u0434\u043e \u043a\u043e\u043d\u0446\u0430 \u0441\u0442\u0430\u0442\u044c\u0438. \u041c\u043d\u0435 \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0445\u043e\u0442\u044c \u0438 \u043e\u0431\u044a\u0451\u043c\u043d\u043e, \u043d\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e. \u042f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 \u043f\u043e\u0447\u0442\u0438 \u043d\u0430 \u043a\u0430\u0436\u0434\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443, \u0447\u0442\u043e\u0431\u044b \u043b\u044e\u0431\u043e\u0439 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0449\u0438\u043a, \u0434\u0430\u0436\u0435 \u0431\u0435\u0437 \u0437\u043d\u0430\u043d\u0438\u0439 c#, \u043c\u043e\u0433 \u043e\u0441\u0432\u043e\u0438\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043a \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u0442\u0435\u0441\u0442\u043e\u0432.<\/p>\n<p>\u0412\u0435\u0441\u044c \u043f\u0440\u043e\u0435\u043a\u0442 \u0441 \u0442\u0435\u0441\u0442\u0430\u043c\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432\u043e\u0442 \u0437\u0434\u0435\u0441\u044c <a href=\"https:\/\/gitlab.com\/grisha0088\/ComponentTestsExample\" rel=\"noopener noreferrer nofollow\"><u>https:\/\/gitlab.com\/grisha0088\/ComponentTestsExample<\/u><\/a><\/p>\n<h2>\u0412\u044b\u0432\u043e\u0434\u044b<\/h2>\n<p>\u0423 \u043d\u0430\u0441 \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 \u043f\u0440\u0438\u043d\u044f\u0442\u043e \u0442\u0430\u043a &#8212; \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043f\u0438\u0448\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u043a\u0435\u0439\u0441\u044b \u043d\u0430 \u0441\u0435\u0440\u0432\u0438\u0441, \u0430 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u0443\u0436\u0435 \u043e\u0431\u043e\u0433\u0430\u0449\u0430\u0435\u0442 \u0438\u0445. \u0412 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0435\u0441\u043b\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0433\u043e\u0442\u043e\u0432 \u043f\u043e\u043c\u043e\u0433\u0430\u0442\u044c, \u0434\u0430\u0436\u0435 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0438 \u0431\u0435\u0437 \u043e\u043f\u044b\u0442\u0430 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442 \u0442\u0430\u043a\u0438\u0435 \u0442\u0435\u0441\u0442\u044b \u043f\u0438\u0441\u0430\u0442\u044c.<\/p>\n<p>\u0412 \u0446\u0435\u043b\u043e\u043c \u044f \u043f\u043e\u0447\u0442\u0438 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043b \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0432 \u0441\u0435\u0440\u0432\u0438\u0441. \u0427\u0435\u0440\u0435\u0437 \u0442\u0435\u0441\u0442\u044b \u0443\u0434\u043e\u0431\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u0441\u0435\u0440\u0432\u0438\u0441\u0430, \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u044c \u0431\u0430\u0433\u0438, \u0434\u0435\u0431\u0430\u0436\u0438\u0442\u044c &#8212; \u0434\u043b\u044f \u043c\u0435\u043d\u044f \u043e\u043d\u0438 \u0441\u0442\u0430\u043b\u0438 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0430 &#8212; \u043e\u043d\u0438 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0432\u0441\u0442\u0440\u043e\u0438\u043b\u0438\u0441\u044c \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u0430.<\/p>\n<p>\u041c\u043d\u0435 \u043d\u0435 \u043d\u0440\u0430\u0432\u0438\u0442\u0441\u044f \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u044e\u0449\u0430\u044f\u0441\u044f \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0432 \u0438\u043d\u0434\u0443\u0441\u0442\u0440\u0438\u0438 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430, \u043a\u043e\u0433\u0434\u0430 \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u044e\u0442\u0441\u044f End2End \u0442\u0435\u0441\u0442\u0430\u043c\u0438, \u043e\u0431\u044b\u0447\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u043c\u0438 \u043d\u0430 Python, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0436\u0438\u0432\u0443\u0442 \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u0438 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0441\u0438\u043b\u0430\u043c\u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u043e\u0432. \u0422\u0430\u043a\u0438\u0435 \u0442\u0435\u0441\u0442\u044b \u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0430, \u043d\u043e \u043d\u0430 \u044d\u0442\u043e\u043c \u0438\u0445 \u043f\u043e\u043b\u044c\u0437\u0430 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f. \u0414\u0430 \u0438 \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0445 &#8212; \u0434\u0435\u0431\u0430\u0436\u0438\u0442\u044c \u0435\u0441\u043b\u0438 \u0442\u0435\u0441\u0442 \u0443\u043f\u0430\u043b, \u0441\u043b\u0435\u0434\u0438\u0442\u044c \u0447\u0442\u043e\u0431\u044b \u043d\u0430 \u043d\u0438\u0445 \u0442\u043e\u0447\u043d\u043e \u043d\u0435 \u0437\u0430\u0431\u0438\u043b\u0438 &#8212; \u0434\u0435\u043b\u043e \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0435. \u042f \u043d\u0435 \u043f\u0440\u043e\u0442\u0438\u0432 End2End \u0442\u0435\u0441\u0442\u043e\u0432, \u043d\u043e, \u043a\u0430\u043a \u043c\u043d\u0435 \u043a\u0430\u0436\u0435\u0442\u0441\u044f, \u043d\u0435 \u043e\u043d\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u043b\u0435\u0436\u0430\u0442\u044c \u0432 \u043e\u0441\u043d\u043e\u0432\u0435 &#8212; \u0438\u0445 \u0440\u043e\u043b\u044c, \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438 \u0432 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432.<\/p>\n<p>\u042f \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u044d\u0442\u0443 \u0441\u0442\u0430\u0442\u044c\u044e, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u0435\u0441\u0442\u044c \u043e\u0442\u043b\u0438\u0447\u043d\u0430\u044f \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u0430 End2End \u0442\u0435\u0441\u0442\u0430\u043c \u0438 \u043d\u0438\u0447\u0435\u0433\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0433\u043e \u0432 \u0442\u0430\u043a\u043e\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u0435 \u043d\u0435\u0442. \u041d\u0430\u0434\u0435\u044e\u0441\u044c, \u044d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u0441\u044f \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0432\u0430\u043c \u043f\u0438\u0441\u0430\u0442\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0442\u0435\u0441\u0442\u044b \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0440\u0430\u0434\u043e\u0441\u0442\u044c \u043e\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043d\u0438\u043c\u0438 ?<\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/758888\/\"> https:\/\/habr.com\/ru\/articles\/758888\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041f\u0440\u0438\u0432\u0435\u0442! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0413\u0440\u0438\u0448\u0430 \u0438 \u044f \u0431\u044d\u043a\u0435\u043d\u0434 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043d\u0430 .net\u00a0<\/p>\n<p>\u0421 \u0434\u0440\u0443\u0437\u044c\u044f\u043c\u0438 \u043c\u044b \u0447\u0430\u0441\u0442\u043e \u043e\u0431\u0441\u0443\u0436\u0434\u0430\u0435\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u043a\u0430\u043a \u043f\u0438\u0448\u0443\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u0442\u0435\u0441\u0442\u044b. \u042f \u0447\u0430\u0441\u0442\u043e \u0441\u043b\u044b\u0448\u0443 \u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435\u0441\u0443\u0442 \u0431\u043e\u043b\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c \u0438 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0441 \u044d\u0442\u0438\u043c \u043f\u0440\u0438\u043d\u043e\u0441\u044f\u0442 \u043c\u0430\u043b\u043e \u043f\u043e\u043b\u044c\u0437\u044b.\u00a0<\/p>\n<p>\u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u044f \u0441\u0442\u0440\u043e\u044e \u0432\u0435\u0441\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u043d\u0430 \u0442\u0435\u0441\u0442\u0430\u0445. \u042f \u0431\u044b \u0445\u043e\u0442\u0435\u043b \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0441\u0432\u043e\u0438\u043c \u0432\u0437\u0433\u043b\u044f\u0434\u043e\u043c \u043d\u0430 \u0442\u043e, \u043a\u0430\u043a \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043d\u044b\u0435 \u0442\u0435\u0441\u0442\u044b \u0438 \u0432 \u0447\u0451\u043c \u043e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u044b \u043f\u043e\u043c\u0438\u043c\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u0435\u0440\u0432\u0438\u0441\u0430.<\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043c\u0435\u0441\u0442\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043d\u044b\u0445 \u0442\u0435\u0441\u0442\u043e\u0432 \u0432 \u043f\u0438\u0440\u0430\u043c\u0438\u0434\u0435 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0437\u0430\u0447\u0435\u043c \u043e\u043d\u0438 \u043d\u0443\u0436\u043d\u044b \u0438 \u043a\u043e\u043c\u0443. \u041f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043f\u0440\u043e \u0442\u043e \u043a\u0430\u043a\u0438\u043c\u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u043e\u0431\u043b\u0430\u0434\u0430\u0442\u044c \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u044b\u0435 \u0442\u0435\u0441\u0442\u044b. \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u043e\u0434\u0445\u043e\u0434 \u043a \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u043e\u0431\u043b\u0430\u0434\u0430\u044e\u0449\u0438\u0445 \u0432\u0441\u0435\u043c\u0438 \u044d\u0442\u0438\u043c\u0438 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430\u043c\u0438 \u0442\u0435\u0441\u0442\u043e\u0432 \u0438 \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u043f\u0430\u0440\u043e\u0447\u043a\u0443.<\/p>\n<h3>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/h3>\n<p>\u0412\u0441\u0435 \u0437\u043d\u0430\u044e\u0442 \u0447\u0442\u043e \u043b\u044e\u0431\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u043f\u0440\u043e \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u043e\u043b\u0436\u043d\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c\u0441\u044f \u0441 \u043f\u0438\u0440\u0430\u043c\u0438\u0434\u044b. \u042f \u043d\u0435 \u0432\u0435\u0440\u044e \u0432 \u043f\u0438\u0440\u0430\u043c\u0438\u0434\u0443 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u0430\u0445, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u043c\u0435\u0441\u0442\u043e \u043d\u0435\u0451 \u0431\u0443\u0434\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0447\u043a\u0430.<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td><\/td>\n<td>\n<p align=\"left\">\u0435nd2\u0435nd\u00a0<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043d\u044b\u0435\u00a0<\/p>\n<\/td>\n<td data-colwidth=\"142\" width=\"142\">\n<p align=\"left\">\u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041c\u043e\u0434\u0443\u043b\u044c\u043d\u044b\u0435<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0427\u0442\u043e \u0442\u0435\u0441\u0442\u0438\u0440\u0443\u044e\u0442<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0433\u0440\u0443\u043f\u043f\u0443 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0441\u0435\u0440\u0432\u0438\u0441 \u0432 \u0438\u0437\u043e\u043b\u044f\u0446\u0438\u0438\u00a0<\/p>\n<\/td>\n<td data-colwidth=\"142\" width=\"142\">\n<p align=\"left\">\u0447\u0430\u0441\u0442\u044c \u0441\u0435\u0440\u0432\u0438\u0441\u0430, \u043b\u0438\u0431\u043e \u0432\u0435\u0441\u044c \u0441\u0435\u0440\u0432\u0438\u0441 \u0441 \u0437\u0430\u043c\u043e\u043a\u0430\u043d\u044b\u043c\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043a\u043b\u0430\u0441\u0441 \u0438\u043b\u0438 \u043c\u0435\u0442\u043e\u0434<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0421\u043a\u043e\u0440\u043e\u0441\u0442\u044c<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e<\/p>\n<\/td>\n<td data-colwidth=\"142\" width=\"142\">\n<p align=\"left\">\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0431\u044b\u0441\u0442\u0440\u043e<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u041a\u0442\u043e \u043f\u0438\u0448\u0435\u0442<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0441\u043a\u043e\u0440\u0435\u0435 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0438 \u043d\u043e \u043c\u043e\u0433\u0443\u0442 \u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0441\u043a\u043e\u0440\u0435\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u043d\u043e \u043c\u043e\u0433\u0443\u0442 \u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0438<\/p>\n<\/td>\n<td data-colwidth=\"142\" width=\"142\">\n<p align=\"left\">\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0413\u0434\u0435 \u0436\u0438\u0432\u0443\u0442<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0441 \u043a\u043e\u0434\u043e\u043c<\/p>\n<\/td>\n<td data-colwidth=\"142\" width=\"142\">\n<p align=\"left\">\u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0441 \u043a\u043e\u0434\u043e\u043c<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0441 \u043a\u043e\u0434\u043e\u043c<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0411\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0442 \u043b\u0438 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d \u0432 ci<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043d\u0435\u0442<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0434\u0430<\/p>\n<\/td>\n<td data-colwidth=\"142\" width=\"142\">\n<p align=\"left\">\u0434\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0434\u0430<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0423\u0434\u043e\u0431\u043d\u043e \u043b\u0438 \u0434\u0435\u0431\u0430\u0436\u0438\u0442\u044c<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043d\u0435\u0442, \u0442\u043e\u043b\u044c\u043a\u043e remote debug<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0434\u0430<\/p>\n<\/td>\n<td data-colwidth=\"142\" width=\"142\">\n<p align=\"left\">\u0434\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0434\u0430<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u041a\u043e\u0433\u0434\u0430 \u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f \u043f\u0440\u0430\u0432\u043a\u0438<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043f\u043e\u043c\u0435\u043d\u044f\u043b\u0441\u044f \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043f\u043e\u043c\u0435\u043d\u044f\u043b\u0441\u044f \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442<\/p>\n<\/td>\n<td data-colwidth=\"142\" width=\"142\">\n<p align=\"left\">\u043f\u043e\u043c\u0435\u043d\u044f\u043b\u0430\u0441\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043f\u043e\u043c\u0435\u043d\u044f\u043b\u0430\u0441\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f\u00a0<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u041c\u043e\u0433\u0443\u0442 \u043b\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u043d\u0435\u0433\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043d\u0435\u0442<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0434\u0430<\/p>\n<\/td>\n<td data-colwidth=\"142\" width=\"142\">\n<p align=\"left\">\u0434\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0434\u0430<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0413\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0442 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 \u043c\u0430\u0448\u0438\u043d\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043d\u0435\u0442<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0434\u0430<\/p>\n<\/td>\n<td data-colwidth=\"142\" width=\"142\">\n<p align=\"left\">\u043d\u0435\u0442<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043d\u0435\u0442<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u041f\u043e\u043b\u0435\u0437\u043d\u044b \u0434\u043b\u044f \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0431\u0430\u0433\u043e\u0432<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043d\u0435\u0442<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0434\u0430\u00a0<\/p>\n<\/td>\n<td data-colwidth=\"142\" width=\"142\">\n<p align=\"left\">\u0441\u043a\u043e\u0440\u0435\u0435 \u043d\u0435\u0442\u00a0<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0441\u043a\u043e\u0440\u0435\u0435 \u043d\u0435\u0442<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u041f\u043e\u0434\u043d\u0438\u043c\u0430\u044e\u0442 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043d\u0435\u0442<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0434\u0430<\/p>\n<\/td>\n<td data-colwidth=\"142\" width=\"142\">\n<p align=\"left\">\u043d\u0435\u0442<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043d\u0435\u0442<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<ol>\n<li>\n<p>\u041c\u043e\u0434\u0443\u043b\u044c\u043d\u044b\u0435 \u0442\u0435\u0441\u0442\u044b \u0431\u044b\u0441\u0442\u0440\u044b\u0435, \u043f\u0440\u043e\u0441\u0442\u044b\u0435, \u043d\u043e \u043b\u043e\u043c\u0430\u044e\u0442\u0441\u044f \u043f\u0440\u0438 \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433\u0435. \u041e\u0431\u044b\u0447\u043d\u043e \u0438\u0445 \u043f\u0438\u0448\u0443\u0442 \u0434\u043b\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u0432 \u0438\u043b\u0438 \u043a\u0430\u043a\u0438\u0445-\u0442\u043e \u0434\u0440\u0443\u0433\u0438\u0445 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0443\u0447\u0430\u0441\u0442\u043a\u043e\u0432 \u043a\u043e\u0434\u0430.<\/p>\n<p>\u042f \u0438\u0445 \u043f\u0438\u0448\u0443 \u043d\u0430 \u0434\u043e\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b, \u0435\u0441\u043b\u0438 \u0441\u0435\u0440\u0432\u0438\u0441 \u043d\u0430 \u0414\u0414\u0414. \u0415\u0441\u043b\u0438 \u0441\u0435\u0440\u0432\u0438\u0441 &#8212; \u044d\u0442\u043e \u043f\u0435\u0440\u0435\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u043d\u0438\u0435 json \u0438\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u043c\u0435\u0441\u0442\u0430 \u0432 \u0434\u0440\u0443\u0433\u043e\u0435, \u0442\u043e \u043c\u043e\u0433\u0443 \u0438 \u043d\u0435 \u043f\u0438\u0441\u0430\u0442\u044c \u0432\u043e\u043e\u0431\u0449\u0435.<\/p>\n<\/li>\n<li>\n<p>\u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0442\u0435\u0441\u0442\u044b &#8212; \u0447\u0442\u043e-\u0442\u043e \u0447\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u0435\u0435 \u0447\u0435\u043c Unit \u0442\u0435\u0441\u0442, \u043d\u043e \u043c\u0435\u043d\u044c\u0448\u0435 \u0447\u0435\u043c \u0442\u0435\u0441\u0442, \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u0432\u0435\u0441\u044c \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441. \u042d\u0442\u043e \u0442\u0435\u0441\u0442\u044b \u043d\u0430 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u0432 \u0441\u0432\u044f\u0437\u043a\u0435 \u0441 \u0411\u0414, \u0442\u0435\u0441\u0442\u044b \u043d\u0430 \u0441\u0435\u0440\u0432\u0438\u0441, \u043d\u043e \u0441 \u0437\u0430\u043c\u043e\u043a\u0430\u043d\u043d\u044b\u043c\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438 &#8212; \u043e\u0431\u044b\u0447\u043d\u043e \u043e\u043d\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e\u0442 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0447\u0430\u0441\u0442\u0435\u0439 \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d \u0437\u0430\u043f\u0440\u043e\u0441\u0430.\u00a0\u00a0<\/p>\n<p>\u042f \u0442\u0430\u043a\u0438\u0435 \u0442\u0435\u0441\u0442\u044b \u043d\u0435 \u043f\u0438\u0448\u0443 \u0437\u0430 \u0440\u0435\u0434\u043a\u0438\u043c\u0438 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f\u043c\u0438 &#8212; \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u043e\u0433\u0434\u0430 \u0432 \u0411\u0414 \u0438\u0434\u0443\u0442 \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0438 \u0438\u0445 \u043d\u0430\u0434\u043e \u043f\u043e\u0442\u0435\u0441\u0442\u0438\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e.<\/p>\n<\/li>\n<li>\n<p>\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043d\u044b\u0435 \u0442\u0435\u0441\u0442\u044b \u0442\u0435\u0441\u0442\u0438\u0440\u0443\u044e\u0442 \u0441\u0435\u0440\u0432\u0438\u0441 \u0446\u0435\u043b\u0438\u043a\u043e\u043c, \u043d\u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u0445 (\u041c\u044b \u043d\u0435 \u0432\u043c\u0435\u0448\u0438\u0432\u0430\u0435\u043c\u0441\u044f \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e DI \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0438 \u043d\u0435 \u043f\u043e\u0434\u0441\u043e\u0432\u044b\u0432\u0430\u0435\u043c \u0442\u0443\u0434\u0430 \u0437\u0430\u0433\u043b\u0443\u0448\u043a\u0438 &#8212; \u0441\u0435\u0440\u0432\u0438\u0441 \u0448\u043b\u0451\u0442 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0435 \u043e\u0442\u0432\u0435\u0442\u044b). \u0412 \u0438\u0434\u0435\u0430\u043b\u0435 \u0442\u0430\u043a\u0438\u0435 \u0442\u0435\u0441\u0442\u044b \u0442\u0430\u043a\u0436\u0435 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u044e\u0442 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0442\u0430\u0432\u0438\u043b\u0438\u0441\u044c \u043f\u0435\u0440\u0435\u0434 \u0435\u0433\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439, \u0438 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u044e\u0442 \u0447\u0442\u043e \u0441\u0435\u0440\u0432\u0438\u0441 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0438\u043c.\u00a0<\/p>\n<p>\u042f \u0441\u0442\u0430\u0440\u0430\u044e\u0441\u044c \u043f\u0438\u0441\u0430\u0442\u044c \u0438\u0445 \u0432\u0441\u0435\u0433\u0434\u0430.<\/p>\n<\/li>\n<li>\n<p>End2End \u0442\u0435\u0441\u0442\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e\u0442 \u0441\u0432\u044f\u0437\u043a\u0443 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 &#8212; \u043e\u0431\u044b\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u044b\u0435 \u043f\u043e\u0437\u0438\u0442\u0438\u0432\u043d\u044b\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438. \u0415\u0441\u043b\u0438 \u0432\u0441\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0432 \u0441\u0432\u044f\u0437\u043a\u0435 \u043f\u043e\u043a\u0440\u044b\u0442\u044b \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u0442\u043d\u044b\u043c\u0438 \u0442\u0435\u0441\u0442\u0430\u043c\u0438, \u0442\u043e e2e \u043f\u043e \u0441\u0443\u0442\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043b\u0438\u0448\u044c, \u0447\u0442\u043e \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442 \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0441\u044f, \u0438 \u0441\u0432\u044f\u0437\u043a\u0430 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u0435.<\/p>\n<p>\u042f \u0440\u0435\u0434\u043a\u043e \u043f\u0438\u0448\u0443 \u044d\u0442\u0438 \u0442\u0435\u0441\u0442\u044b &#8212; \u043e\u0431\u044b\u0447\u043d\u043e, \u043a\u043e\u0433\u0434\u0430 \u0441\u043e\u043c\u043d\u0435\u0432\u0430\u044e\u0441\u044c, \u0447\u0442\u043e \u0432\u0442\u043e\u0440\u0430\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u0430 \u043d\u0435 \u043f\u043e\u043c\u0435\u043d\u044f\u0435\u0442 \u043d\u0430\u0448 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442.<\/p>\n<\/li>\n<\/ol>\n<p>\u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u0432 \u0441\u0435\u0440\u0432\u0438\u0441 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435 \u0442\u0435\u0441\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0443\u0436\u043d\u044b &#8212; \u0432 \u043c\u043e\u0451\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u0431\u044b\u043b \u0431\u044b \u0441\u043a\u043e\u0440\u0435\u0435 \u0440\u043e\u043c\u0431 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0415\u0441\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b &#8212; \u0435\u0441\u0442\u044c \u044e\u043d\u0438\u0442 \u0442\u0435\u0441\u0442\u044b. \u0415\u0441\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0438\u0437 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 &#8212; \u043d\u0435\u043f\u043b\u043e\u0445\u043e \u0431\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u04352\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439. \u0412\u043e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043d\u044b\u0435 \u0442\u0435\u0441\u0442\u044b \u044f \u0441\u0442\u0430\u0440\u0430\u044e\u0441\u044c \u043f\u0438\u0441\u0430\u0442\u044c \u0432\u0441\u0435\u0433\u0434\u0430 \u0438 \u043c\u043d\u043e\u0433\u043e. \u0418 \u0433\u043b\u0430\u0432\u043d\u0430\u044f \u043f\u0440\u0438\u0447\u0438\u043d\u0430 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e &#8212; \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 3 \u043f\u0443\u043d\u043a\u0442\u0430 \u0432 \u0442\u0430\u0431\u043b\u0438\u0447\u043a\u0435.\u00a0\u042f \u043f\u0440\u043e\u0431\u0435\u0433\u0443\u0441\u044c \u043f\u043e \u043a\u0430\u0436\u0434\u043e\u043c\u0443:<\/p>\n<ol>\n<li>\n<p>\u041f\u043e\u0434\u043d\u0438\u043c\u0430\u044e\u0442 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 &#8212; \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b \u0442\u0435\u0441\u0442\u044b, \u043e\u043d\u0438 \u043f\u0440\u043e\u0448\u043b\u0438 \u0438\u043b\u0438 \u0443\u043f\u0430\u043b\u0438 &#8212; \u0443 \u0442\u0435\u0431\u044f \u0443\u0436\u0435 \u0432\u0441\u0435 \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0434\u043b\u044f \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u043f\u043e\u0434\u043d\u044f\u0442\u043e \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u0432 \u0434\u043e\u043a\u0435\u0440\u0435 &#8212; \u0431\u0430\u0437\u0430, RabbitMq \u0438\u043b\u0438 Kafka, http \u043c\u043e\u043a\u0438 &#8212; \u0432\u0441\u0435 \u0447\u0442\u043e \u0432\u043e\u043e\u0431\u0449\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u043d\u044f\u0442\u044c \u0442\u0430\u043c. \u042d\u0442\u043e \u0443\u0434\u043e\u0431\u043d\u043e.<\/p>\n<\/li>\n<li>\n<p>\u0413\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0442 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 \u043c\u0430\u0448\u0438\u043d\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 &#8212; \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0434\u0435\u0431\u0430\u0436\u0438\u0442\u044c \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u043e\u0434 \u0434\u043b\u044f \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0434\u0440\u0443\u0433\u043e\u0439, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0442\u0440\u0435\u0442\u0435\u0439 \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435 &#8212; \u0437\u0430\u043f\u0443\u0441\u0442\u0438 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u0442\u0435\u0441\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432 \u0441\u0432\u043e\u0438\u0445 \u0448\u0430\u0433\u0430\u0445 \u044d\u0442\u0438 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0442. \u0418 \u0434\u0430 &#8212; \u043e\u043d \u0431\u0443\u0434\u0435\u0442 &#8212; \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043d\u0430 \u0432\u0441\u0435 CRUD \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0442\u0430\u043a\u0438\u0435 \u0442\u0435\u0441\u0442\u044b \u043f\u0438\u0448\u0443\u0442\u0441\u044f. \u042d\u0442\u043e \u0441\u0443\u043f\u0435\u0440 \u0443\u0434\u043e\u0431\u043d\u043e.<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u043b\u0435\u0437\u043d\u044b \u0434\u043b\u044f \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0431\u0430\u0433\u043e\u0432 &#8212; \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u0432\u043c\u0435\u0441\u0442\u043e \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u0448\u0430\u0433\u043e\u0432\u043e\u0433\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0431\u0430\u0433\u0430 \u0434\u0435\u043b\u0430\u0435\u0442 \u043c\u0435\u0440\u0436 \u0440\u0435\u043a\u0432\u0435\u0441\u0442 \u0441 \u0442\u0435\u0441\u0442\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442. \u0422\u044b \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0448\u044c \u0435\u0433\u043e \u0438 \u0434\u0435\u0431\u0430\u0436\u0438\u0448\u044c. \u042d\u0442\u043e \u0441\u0443\u043f\u0435\u0440 \u043c\u0435\u0433\u0430 \u0443\u0434\u043e\u0431\u043d\u043e &#8212; \u043f\u043e \u043a\u0440\u0430\u0439\u043d\u0435\u0439 \u043c\u0435\u0440\u0435 \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 ?<\/p>\n<\/li>\n<\/ol>\n<h2>\u0427\u0430\u0441\u0442\u044c 1. \u0421\u0445\u0435\u043c\u0430 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430<\/h2>\n<p>\u0411\u043b\u0438\u0436\u0435 \u043a \u0434\u0435\u043b\u0443! \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u043a\u0440\u043e\u0435\u043c \u0442\u0438\u043f\u043e\u0432\u043e\u0439 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043d\u044b\u043c\u0438 \u0442\u0435\u0441\u0442\u0430\u043c\u0438 \u0438 \u043d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0443\u0434\u043e\u0431\u043d\u043e \u044d\u0442\u043e \u0438\u043b\u0438 \u043d\u0435\u0442. \u0421\u0445\u0435\u043c\u0430 \u0442\u0435\u0441\u0442\u0430 \u0443 \u043d\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f <\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u0421\u0445\u0435\u043c\u0430 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430<\/figcaption><\/div>\n<\/figure>\n<ol>\n<li>\n<p>\u041f\u0435\u0440\u0435\u0434 \u0437\u0430\u043f\u0443\u0441\u043a\u043e\u043c \u0442\u0435\u0441\u0442\u043a\u0435\u0439\u0441\u043e\u0432 \u043f\u043e\u0434\u043d\u0438\u043c\u0435\u043c \u0432\u0441\u0451 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u0443 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u0432 \u0434\u043e\u043a\u0435\u0440\u0435 &#8212; \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0441 \u0431\u0430\u0437\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445, \u0431\u0440\u043e\u043a\u0435\u0440\u043e\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0438 \u043f\u0440\u043e\u0447\u0438\u043c. \u0415\u0441\u043b\u0438 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0435 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f &#8212; \u043f\u043e\u0434\u043d\u0438\u043c\u0435\u043c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0434\u043b\u044f \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0437\u0430\u0433\u043b\u0443\u0448\u0435\u043a \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e Mountebank &#8212; \u0430 \u0437\u0430\u0433\u043b\u0443\u0448\u043a\u0438 \u0442\u0430\u043c \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f imposter.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0435\u0440\u0435\u0434 \u043a\u0430\u0436\u0434\u044b\u043c \u0442\u0435\u0441\u0442\u043a\u0435\u0439\u0441\u043e\u043c \u0431\u0443\u0434\u0435\u043c \u043e\u0447\u0438\u0449\u0430\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u043e\u0442 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u043b\u0438 \u0442\u0430\u043c \u043e\u0441\u0442\u0430\u0442\u044c\u0441\u044f \u043e\u0442 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u043a\u0435\u0439\u0441\u043e\u0432.<\/p>\n<\/li>\n<li>\n<p>\u041a\u0430\u0436\u0434\u044b\u0439 \u0442\u0435\u0441\u0442\u043a\u0435\u0439\u0441 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u0442\u044c \u0438\u0437 3 \u044d\u0442\u0430\u043f\u043e\u0432:<\/p>\n<ul>\n<li>\n<p>Given &#8212; \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f. \u042d\u0442\u043e\u0442 \u044d\u0442\u0430\u043f \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439. \u041e\u0431\u044b\u0447\u043d\u043e \u0442\u0430\u043c \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0438\u043c\u043f\u043e\u0441\u0442\u0435\u0440\u044b \u0441 \u0442\u0440\u0435\u0431\u0443\u0435\u043c\u044b\u043c \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435\u043c \u0434\u043b\u044f \u043f\u0440\u043e\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u0442\u0435\u0441\u0442\u043a\u0435\u0439\u0441\u0430.<\/p>\n<\/li>\n<li>\n<p>When &#8212; \u0438\u043d\u0438\u0446\u0438\u0438\u0440\u0443\u044e\u0449\u0435\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435. \u041e\u0431\u044b\u0447\u043d\u043e \u044d\u0442\u043e \u0437\u0430\u043f\u0440\u043e\u0441 \u0432 \u0441\u0435\u0440\u0432\u0438\u0441, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043e\u0442\u0432\u0435\u0442\u0430 \u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u043e\u0442\u0432\u0435\u0442\u0430 \u0432 \u043e\u0431\u0449\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e.<\/p>\n<\/li>\n<li>\n<p>Then &#8212; \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430. \u041e\u0431\u044b\u0447\u043d\u043e \u044d\u0442\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 http \u043e\u0442\u0432\u0435\u0442\u0430 + \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439, \u0442\u0440\u0435\u0431\u0443\u0435\u043c\u044b\u0445 \u043f\u043e \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u0443. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0432 RabbitMQ \u0432\u044b\u0433\u0440\u0443\u0437\u0438\u043b\u043e\u0441\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0438 \u043e\u043d\u043e \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e. <br \/>\u0422\u0430\u043a\u0436\u0435 \u0432 \u044d\u0442\u043e\u043c \u043c\u0435\u0442\u043e\u0434\u0435 \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u044e\u0442\u0441\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b \u0434\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0438\u0445 \u0448\u0430\u0433\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438 \u043f\u043e\u043c\u0435\u0449\u0430\u044e\u0442\u0441\u044f \u0432 \u043e\u0431\u0449\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u043e\u0436\u043d\u043e \u0438\u0437\u0432\u043b\u0435\u0447\u044c id \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0442\u043e\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0435\u0451 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435.<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<h2>\u0427\u0430\u0441\u0442\u044c 2. \u041f\u0438\u0448\u0435\u043c \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a<\/h2>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u044d\u0442\u0443 \u0441\u0445\u0435\u043c\u0443 \u0432 \u043a\u043e\u0434\u0435 \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0447\u0430\u0441\u0442\u043e \u0437\u0430\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0445 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432 FAQ:<\/p>\n<ol>\n<li>\n<p>\u0421\u0435\u0440\u0432\u0438\u0441 \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c API \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0439 \u0438 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432.\u00a0<\/p>\n<\/li>\n<li>\n<p>\u041e\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u0443\u043c\u0435\u0442\u044c \u0438\u0441\u043a\u0430\u0442\u044c \u043f\u043e \u0442\u0435\u043a\u0441\u0442\u0443 \u0432\u043e\u043f\u0440\u043e\u0441\u0430.<\/p>\n<\/li>\n<li>\n<p>\u0421\u0435\u0440\u0432\u0438\u0441 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0437\u0430\u043a\u0440\u044b\u0442 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0447\u0435\u0440\u0435\u0437 jwt \u0442\u043e\u043a\u0435\u043d.<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0432\u043e\u043f\u0440\u043e\u0441\u0430 \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0435\u0433\u043e \u0432 \u0441\u0435\u0440\u0432\u0438\u0441 \u043c\u043e\u0434\u0435\u0440\u0430\u0446\u0438\u0438 \u0447\u0435\u0440\u0435\u0437 RabbitMQ.<\/p>\n<\/li>\n<\/ol>\n<p>\u0412\u043e\u0442 \u043a\u043e\u0434 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u0432 \u0441\u0435\u0440\u0432\u0438\u0441\u0430.<\/p>\n<details class=\"spoiler\">\n<summary>CategoryController<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cs\">[ApiController] [Authorize] [Route(\"api\/v1\/categories\")] public class CategoryController : ControllerBase {     private readonly FaqDbContext _dbContext;          public CategoryController(FaqDbContext dbContext) => _dbContext = dbContext;      [HttpGet]     public async Task&lt;List&lt;CategoryDto>> GetAllCategoriesAsync()          => await _dbContext.Categories.Include(x=>x.Questions)             .Select(x=>new CategoryDto(x)).ToListAsync();      [HttpGet(\"{id}\")]     public async Task&lt;CategoryDto> GetCategoryById([FromRoute] Guid id)     {         var category = await _dbContext.Categories.Include(x=>x.Questions)             .FirstAsync(x => x.Id == id);                  return new CategoryDto(category);     }      [HttpPost]     public async Task&lt;CategoryDto> CreateCategory([FromBody] CategoryDto categoryDto)     {         var category = new Category(categoryDto.Id, categoryDto.Name);                  await _dbContext.Categories.AddAsync(category);         await _dbContext.SaveChangesAsync();                  return new CategoryDto(category);     }      [HttpPut(\"{id}\")]     public async Task&lt;CategoryDto> UpdateCategory([FromRoute] Guid id, [FromBody] CategoryDto categoryDto)     {         var category = await _dbContext.Categories.FirstAsync(x => x.Id == id);         category.Name = categoryDto.Name;                  await _dbContext.SaveChangesAsync();                  return new CategoryDto(category);     }      [HttpDelete(\"{id}\")]     public async Task DeleteCategory([FromRoute] Guid id)     {         var category = await _dbContext.Categories.FirstAsync(x => x.Id == id);                  _dbContext.Categories.Remove(category);         await _dbContext.SaveChangesAsync();     } }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>QuestionController<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cs\">[ApiController] [Authorize] [Route(\"api\/v1\/questions\")] public class QuestionController : ControllerBase {     private readonly FaqDbContext _dbContext;      public QuestionController(FaqDbContext dbContext) => _dbContext = dbContext;      [HttpGet(\"{id}\")]     public async Task&lt;QuestionDto?> GetQuestionById([FromRoute] Guid id)     {         var question = await _dbContext.Questions.FirstAsync(x => x.Id == id);         return new QuestionDto(question);     }          [HttpGet]     public async Task&lt;List&lt;QuestionDto>> Search([FromQuery]string? search)     {         var questionQuery = _dbContext.Questions.AsQueryable();                  if (search != null)         {             questionQuery = questionQuery.Where(x =>                 EF.Functions.ILike(x.Title, $\"%{search}%\") ||                 EF.Functions.ILike(x.Answer, $\"%{search}%\")             );         }         var questions = await questionQuery.ToListAsync();         return questions.Select(x => new QuestionDto(x)).ToList();     }      [HttpPost]     public async Task&lt;QuestionDto> CreateQuestion([FromBody] QuestionDto questionDto)     {         var question = new Question(questionDto.Id, questionDto.Title, questionDto.Answer, questionDto.CategoryId);          _dbContext.Questions.Add(question);         await _dbContext.SaveChangesAsync();                  var factory = new ConnectionFactory         {             UserName = \"guest\",             Password = \"guest\",             VirtualHost = \"\/\",             HostName = \"localhost\",             Port = 5672         };                  using (var connection = factory.CreateConnection())         using (var channel = connection.CreateModel())         {             channel.ExchangeDeclare(\"FaqExchange\", ExchangeType.Direct, durable: true);             channel.QueueDeclare(\"FaqQueue\", true, false, false);             channel.QueueBind(\"FaqQueue\", \"FaqExchange\", \"FaqRoutingKey\");              var body = Encoding.UTF8.GetBytes(JsonSerializer.Serialize(question));                          channel.BasicPublish(exchange:\"FaqExchange\",                 routingKey:\"FaqRoutingKey\",                 basicProperties:null,                 body: body);         }                  return new QuestionDto(question);     }      [HttpPut(\"{id}\")]     public async Task&lt;QuestionDto><\/code><\/pre>\n<\/div>\n<\/details>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-353990","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/353990","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=353990"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/353990\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=353990"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=353990"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=353990"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}