Skip to content

AEP-0131 Linter Rules

Get methods- No HTTP body

Get methods: No HTTP body

This rule enforces that all Get RPCs omit the HTTP body, as mandated in AEP-131.

Details

This rule looks at any message matching beginning with Get, and complains if the HTTP body field is set.

Examples

Incorrect code for this rule:

// Incorrect.
rpc GetBook(GetBookRequest) returns (Book) {
option (google.api.http) = {
get: "/v1/{path=publishers/*/books/*}"
body: "*" // This should be absent.
};
}

Correct code for this rule:

// Correct.
rpc GetBook(GetBookRequest) returns (Book) {
option (google.api.http) = {
get: "/v1/{path=publishers/*/books/*}"
};
}

Disabling

If you need to violate this rule, use a leading comment above the method. Remember to also include an aep.dev/not-precedent comment explaining why.

// (-- api-linter: core::0131::http-body=disabled
// api-linter: core::0131::http-method=disabled
// aep.dev/not-precedent: We need to do this because reasons. --)
rpc GetBook(GetBookRequest) returns (Book) {
option (google.api.http) = {
post: "/v1/{path=publishers/*/books/*}"
body: "*"
};
}

Important: HTTP GET requests are unable to have an HTTP body, due to the nature of the protocol. The only valid way to include a body is to also use a different HTTP method (as depicted above).

If you need to violate this rule for an entire file, place the comment at the top of the file.

Get methods- GET HTTP verb

Get methods: GET HTTP verb

This rule enforces that all Get RPCs use the GET HTTP verb, as mandated in AEP-131.

Details

This rule looks at any message matching beginning with Get, and complains if the HTTP verb is anything other than GET. It does check additional bindings if they are present.

Examples

Incorrect code for this rule:

// Incorrect.
rpc GetBook(GetBookRequest) returns (Book) {
option (google.api.http) = {
post: "/v1/{path=publishers/*/books/*}" // Should be `get:`.
};
}

Correct code for this rule:

// Correct.
rpc GetBook(GetBookRequest) returns (Book) {
option (google.api.http) = {
get: "/v1/{path=publishers/*/books/*}"
};
}

Disabling

If you need to violate this rule, use a leading comment above the method. Remember to also include an aep.dev/not-precedent comment explaining why.

// (-- api-linter: core::0131::http-method=disabled
// aep.dev/not-precedent: We need to do this because reasons. --)
rpc GetBook(GetBookRequest) returns (Book) {
option (google.api.http) = {
post: "/v1/{path=publishers/*/books/*}"
};
}

If you need to violate this rule for an entire file, place the comment at the top of the file.

Get methods- HTTP URI path field

Get methods: HTTP URI path field

This rule enforces that all Get RPCs map the path field to the HTTP URI, as mandated in AEP-131.

Details

This rule looks at any message matching beginning with Get, and complains if the path variable is not included in the URI. It does check additional bindings if they are present.

Examples

Incorrect code for this rule:

// Incorrect.
rpc GetBook(GetBookRequest) returns (Book) {
option (google.api.http) = {
get: "/v1/publishers/*/books/*" // The `path` field should be extracted.
};
}

Correct code for this rule:

// Correct.
rpc GetBook(GetBookRequest) returns (Book) {
option (google.api.http) = {
get: "/v1/{path=publishers/*/books/*}"
};
}

Disabling

If you need to violate this rule, use a leading comment above the method. Remember to also include an aep.dev/not-precedent comment explaining why.

// (-- api-linter: core::0131::http-uri-path=disabled
// aep.dev/not-precedent: We need to do this because reasons. --)
rpc GetBook(GetBookRequest) returns (Book) {
option (google.api.http) = {
get: "/v1/publishers/*/books/*"
};
}

If you need to violate this rule for an entire file, place the comment at the top of the file.

Get methods- Method signature

Get methods: Method signature

This rule enforces that all Get standard methods have a google.api.method_signature annotation with a value of "path", as mandated in AEP-131.

Details

This rule looks at any method beginning with Get, and complains if the google.api.method_signature annotation is missing, or if it is set to any value other than "path". Additional method signatures, if present, are ignored.

Examples

Incorrect code for this rule:

