diff --git a/js/config.mjs b/js/config.mjs
index 95536d3a..bff21374 100644
--- a/js/config.mjs
+++ b/js/config.mjs
@@ -104,9 +104,17 @@ loadRespecWithConfiguration({
specStatus: "WV",
specType: "ST",
pluralize: true,
+ spellcheck: false,
- preProcess: [initializeHighlightJSYaml, fetchLinterConfiguration],
- postProcess: [generateMermaidFigures, highlightLinterCode, (config, document, utils) => processRuleBlocks(config, document, utils, linterConfiguration)],
+ preProcess: [
+ initializeHighlightJSYaml,
+ fetchLinterConfiguration,
+ ],
+ postProcess: [
+ generateMermaidFigures,
+ highlightLinterCode,
+ (config, document, utils) => processRuleBlocks(config, document, utils, linterConfiguration),
+ ],
localBiblio: {
"ADR-encryption": {
diff --git a/linter/testcases/date-time/expected-output.txt b/linter/testcases/date-time/expected-output.txt
index 6a3cdc88..7cb4bbd5 100644
--- a/linter/testcases/date-time/expected-output.txt
+++ b/linter/testcases/date-time/expected-output.txt
@@ -1,13 +1,13 @@
/testcases/date-time/openapi.json
- 94:55 error nlgov:date-time-ensure-timezone Use date-time format which includes a timezone paths./resources-with-time-incorrect.get.responses[200].content.application/json.schema.properties.date-time-local.format
+ 94:55 error nlgov:date-time-ensure-timezone Use date-time format which includes a time zone paths./resources-with-time-incorrect.get.responses[200].content.application/json.schema.properties.date-time-local.format
98:55 error nlgov:use-date-instead-of-datetime Field represents a date and therefore must set 'format' to 'date' paths./resources-with-time-incorrect.get.responses[200].content.application/json.schema.properties.date.format
102:55 error nlgov:use-date-instead-of-datetime Field represents a date and therefore must set 'format' to 'date' paths./resources-with-time-incorrect.get.responses[200].content.application/json.schema.properties.datum.format
106:55 error nlgov:use-date-instead-of-datetime Field represents a date and therefore must set 'format' to 'date' paths./resources-with-time-incorrect.get.responses[200].content.application/json.schema.properties.geboorteDatum.format
110:55 error nlgov:use-date-instead-of-datetime Field represents a date and therefore must set 'format' to 'date' paths./resources-with-time-incorrect.get.responses[200].content.application/json.schema.properties.birthDate.format
114:55 error nlgov:use-date-instead-of-datetime Field represents a date and therefore must set 'format' to 'date' paths./resources-with-time-incorrect.get.responses[200].content.application/json.schema.properties.expiration_date.format
118:55 error nlgov:use-date-instead-of-datetime Field represents a date and therefore must set 'format' to 'date' paths./resources-with-time-incorrect.get.responses[200].content.application/json.schema.properties.expiration_Date.format
- 122:55 error nlgov:time-without-timezone Use time-local format without a timezone paths./resources-with-time-incorrect.get.responses[200].content.application/json.schema.properties.timestamp.format
+ 122:55 error nlgov:time-without-timezone Use time-local format without a time zone paths./resources-with-time-incorrect.get.responses[200].content.application/json.schema.properties.timestamp.format
124:61 error nlgov:specify-format-for-date-and-time Any date field must set 'format' to 'date' paths./resources-with-time-incorrect.get.responses[200].content.application/json.schema.properties.missingFormatDate
218:27 error nlgov:use-date-instead-of-datetime Field represents a date and therefore must set 'format' to 'date' components.schemas.LocalDateTimeIncorrect.format
diff --git a/media/linter.yaml b/media/linter.yaml
index 15b99e93..7e46f64a 100644
--- a/media/linter.yaml
+++ b/media/linter.yaml
@@ -232,7 +232,7 @@ rules:
nlgov:date-time-ensure-timezone:
severity: error
given: $..properties[*].format
- message: "Use date-time format which includes a timezone"
+ message: "Use date-time format which includes a time zone"
then:
function: pattern
functionOptions:
@@ -241,7 +241,7 @@ rules:
nlgov:time-without-timezone:
severity: error
given: $..properties[*].format
- message: "Use time-local format without a timezone"
+ message: "Use time-local format without a time zone"
then:
function: pattern
functionOptions:
diff --git a/publishers.yml b/publishers.yml
index 78ea0618..a55dcaed 100644
--- a/publishers.yml
+++ b/publishers.yml
@@ -1,4 +1,4 @@
-# publishers.yml This is a list of organizations and repositories to crawl.
+# publishers.yml This is a list of organisations and repositories to crawl.
---
diff --git a/sections/designRules.md b/sections/designRules.md
index 06601b59..abddf71a 100644
--- a/sections/designRules.md
+++ b/sections/designRules.md
@@ -6,7 +6,7 @@
## Resources
-The REST architectural style is centered around the concept of a [=resource=]. A resource is an abstraction of a conceptual entity, identified by a globally unique [=URI=]. It may correspond to anything from a physical object (e.g. a building or a person) to an abstract concept (e.g. a permit, an event or today's weather). Although a resource is not tied to any specific exchange format, its current state can be transferred to clients through one or more representations, such as JSON or XML.
+The REST architectural style is centred around the concept of a [=resource=]. A resource is an abstraction of a conceptual entity, identified by a globally unique [=URI=]. It may correspond to anything from a physical object (e.g. a building or a person) to an abstract concept (e.g. a permit, an event or today's weather). Although a resource is not tied to any specific exchange format, its current state can be transferred to clients through one or more representations, such as JSON or XML.
@@ -18,13 +18,13 @@ The REST architectural style is centered around the concept of a [=resource=]. A
@@ -117,8 +117,8 @@ https://api.example.org/v1/vergunningen/d285e05c-6b01-45c3-92d8-5e19a946b66fStatement
-
Path segments of a [=URI=] MUST only contain lowercase letters, digits or hyphens. This is also known as kebab-case. Hyphens MUST only be used to deliniate distinct words. This also implies that diacritics MUST be normalized and special characters MUST be omitted.
-
Another implication of this rule is that file extensions MUST NOT be used. Resources SHOULD use the Accept header for content negotation.
+
Path segments of a [=URI=] MUST only contain lowercase letters, digits or hyphens. This is also known as kebab-case. Hyphens MUST only be used to delineate distinct words. This also implies that diacritics MUST be normalised and special characters MUST be omitted.
+
Another implication of this rule is that file extensions MUST NOT be used. Resources SHOULD use the Accept header for content negotiation.
The last path segment MAY start with `_`, which is used as a convention to implement operations
URI path segment starting with a hyphen (incorrect):
https://api.example.org/v1/-organisatie
-
URI path segment using normalized diacritics (correct):
+
URI path segment using normalised diacritics (correct):
https://api.example.org/v1/scenes
URI path segment using diacritics (incorrect):
https://api.example.org/v1/scènes
@@ -154,7 +154,7 @@ https://api.example.org/v1/vergunningen/d285e05c-6b01-45c3-92d8-5e19a946b66f
Loop all resource paths in the OpenAPI Description and check that all resource path segments use lowercase letters, digits or hyphens (-). The last path segment is allowed to start with a _.
@@ -167,12 +167,12 @@ https://api.example.org/v1/vergunningen/d285e05c-6b01-45c3-92d8-5e19a946b66fStatement
-
Query keys in a [=URI=] MUST only contain letters and digits, where the first letter of each word is capitalized, except for the first letter (MUST NOT be a digit) of the entire compound word. This is also known as lower camelCase. This also implies that diacritics MUST be normalized and special characters MUST be omitted.
+
Query keys in a [=URI=] MUST only contain letters and digits, where the first letter of each word is capitalised, except for the first letter (MUST NOT be a digit) of the entire compound word. This is also known as lower camelCase. This also implies that diacritics MUST be normalised and special characters MUST be omitted.
Rationale
-
Query keys are often converted to JSON object keys, where camelCase is the naming convention to avoid compatibility issues with JavaScript when deserializing objects.
+
Query keys are often converted to JSON object keys, where camelCase is the naming convention to avoid compatibility issues with JavaScript when deserialising objects.
@@ -258,12 +258,12 @@ Handling date and time is tricky and can lead to confusion among clients. The da
Rationale
-
Implementing RFC9557 and ISO 8601 removes ambiguity in date handling between systems and timezones.
+
Implementing RFC9557 and ISO 8601 removes ambiguity in date handling between systems and time zones.
RFC9557 is a profile on ISO8601, but is not a strict subset of allowed notations. Practically, to adhere to both, the following limitations MUST be applied to RFC9557:
In a field with a date-time value, the date and time component MUST be separated by a "T" in uppercase.
-
The timezone offset "Z" MUST be uppercase.
-
"-00:00" MUST NOT be used as timezone offset.
+
The time zone offset "Z" MUST be uppercase.
+
"-00:00" MUST NOT be used as time zone offset.
@@ -275,24 +275,24 @@ Handling date and time is tricky and can lead to confusion among clients. The da
-
Allow all timezone offsets in requests and use UTC in responses
+
Allow all time zone offsets in requests and use UTC in responses
Statement
-
APIs MUST accept any timezone offset in fields in requests containing a datetime. Fields in responses containing a datetime SHOULD be in UTC (e.g. Z as timezone offset).
+
APIs MUST accept any time zone offset in fields in requests containing a datetime. Fields in responses containing a datetime SHOULD be in UTC (e.g. Z as time zone offset).
-
If the original timezone is relevant for users (such as the timezone in which a value is registered), the timezone offset MUST be stored and published as a separate field in [[ISO8601-1]] format time-offset.
+
If the original time zone is relevant for users (such as the time zone in which a value is registered), the time zone offset MUST be stored and published as a separate field in [[ISO8601-1]] format time-offset.
Rationale
-
Allowing clients to use any timezone offset in requests results in flexibility and less complexity for users. Using UTC in responses results in clarity and removes ambiguity.
-
While storage formats are outside the scope of this specification, it is recommended to use appropriate temporal datatypes (such as DATE and TIMESTAMPTZ). Many database systems store these values internally in UTC and handle timezone conversion automatically on read/write.
+
Allowing clients to use any time zone offset in requests results in flexibility and less complexity for users. Using UTC in responses results in clarity and removes ambiguity.
+
While storage formats are outside the scope of this specification, it is recommended to use appropriate temporal data types (such as DATE and TIMESTAMPTZ). Many database systems store these values internally in UTC and handle time zone conversion automatically on read/write.
@@ -309,7 +309,7 @@ Handling date and time is tricky and can lead to confusion among clients. The da
Appending a default or irrelevant time portion to a date field can lead to interpretation errors. A publish date of 2025-07-24T00:00:00Z could for instance be rendered as July 23 in Ireland. A default time of 23:59 would in turn cause date confusion east of Greenwich.
To prevent conversion errors between storage and API, it is recommended to also store date values without a time portion (i.e. not as a timestamp).
How to test
@@ -333,7 +333,7 @@ Although the REST architectural style does not impose a specific protocol, REST
Rationale
- The HTTP specifications offer a set of standard methods, where every method is designed with explicit semantics. Adhering to the HTTP specification is crucial, since HTTP clients and middleware applications rely on standardized characteristics.
+ The HTTP specifications offer a set of standard methods, where every method is designed with explicit semantics. Adhering to the HTTP specification is crucial, since HTTP clients and middleware applications rely on standardised characteristics.
@@ -410,7 +410,7 @@ Although the REST architectural style does not impose a specific protocol, REST
The HTTP specification [[RFC9110]] and the later introduced PATCH method specification [[RFC5789]] offer a set of standard methods, where every method is designed with explicit semantics. HTTP also defines other methods, e.g. HEAD, OPTIONS, TRACE, and CONNECT.
The OpenAPI Specification 3.0 Path Item Object also supports these methods, except for CONNECT.
According to RFC 9110 9.1 the GET and HEAD HTTP methods MUST be supported by the server, all other methods are optional.
- In addition to the standard HTTP methods, a server may support other optional methods as well, e.g. PROPFIND, COPY, PURGE, VIEW, LINK, UNLINK, LOCK, UNLOCK, etc.
+ In addition to the standard HTTP methods, a server may support other optional methods as well, e.g. PROPFIND, COPY, PURGE, VIEW, LINK, UNLINK, LOCK, UNLOCK, etcetera.
If an optional HTTP request method is sent to a server and the server does not support that HTTP method for the target resource, an HTTP status code 405 Method Not Allowed shall be returned and a list of allowed methods for the target resource shall be provided in the Allow header in the response as stated in RFC 9110 15.5.6.
How to test
@@ -503,7 +503,7 @@ Although the REST architectural style does not impose a specific protocol, REST
## Statelessness
-One of the key constraints of the REST architectural style is stateless communication between client and server. It means that every request from client to server must contain all of the information necessary to understand the request. The server cannot take advantage of any stored session context on the server as it didn’t memorize previous requests. Session state must therefore reside entirely on the client.
+One of the key constraints of the REST architectural style is stateless communication between client and server. It means that every request from client to server must contain all of the information necessary to understand the request. The server cannot take advantage of any stored session context on the server as it didn’t memorise previous requests. Session state must therefore reside entirely on the client.
To properly understand this constraint, it is important to make a distinction between two different kinds of state:
@@ -514,9 +514,9 @@ To properly understand this constraint, it is important to make a distinction be
Stateless communication offers many advantages, including:
-* *Simplicity* is increased because the server does not have to memorize or retrieve session state while processing requests
+* *Simplicity* is increased because the server does not have to memorise or retrieve session state while processing requests
* *Scalability* is improved because not having to incorporate session state across multiple requests enables higher concurrency and performance
-* *Observability* is improved since every request can be monitored or analyzed in isolation without having to incorporate session context from other requests
+* *Observability* is improved since every request can be monitored or analysed in isolation without having to incorporate session context from other requests
* *Reliability* is improved because it eases the task of recovering from partial failures since the server does not have to maintain, update or communicate session state. One failing request does not influence other requests (depending on the nature of the failure of course).
@@ -562,7 +562,7 @@ Resources are often interconnected by relationships. Relationships can be modell
The [=singular resources=] for comments, referenced from all 3 collections, could still be modelled on a higher level to avoid deep nesting of URIs (which might increase complexity or problems due to the URI length):
Although this approach might seem counterintuitive from a technical perspective (we simply could have modelled a single /comments resource with optional filters for article and photo) and might introduce partially redundant functionality, it makes perfect sense from the perspective of the consumer, which increases developer experience.
+
Although this approach might seem counter-intuitive from a technical perspective (we simply could have modelled a single /comments resource with optional filters for article and photo) and might introduce partially redundant functionality, it makes perfect sense from the perspective of the consumer, which increases developer experience.
@@ -581,7 +581,7 @@ https://api.example.org/v1/comments/456
There are resource operations which might not seem to fit well in the CRUD interaction model. For example, approving a submission or notifying a customer. Depending on the type of the operation, there are three possible approaches:
-
Re-model the resource to incorporate extra fields supporting the particular operation. For example, an approval operation can be modelled in a boolean attribute goedgekeurd that can be modified by issuing a PATCH request against the resource. A drawback of this approach is that the resource does not contain any metadata about the operation (when and by whom was the approval given? Was the submission rejected in an earlier stage?). Furthermore, this requires a fine-grained authorization model, since approval might require a specific role.
+
Re-model the resource to incorporate extra fields supporting the particular operation. For example, an approval operation can be modelled in a boolean attribute goedgekeurd that can be modified by issuing a PATCH request against the resource. A drawback of this approach is that the resource does not contain any metadata about the operation (when and by whom was the approval given? Was the submission rejected in an earlier stage?). Furthermore, this requires a fine-grained authorisation model, since approval might require a specific role.
Treat the operation as a sub-resource. For example, model a sub-collection resource /inzendingen/12/beoordelingen and add an approval or rejection by issuing a POST request. To be able to retrieve the review history (and to consistently adhere to the REST principles), also support the GET method for this resource. The /inzendingen/12 resource might still provide a goedgekeurd boolean attribute (same as approach 1) which gets automatically updated in the background after adding a review. This attribute SHOULD however be read-only.
In exceptional cases, the approaches above still do not offer an appropriate solution. An example of such an operation is a global search across multiple resources. In this case, the creation of a dedicated resource, possibly nested under an existing resource, is the most obvious solution. Use the imperative mood of a verb, maybe even prefix it with a underscore to distinguish these resources from regular resources. For example: /search or /_search. Depending on the operation characteristics, GET and/or POST method MAY be supported for such a resource.
To reduce the amount of roundtrips between client and server, all applicable schema validation errors SHOULD be returned together.
+
To reduce the amount of round trips between client and server, all applicable schema validation errors SHOULD be returned together.
This allows a client to present validation errors to a user in one go, reducing user friction with multiple retries.
It depends on a validation technique whether this is possible or not.
For example, when a client provides a date in the weekend, where only dates on weekdays are allowed, it depends on which service performs these validation checks.
@@ -677,7 +677,7 @@ An API is as good as the accompanying documentation. The documentation has to be
How to test
- Parse the resource at the provided location as an OpenAPI Description and confirm all $refs are resolvable and paths are defined.
+ Parse the resource at the provided location as an OpenAPI Description and confirm all $refs are resolvable and paths are defined.
@@ -751,8 +751,8 @@ An API is as good as the accompanying documentation. The documentation has to be
How to test
-
Step 1: The API MUST meet the prerequisites to be tested. These include that an OAS file (openapi.json) is publicly available, parsable, all $refs are resolvable and paths are defined.
-
Step 2: The openapi.yaml document MAY be available. If available it MUST contain YAML, be readable and parsable.
+
Step 1: The API MUST meet the prerequisites to be tested. These include that an OAS file (openapi.json) is publicly available, parseable, all $refs are resolvable and paths are defined.
+
Step 2: The openapi.yaml document MAY be available. If available it MUST contain YAML, be readable and parseable.
Step 3: The openapi.yaml document MUST contain the same OpenAPI Description as the openapi.json document.
Step 4: The CORS header Access-Control-Allow-Origin MUST allow all origins.
@@ -830,7 +830,7 @@ Changes in APIs are inevitable. APIs should therefore always be versioned, facil
Statement
- A changelog MUST be publised for every API version.
+ A changelog MUST be published for every API version.
Rationale
@@ -849,7 +849,7 @@ Changes in APIs are inevitable. APIs should therefore always be versioned, facil
Rationale
- Version numbering MUST follow the Semantic Versioning [[SemVer]] model to prevent breaking changes when releasing new API versions. Release versions are formatted using the major.minor.patch template (examples: 1.0.2, 1.11.0). Pre-release versions MAY be denoted by appending a hyphen and a series of dot separated identifiers (examples: 1.0.2-rc.1, 2.0.0-beta.3). When releasing a new version which contains backwards-incompatible changes, a new major version MUST be released. Minor and patch releases MUST only contain backwards compatible changes (e.g. the addition of an endpoint or an optional attribute).
+ Version numbering MUST follow the Semantic Versioning [[SemVer]] model to prevent breaking changes when releasing new API versions. Release versions are formatted using the major.minor.patch template (examples: 1.0.2, 1.11.0). Pre-release versions MAY be denoted by appending a hyphen and a series of dot separated identifiers (examples: 1.0.2-rc.1, 2.0.0-beta.3). When releasing a new version which contains backwards-incompatible changes, a new major version MUST be released. Minor and patch releases MUST only contain backwards compatible changes (e.g. the addition of an endpoint or an optional attribute).
How to test
@@ -910,7 +910,7 @@ Note: security controls for signing and encrypting of application level messages
How to test
-
The usage of TLS is machine testable. Follow the latest NCSC guidelines on what is required to test. The serverside is what will be tested, only control over the server is assumed for testing. A testing client will be employed to test adherence of the server. Supporting any protocols, algorithms, key sizes, options or ciphers that are deemed insufficient or phased out by NCSC will lead to failure on the automated test. Both positive and negative scenarios are part of the test: testing that a subset of *Good* and *Sufficient* configurations are supported and configurations deemed *Insufficient* or marked for *Phase out*. A manual exception to the automated test results can be made when configurations designated for *Phase out* are supported; The API provider will have to provide clear documentation regarding the phase out schedule.
+
The usage of TLS is machine testable. Follow the latest NCSC guidelines on what is required to test. The server-side is what will be tested, only control over the server is assumed for testing. A testing client will be employed to test adherence of the server. Supporting any protocols, algorithms, key sizes, options or ciphers that are deemed insufficient or phased out by NCSC will lead to failure on the automated test. Both positive and negative scenarios are part of the test: testing that a subset of *Good* and *Sufficient* configurations are supported and configurations deemed *Insufficient* or marked for *Phase out*. A manual exception to the automated test results can be made when configurations designated for *Phase out* are supported; The API provider will have to provide clear documentation regarding the phase out schedule.
@@ -923,7 +923,7 @@ Note: security controls for signing and encrypting of application level messages
Sensitive information MUST NOT be part of URIs
The term sensitive is deliberately left undefined in this document.
-
In case of REST-API's for system to system communication on a closed network, this rule applies only when there is logging involved in systems that are not under control of the organizations involved in the exchange
+
In case of REST-API's for system to system communication on a closed network, this rule applies only when there is logging involved in systems that are not under control of the organisations involved in the exchange
Rationale
@@ -935,7 +935,7 @@ Note: security controls for signing and encrypting of application level messages
Be aware that queries (anything after the '?' in a URI) are also part of a URI.
For REST API's that are accessed directly from user devices, like web browsers, do not put client secrets used for authentication and other sensitive information in the URI. These are directly visible to users, are stored in the web browser's history and cache and can be bookmarked and sent to others.
-
For REST API's that are only used for system-to-system integration on closed networks where all systems are under control of the organizations involved in the exchange, do not put client secrets used for authentication in the URI and be careful to put sensitive information in the URI. Intermediate network components that terminate and newly initiate TLS could log or otherwise store URIs. Consider the consequences, advantages and disadvantages of using sensitive information in the URI and be deliberate about which information is logged, for which purposes and who has access.
+
For REST API's that are only used for system-to-system integration on closed networks where all systems are under control of the organisations involved in the exchange, do not put client secrets used for authentication in the URI and be careful to put sensitive information in the URI. Intermediate network components that terminate and newly initiate TLS could log or otherwise store URIs. Consider the consequences, advantages and disadvantages of using sensitive information in the URI and be deliberate about which information is logged, for which purposes and who has access.
@@ -965,7 +965,7 @@ For browser-based applications a subsection is included with additional details
System-to-system (sometimes called machine-to-machine) may have a need for the listed specifications as well.
Note that different usage patterns may be applicable in contexts with system-to-system clients, see above under Client Authentication.
-Realizations may rely on internal usage of HTTP-Headers.
+Realisations may rely on internal usage of HTTP-Headers.
Information for processing requests and responses can be passed between components, that can have security implications.
For instance, this is common practice between a reverse proxy or TLS-offloader and an application server.
Additional HTTP headers are used in such example to pass an original IP-address or client certificate.
@@ -1022,7 +1022,7 @@ For outbound filtering, the main concern is leaking of information.
-
The headers below are only intended to provide additional security when responses are rendered as HTML. As such, if the API will never return HTML in responses, then these headers may not be necessary. You SHOULD include the headers as part of a defense-in-depth approach if there is any uncertainty about the function of the headers, the types of information that the API returns or information it may return in the future.
+
The headers below are only intended to provide additional security when responses are rendered as HTML. As such, if the API will never return HTML in responses, then these headers may not be necessary. You SHOULD include the headers as part of a defence-in-depth approach if there is any uncertainty about the function of the headers, the types of information that the API returns or information it may return in the future.
@@ -1065,7 +1065,7 @@ For outbound filtering, the main concern is leaking of information.
Rationale
Different resources can have different uses, as some resources are publicly available whereas others are restricted to several domains.
- Modern web browsers use Cross-Origin Resource Sharing (CORS) to minimize the risk associated with cross-site HTTP-requests.
+ Modern web browsers use Cross-Origin Resource Sharing (CORS) to minimise the risk associated with cross-site HTTP-requests.
By default browsers only allow 'same origin' access to resources.
This means that responses on requests to another `[scheme]://[hostname]:[port]` than the `Origin` request header of the initial request will not be processed by the browser.
To enable cross-site requests APIs can return a `Access-Control-Allow-Origin` response header.
@@ -1094,8 +1094,8 @@ These applications can be split into three architectural patterns:
* JavaScript applications with a backend; with this class of applications, the backend is the confidential client and should intermediate any interaction, with tokens never ending up in the browser.
Effectively, these are not different from regular web-application for this security facet, even though they leverage JavaScript for implementation.
* JavaScript applications that share a domain with the API (resource server); these can leverage cookies marked as HTTP-Only, Secure and SameSite.
-* JavaScript applications without a backend; these clients are considered public clients, and are potentially more vulnerable to several types of attacks, including Cross-Site Scripting (XSS), Cross Site Request Forgery (CSRF) and OAuth token theft.
- In order to support these clients, the Cross-Origin Resource Sharing (CORS) policy mentioned above is critical and MUST be supported.
+* JavaScript applications without a backend; these clients are considered public clients, and are potentially more vulnerable to several types of attacks, including Cross-Site Scripting (XSS), Cross Site Request Forgery (CSRF) and OAuth token theft.
+ In order to support these clients, the Cross-Origin Resource Sharing (CORS) policy mentioned above is critical and MUST be supported.
### Validate content types
@@ -1103,7 +1103,7 @@ A REST request or response body SHOULD match the intended content type in the he
* Requests containing unexpected or missing content type headers MUST be rejected with HTTP response status `406 Not Acceptable` or `415 Unsupported Media Type`.
* Accidentally exposing unintended content types MUST be avoided by explicitly defining content types e.g. Jersey (Java) `@consumes("application/json"); @produces("application/json")`.
- This avoids XXE-attack vectors for example.
+ This avoids XML external entity injection attack vectors for example.
It is common for REST services to allow multiple response types (e.g. `application/xml` or `application/json`) in which case then the client specifies the preferred order of response types by the Accept header in the request.
@@ -1128,11 +1128,11 @@ The following modules are normative for all REST API's.
Rationale
- The [[[ADR-GEO]]] formalizes as set of rules regarding:
+ The [[[ADR-GEO]]] formalises as set of rules regarding:
How to encode geospatial data in request and response payloads.
How resource collections can be filtered by a given bounding box.
-
How to deal with different coordinate systems (CRS).
+
How to deal with different coordinate systems (CRS).
@@ -1150,7 +1150,7 @@ The following modules are normative for all REST API's.
Rationale
- The [[[ADR-signing]]] formalizes as set of rules regarding:
+ The [[[ADR-signing]]] formalises as set of rules regarding:
How to sign data in request and response payloads.
Which header to specify the signature.
@@ -1171,7 +1171,7 @@ The following modules are normative for all REST API's.
Rationale
- The [[[ADR-encryption]]] formalizes as set of rules regarding:
+ The [[[ADR-encryption]]] formalises as set of rules regarding:
How to encrypt data in request and response payloads.
The flow of operations between client and server.
diff --git a/sections/introduction.md b/sections/introduction.md
index 0d4ba158..9aaabe55 100644
--- a/sections/introduction.md
+++ b/sections/introduction.md
@@ -2,9 +2,9 @@
## Goal
-More and more governmental organizations offer REST APIs (henceforth abbreviated as APIs), in addition to existing interfaces like SOAP and WFS. These APIs aim to be developer-friendly and easy to implement. While this is a commendable aim, it does not shield a developer from a steep learning curve getting to know every new API, in particular when every individual API is designed using different patterns and conventions.
+More and more governmental organisations offer REST APIs (henceforth abbreviated as APIs), in addition to existing interfaces like SOAP and WFS. These APIs aim to be developer-friendly and easy to implement. While this is a commendable aim, it does not shield a developer from a steep learning curve getting to know every new API, in particular when every individual API is designed using different patterns and conventions.
-This document aims to describe a widely applicable set of design rules for the unambiguous provisioning of REST APIs. The primary goal is to offer guidance for organizations designing new APIs, with the purpose of increasing developer experience (DX) and interoperability between APIs. Hopefully, many organizations will adopt these design rules in their corporate API strategies and provide feedback about exceptions and additions to subsequently improve these design rules.
+This document aims to describe a widely applicable set of design rules for the unambiguous provisioning of REST APIs. The primary goal is to offer guidance for organisations designing new APIs, with the purpose of increasing developer experience (DX) and interoperability between APIs. Hopefully, many organisations will adopt these design rules in their corporate API strategies and provide feedback about exceptions and additions to subsequently improve these design rules.
## Status
@@ -20,6 +20,8 @@ This document is part of the *Nederlandse API Strategie*.
The Nederlandse API Strategie consists of [a set of distinct documents](https://developer.overheid.nl/communities/kennisplatform-apis/#api-strategie).
+
+
| Status | Description & Link |
|------------------|------------------------------------------------------------------------------------------------------------------|
| Informative | [Inleiding NL API Strategie](https://geonovum.github.io/KP-APIs/API-strategie-algemeen/Inleiding/) |
@@ -34,6 +36,8 @@ The Nederlandse API Strategie consists of [a set of distinct documents](https://
Before reading this document it is advised to gain knowledge of the informative documents, in particular the [Architecture](https://geonovum.github.io/KP-APIs/API-strategie-algemeen/Architectuur/).
+
+
An overview of all current documents is available in this Dutch infographic:
diff --git a/standaard.dic b/standaard.dic
new file mode 100644
index 00000000..eecc42a0
--- /dev/null
+++ b/standaard.dic
@@ -0,0 +1,33 @@
+32
+Aanbeveling
+backend
+camelCase
+CORS
+datetime
+json
+JWE
+JWS
+OAuth
+OAuth2
+OData
+offloader
+OGC
+openapi
+OpenAPI
+Ottowa
+OWASP
+parseable
+ReDoc
+REpresentational
+RESTful
+RPC
+SameSite
+Specref
+Strategie
+subresource
+URIs
+voor
+WebDAV
+WFS
+yaml
+YAML