Что такое веб-сервис (Web Service) в архитектуре приложений?

«Что такое веб-сервис (Web Service) в архитектуре приложений?» — вопрос из категории Архитектура, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Веб-сервис (Web Service) — это стандартизированный способ обеспечения межпрограммного взаимодействия (Interoperability) через сеть (чаще всего интернет) с использованием открытых протоколов и форматов данных.

Ключевые характеристики:

  • Сетевое взаимодействие: Использует стандартные веб-протоколы (HTTP/HTTPS, SMTP).
  • Стандартизация данных: Обмен структурированными данными в форматах XML, JSON.
  • Независимость от платформы: Клиент и сервис могут быть написаны на разных языках и работать на разных ОС.
  • Описание интерфейса: Интерфейс сервиса формально описывается (например, WSDL для SOAP, OpenAPI/Swagger для REST).

Основные типы архитектур веб-сервисов:

  1. SOAP (Simple Object Access Protocol):

    • Строгий стандарт на основе XML.
    • Использует WSDL для описания интерфейса.
    • Имеет встроенные механизмы безопасности и транзакций (WS-*).
    • Чаще применяется в корпоративных системах (банки, госсектор).
  2. REST (Representational State Transfer):

    • Архитектурный стиль, а не протокол.
    • Использует HTTP-методы (GET, POST, PUT, DELETE) для операций с ресурсами.
    • Данные обычно в JSON.
    • Более простой, гибкий и популярный для публичных API и микросервисов.

Пример RESTful веб-сервиса (Python с Flask):

from flask import Flask, jsonify, request

app = Flask(__name__)

# Простой ресурс "Пользователи"
users = [{'id': 1, 'name': 'Alice'}, {'id': 2, 'name': 'Bob'}]

# Эндпоинт GET /api/users
@app.route('/api/users', methods=['GET'])
def get_users():
    return jsonify(users)

# Эндпоинт GET /api/users/<id>
@app.route('/api/users/<int:user_id>', methods=['GET'])
def get_user(user_id):
    user = next((u for u in users if u['id'] == user_id), None)
    if user is None:
        return jsonify({'error': 'User not found'}), 404
    return jsonify(user)

if __name__ == '__main__':
    app.run(debug=True)

Применение: Интеграция разнородных систем, микросервисная архитектура, мобильные бэкенды, публичные API.