// Incorrect.
rpc GetBook(GetBookRequest) returns (Book) {
// A google.api.method_signature annotation should be present.
}
// Incorrect.
rpc GetBook(GetBookRequest) returns (Book) {
option (google.api.method_signature) = "book"; // Should be "path".
}

Correct code for this rule:

// Correct.
rpc GetBook(GetBookRequest) returns (Book) {
option (google.api.method_signature) = "path";
}

Disabling

If you need to violate this rule, use a leading comment above the method. Remember to also include an aep.dev/not-precedent comment explaining why.

// (-- api-linter: core::0131::method-signature=disabled
// aep.dev/not-precedent: We need to do this because reasons. --)
rpc GetBook(GetBookRequest) returns (Book);

If you need to violate this rule for an entire file, place the comment at the top of the file.

Get methods- Request message

Get methods: Request message

This rule enforces that all Get RPCs have a request message name of Get*Request, as mandated in AEP-131.

Details

This rule looks at any message matching beginning with Get, and complains if the name of the corresponding input message does not match the name of the RPC with the suffix Request appended.

Examples

Incorrect code for this rule:

// Incorrect.
rpc GetBook(GetBookReq) returns (Book) { // Should be `GetBookRequest`.
option (google.api.http) = {
get: "/v1/{path=publishers/*/books/*}"
};
}

Correct code for this rule:

// Correct.
rpc GetBook(GetBookRequest) returns (Book) {
option (google.api.http) = {
get: "/v1/{path=publishers/*/books/*}"
};
}

Disabling

If you need to violate this rule, use a leading comment above the method. Remember to also include an aep.dev/not-precedent comment explaining why.

// (-- api-linter: core::0131::request-message-name=disabled
// aep.dev/not-precedent: We need to do this because reasons. --)
rpc GetBook(GetBookReq) returns (Book) {
option (google.api.http) = {
get: "/v1/{path=publishers/*/books/*}"
};
}

If you need to violate this rule for an entire file, place the comment at the top of the file.

Get methods- Field behavior

Get methods: Field behavior

This rule enforces that all Get standard methods have google.api.field_behavior set to REQUIRED on their string path field, as mandated in AEP-131.

Details

This rule looks at any message matching Get*Request and complains if the path field does not have a google.api.field_behavior annotation with a value of REQUIRED.

Examples

Incorrect code for this rule:

// Incorrect.
message GetBookRequest {
// The `google.api.field_behavior` annotation should also be included.
string path = 1 [(google.api.resource_reference) = {
type: "library.googleapis.com/Book"
}];
}

Correct code for this rule:

// Correct.
message GetBookRequest {
string path = 1 [
(google.api.field_behavior) = REQUIRED,
(google.api.resource_reference).type = "library.googleapis.com/Book"
];
}

Disabling

If you need to violate this rule, use a leading comment above the field. Remember to also include an aep.dev/not-precedent comment explaining why.

message GetBookRequest {
// (-- api-linter: core::0131::request-path-behavior=disabled
// aep.dev/not-precedent: We need to do this because reasons. --)
string path = 1 [(google.api.resource_reference) = {
type: "library.googleapis.com/Book"
}];
}

If you need to violate this rule for an entire file, place the comment at the top of the file.

Get methods- Name field

Get methods: Name field

This rule enforces that all Get standard methods have a string path field in the request message, as mandated in AEP-131.

Details

This rule looks at any message matching Get*Request and complains if the path field type is not string.

Examples

Incorrect code for this rule:

// Incorrect.
message GetBookRequest {
bytes path = 1; // Field type should be `string`.
}

Correct code for this rule:

// Correct.
message GetBookRequest {
string path = 1;
}

Disabling

If you need to violate this rule, use a leading comment above the field. Remember to also include an aep.dev/not-precedent comment explaining why.

message GetBookRequest {
// (-- api-linter: core::0131::request-path-field=disabled
// aep.dev/not-precedent: This uses `bytes` for historical reasons. --)
bytes path = 1;
}

If you need to violate this rule for an entire file, place the comment at the top of the file.

Get methods- Resource reference

Get methods: Resource reference

This rule enforces that the google.api.resource_reference on the path field of a Get RPC request message uses type, not child_type, as suggested in AEP-131.

Details

This rule looks at the google.api.resource_reference annotation on the path field of any message matching Get*Request and complains if it does not use a direct type reference.

