Skip to content

Commit

Permalink
Update README.md
Browse files Browse the repository at this point in the history
  • Loading branch information
ahx authored Jun 27, 2024
1 parent b2e7fb3 commit 462d22b
Showing 1 changed file with 67 additions and 64 deletions.
131 changes: 67 additions & 64 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,20 @@

OpenapiFirst helps to implement HTTP APIs based on an [OpenAPI](https://www.openapis.org/) API description. It supports OpenAPI 3.0 and 3.1. It offers request and response validation and it ensures that your implementation follows exactly the API description.

[![Tests](https://github.com/ahx/openapi_first/actions/workflows/ruby.yml/badge.svg)](https://github.com/ahx/openapi_first/actions/workflows/ruby.yml)
[![CodeQL](https://github.com/ahx/openapi_first/actions/workflows/codeql.yml/badge.svg)](https://github.com/ahx/openapi_first/blob/codeql/.github/workflows/codeql.yml)

## Contents

<!-- TOC -->

- [Manual use](#manual-use)
- [Validate request](#validate-request)
- [Validate response](#validate-response)
- [Rack Middlewares](#rack-middlewares)
- [Request validation](#request-validation)
- [Response validation](#response-validation)
- [Test assertions](#test-assertions)
- [Manual use](#manual-use)
- [Validate request](#validate-request)
- [Validate response](#validate-response)
- [Framework integration](#framework-integration)
- [Configuration](#configuration)
- [Hooks](#hooks)
Expand All @@ -23,6 +26,67 @@ OpenapiFirst helps to implement HTTP APIs based on an [OpenAPI](https://www.open

<!-- /TOC -->

## Manual use

Load the API description:

```ruby
require 'openapi_first'

definition = OpenapiFirst.load('openapi.yaml')
```

### Validate request

```ruby
# Find and validate request
rack_request = Rack::Request.new(env)
validated_request = definition.validate_request(rack_request)

# Inspect the request and access parsed parameters
validated_request.known? # Is the request defined in the API description?
validated_request.valid? # => true / false
validated_request.invalid? # => true / false
validated_request.error # => Failure object if request is invalid
validated_request.parsed_body # => The parsed request body (Hash)
validated_request.parsed_query # This returns a Hash with only the query parameters that are defined in the OpenAPI description, parsed exactly as described.
validated_request.parsed_path_parameters
validated_request.parsed_headers
validated_request.parsed_cookies
validated_request.parsed_params # Merged parsed path, query parameters and request body
# Access the Openapi 3 Operation Object Hash
validated_request.operation['x-foo']
validated_request.operation['operationId'] => "getStuff"
# or the whole request definition
validated_request.request_definition.path # => "/pets/{petId}"
validated_request.request_definition.operation_id # => "showPetById"

# You can also raise an exception if validation fails:
definition.validate_request(rack_request, raise_error: true) # Raises OpenapiFirst::RequestInvalidError or OpenapiFirst::NotFoundError if request is invalid
```

### Validate response

```ruby
# Find and validate the response
rack_response = Rack::Response[*app.call(env)]
validated_response = definition.validate_response(rack_request, rack_response)

# Raise an exception if validation fails:
definition.validate_response(rack_request,rack_response, raise_error: true) # Raises OpenapiFirst::ResponseInvalidError or OpenapiFirst::ResponseNotFoundError

# Inspect the response and access parsed parameters and
response.known? # Is the response defined in the API description?
response.valid? # => true / false
response.invalid? # => true / false
response.error # => Failure object if response is invalid
response.status # => 200
response.parsed_body
response.parsed_headers
```

OpenapiFirst uses [`multi_json`](https://rubygems.org/gems/multi_json).

## Rack Middlewares

### Request validation
Expand Down Expand Up @@ -174,67 +238,6 @@ class TripsApiTest < ActionDispatch::IntegrationTest
end
```

## Manual use

Load the API description:

```ruby
require 'openapi_first'

definition = OpenapiFirst.load('openapi.yaml')
```

### Validate request

```ruby
# Find and validate request
rack_request = Rack::Request.new(env)
validated_request = definition.validate_request(rack_request)
# Or raise an exception if validation fails:
definition.validate_request(rack_request, raise_error: true) # Raises OpenapiFirst::RequestInvalidError or OpenapiFirst::NotFoundError if request is invalid

# Inspect the request and access parsed parameters
validated_request.known? # Is the request defined in the API description?
validated_request.valid? # => true / false
validated_request.invalid? # => true / false
validated_request.error # => Failure object if request is invalid
validated_request.parsed_params # Merged parsed path, query parameters and request body
validated_request.parsed_body
validated_request.parsed_path_parameters # => { "pet_id" => 42 }
validated_request.parsed_headers
validated_request.parsed_cookies
validated_request.parsed_query

# Access the Openapi 3 Operation Object Hash
validated_request.operation['x-foo']
validated_request.operation['operationId']
# or the whole request definition
validated_request.request_definition.path # => "/pets/{petId}"
validated_request.request_definition.operation_id # => "showPetById"
```

### Validate response

```ruby
# Find and validate the response
rack_response = Rack::Response[*app.call(env)]
validated_response = definition.validate_response(rack_request, rack_response)

# Raise an exception if validation fails:
definition.validate_response(rack_request,rack_response, raise_error: true) # Raises OpenapiFirst::ResponseInvalidError or OpenapiFirst::ResponseNotFoundError

# Inspect the response and access parsed parameters and
response.known? # Is the response defined in the API description?
response.valid? # => true / false
response.invalid? # => true / false
response.error # => Failure object if response is invalid
response.status # => 200
response.parsed_body
response.parsed_headers
```

OpenapiFirst uses [`multi_json`](https://rubygems.org/gems/multi_json).

## Configuration

You can configure default options globally:
Expand Down

0 comments on commit 462d22b

Please sign in to comment.