Examples

Incorrect code for this rule:

// Incorrect.
message GetBookRequest {
// The `google.api.resource_reference` annotation should be a direct `type`
// reference.
string path = 1 [
(google.api.field_behavior) = REQUIRED,
(google.api.resource_reference).child_type = "library.googleapis.com/Book"
];
}

Correct code for this rule:

// Correct.
message GetBookRequest {
string path = 1 [
(google.api.field_behavior) = REQUIRED,
(google.api.resource_reference).type = "library.googleapis.com/Book"
];
}

Disabling

If you need to violate this rule, use a leading comment above the field. Remember to also include an aep.dev/not-precedent comment explaining why.

message GetBookRequest {
// (-- api-linter: core::0131::request-path-reference-type=disabled
// aep.dev/not-precedent: We need to do this because reasons. --)
string path = 1 [
(google.api.field_behavior) = REQUIRED,
(google.api.resource_reference).child_type = "library.googleapis.com/Book"
];
}

If you need to violate this rule for an entire file, place the comment at the top of the file.

Get methods- Resource reference

Get methods: Resource reference

This rule enforces that all Get standard methods have google.api.resource_reference on their string path field, as mandated in AEP-131.

Details

This rule looks at the path field of any message matching Get*Request and complains if it does not have a google.api.resource_reference annotation.

Examples

Incorrect code for this rule:

// Incorrect.
message GetBookRequest {
// The `google.api.resource_reference` annotation should also be included.
string path = 1 [(google.api.field_behavior) = REQUIRED];
}

Correct code for this rule:

// Correct.
message GetBookRequest {
string path = 1 [
(google.api.field_behavior) = REQUIRED,
(google.api.resource_reference).type = "library.googleapis.com/Book"
];
}

Disabling

If you need to violate this rule, use a leading comment above the field. Remember to also include an aep.dev/not-precedent comment explaining why.

message GetBookRequest {
// (-- api-linter: core::0131::request-path-reference=disabled
// aep.dev/not-precedent: We need to do this because reasons. --)
string path = 1 [(google.api.field_behavior) = REQUIRED];
}

If you need to violate this rule for an entire file, place the comment at the top of the file.

Get methods- Name field

Get methods: Name field

This rule enforces that all Get standard methods have a string path field in the request message, as mandated in AEP-131.

Details

This rule looks at any message matching Get*Request and complains if the path field is missing.

Examples

Incorrect code for this rule:

// Incorrect.
message GetBookRequest {
string book = 1 [ // Field path should be `path`.
(google.api.field_behavior) = REQUIRED,
(google.api.resource_reference).type = "library.googleapis.com/Book"
];
}

Correct code for this rule:

// Correct.
message GetBookRequest {
string path = 1 [
(google.api.field_behavior) = REQUIRED,
(google.api.resource_reference).type = "library.googleapis.com/Book"
];
}

Disabling

If you need to violate this rule, use a leading comment above the message. Remember to also include an aep.dev/not-precedent comment explaining why.

// (-- api-linter: core::0131::request-path-required=disabled
// aep.dev/not-precedent: This is named "book" for historical reasons. --)
message GetBookRequest {
string book = 1 [
(google.api.field_behavior) = REQUIRED,
(google.api.resource_reference).type = "library.googleapis.com/Book"
];
}

If you need to violate this rule for an entire file, place the comment at the top of the file.

Get methods- Required fields

Get methods: Required fields

This rule enforces that all Get standard methods do not have unexpected required fields, as mandated in AEP-131.

Details

This rule looks at any message matching Get*Request and complains if it comes across any required fields other than:

Examples

Incorrect code for this rule:

// Incorrect.
message GetBookRequest {
// The path of the book to retrieve.
// Format: publishers/{publisher}/books/{book}
string path = 1 [
(google.api.field_behavior) = REQUIRED,
(google.api.resource_reference) = {
type: "library.googleapis.com/Book"
}];
// Non-standard required field.
google.protobuf.FieldMask read_mask = 2 [(google.api.field_behavior) = REQUIRED];
}

Correct code for this rule:

// Correct.
message GetBookRequest {
// The path of the book to retrieve.
// Format: publishers/{publisher}/books/{book}
string path = 1 [
(google.api.field_behavior) = REQUIRED,
(google.api.resource_reference) = {
type: "library.googleapis.com/Book"
}];
google.protobuf.FieldMask read_mask = 2 [(google.api.field_behavior) = OPTIONAL];
}

Disabling

If you need to violate this rule, use a leading comment above the field. Remember to also include an aep.dev/not-precedent comment explaining why.

message GetBookRequest {
// The path of the book to retrieve.
// Format: publishers/{publisher}/books/{book}
string path = 1 [
(google.api.field_behavior) = REQUIRED,
(google.api.resource_reference) = {
type: "library.googleapis.com/Book"
}];
// (-- api-linter: core::0131::request-required-fields=disabled
// aep.dev/not-precedent: We really need this field to be required because
// reasons. --)
google.protobuf.FieldMask read_mask = 2 [(google.api.field_behavior) = REQUIRED];
}

If you need to violate this rule for an entire file, place the comment at the top of the file.

Get methods- Unknown fields

Get methods: Unknown fields

This rule enforces that all Get standard methods do not have unexpected fields, as mandated in AEP-131.

Details

This rule looks at any message matching Get*Request and complains if it comes across any fields other than:

Examples

Incorrect code for this rule:

// Incorrect.
message GetBookRequest {
string path = 1;
string library_id = 2; // Non-standard field.
}

Correct code for this rule:

// Correct.
message GetBookRequest {
string path = 1;
}

Disabling

If you need to violate this rule, use a leading comment above the field. Remember to also include an aep.dev/not-precedent comment explaining why.

message GetBookRequest {
string path = 1;
// (-- api-linter: core::0131::request-unknown-fields=disabled
// aep.dev/not-precedent: We really need this field because reasons. --)
string library_id = 2;
}

If you need to violate this rule for an entire file, place the comment at the top of the file.

Get methods- Response message

Get methods: Response message

This rule enforces that all Get RPCs have a response message of the resource, as mandated in AEP-131.

Details

This rule looks at any message matching beginning with Get, and complains if the name of the corresponding output message does not match the name of the RPC with the prefix Get removed.

Examples

Incorrect code for this rule:

// Incorrect.
rpc GetBook(GetBookRequest) returns (GetBookResponse) { // Should be `Book`.
option (google.api.http) = {
get: "/v1/{path=publishers/*/books/*}"
};
}

Correct code for this rule:

// Correct.
rpc GetBook(GetBookRequest) returns (Book) {
option (google.api.http) = {
get: "/v1/{path=publishers/*/books/*}"
};
}

Disabling

If you need to violate this rule, use a leading comment above the method. Remember to also include an aep.dev/not-precedent comment explaining why.

// (-- api-linter: core::0131::response-message-path=disabled
// aep.dev/not-precedent: We need to do this because reasons. --)
rpc GetBook(GetBookRequest) returns (GetBookResponse) {
option (google.api.http) = {
get: "/v1/{path=publishers/*/books/*}"
};
}

If you need to violate this rule for an entire file, place the comment at the top of the file.

Get methods- Synonym check

Get methods: Synonym check

This rule enforces that single-resource lookup methods have names starting with Get, as mandated in AEP-131.

Details

This rule looks at any message with names similar to Get, and suggests using Get instead. It complains if it sees the following synonyms:

  • Acquire
  • Fetch
  • Lookup
  • Read
  • Retrieve

Examples

Incorrect code for this rule:

// Incorrect.
rpc FetchBook(FetchBookRequest) returns (Book) { // Should be `GetBook`.
option (google.api.http) = {
get: "/v1/{path=publishers/*/books/*}"
};
}

Correct code for this rule:

// Correct.
rpc GetBook(GetBookRequest) returns (Book) {
option (google.api.http) = {
get: "/v1/{path=publishers/*/books/*}"
};
}

Disabling

If you need to violate this rule, use a leading comment above the method. Remember to also include an aep.dev/not-precedent comment explaining why.

// (-- api-linter: core::0131::synonyms=disabled
// aep.dev/not-precedent: We need to do this because reasons. --)
rpc FetchBook(GetBookReq) returns (Book) {
option (google.api.http) = {
get: "/v1/{path=publishers/*/books/*}"
};
}

If you need to violate this rule for an entire file, place the comment at the top of the file.