|  | == HTTP Paths | 
|  |  | 
|  | Where possible, each v2 API is given an HTTP path that reflects the resource type and/or name most relevant to its functionality. | 
|  | Resource types are typically plural nouns such as "aliases", "collections", and "shards". | 
|  | Resource names are (typically user-provided) identifiers such as "myAlias", "techproducts", and "shard1". | 
|  | For example, `/api/collections` is the HTTP path used for all APIs concerned with collections generally, but that don't involve any one specific collection (e.g. listing all collections). | 
|  | APIs that concern themselves with a specific collection use the HTTP path `/api/collections/someCollectionName`. | 
|  |  | 
|  |  | 
|  | Resource types and names are arranged in the HTTP path such that each path segment is more specific, or "narrower", than the segment that came before. | 
|  | This "narrowing" also extends to resources that have an "is part of" or "contains" relationship to one another. | 
|  | In these cases all relevant resources and their types are included in the path, with the "contained" or "child" resource following its "parent". | 
|  | For example, since replicas always belong to a shard, and shards always belong to a collection, most v2 APIs pertaining to a specific replica use the HTTP path: `/api/collections/specificCollectionName/shards/specificShardName/replicas/specificReplicaName`. | 
|  |  | 
|  | Following these guidelines has given us the following (non-exhaustive) list of v2 API paths, provided here to give a good sense of the paths currently in use and the logic underlying them. | 
|  | * `/api/aliases` | 
|  | * `/api/aliases/specificAliasName` | 
|  | * `/api/aliases/specificAliasName/properties` | 
|  | * `/api/aliases/specificAliasName/properties/specificPropertyName` | 
|  | * `/api/backups/specificBackupName` | 
|  | * `/api/backups/specificBackupName/versions` | 
|  | * `/api/backups/specificBackupName/versions/specificVersion` | 
|  | * `/api/cluster/nodes/specificNodeName/roles` | 
|  | * `/api/cluster/nodes/specificNodeName/roles/specificRoleName` | 
|  | * `/api/cluster/properties` | 
|  | * `/api/cluster/properties/specificPropertyName` | 
|  | * `/api/collections` | 
|  | * `/api/collections/specificCollName` | 
|  | * `/api/collections/specificCollName/properties` | 
|  | * `/api/collections/specificCollName/properties/specificPropertyName` | 
|  | * `/api/collections/specificcollName/shards` | 
|  | * `/api/collections/specificCollName/shards/specificShardName` | 
|  | * `/api/collections/specificCollName/shards/specificShardName/replicas` | 
|  | * `/api/collections/specificCollName/shards/specificShardName/replicas/specificReplicaName` | 
|  | * `/api/collections/specificCollName/shards/specificShardName/replicas/specificReplicaName/properties` | 
|  | * `/api/collections/specificCollName/shards/specificShardName/replicas/specificReplicaName/properties/specificPropertyName` | 
|  | * `/api/configsets` | 
|  | * `/api/configsets/specificConfigsetName` | 
|  | * `/api/cores` | 
|  | * `/api/cores/specificCoreName` | 
|  | * `/api/node` | 
|  |  | 
|  | === Unproxied APIs | 
|  |  | 
|  | The last entry on the list above, `/api/node`, exhibits a bit of a special case. | 
|  | SolrCloud handles most requests as a distributed system, i.e. any request can be made to any node in the cluster and Solr will proxy or route the request internally in order to serve a response. | 
|  | But not all APIs work this way- some functionality is designed to only return data from the receiving node, such as `/api/node/key` which returns a cryptographic key specific to the receiving node. | 
|  | Solr will not proxy these requests. | 
|  | To represent this distinction the API design uses the idiosyncratic path `/api/node`, to help distinguish these from other node-related APIs. | 
|  |  | 
|  | == HTTP Methods | 
|  |  | 
|  | Where possible, HTTP methods (colloquially called 'verbs') are used semantically to distinguish between APIs available at the same path. | 
|  | For example, the API to delete a collection uses the `DELETE` HTTP method, as in `DELETE /api/collections/specificCollectionName`. | 
|  | The API to modify the collection uses the `PUT` HTTP method, as in `PUT /api/collections/specificCollectionName`. | 
|  |  | 
|  | While the best effort is made to use HTTP methods semantically, the v2 API currently restricts itself to the better known HTTP methods: `GET`, `POST`, `PUT`, and `DELETE`. | 
|  | In some situations this leads us to eschew a more semantically appropriate verb due to its relative obscurity. | 
|  | The most significant example of this is the HTTP method `PATCH`, which according to the HTTP spec is used to indicate a partial update (i.e. a resource modification request which only provides the part to-be-modified). | 
|  | Solr's "modify collection" functionality uses partial update semantics, but the v2 API uses `PUT` instead of `PATCH` due to the relative obscurity of the latter. | 
|  |  | 
|  | For use within the v2 API, the four "popular" HTTP methods have the following semantics and implications: | 
|  |  | 
|  | * `GET` - used for non-mutating (i.e. "read only") requests. Most often used to list elements of a particular resource type, or fetch information about about a specific named resource. | 
|  | * `POST` - used for non-idempotent resource modifications. | 
|  | * `PUT` - used for idempotent resource modifications. | 
|  | * `DELETE` - Used to delete or cleanup resource | 
|  |  | 
|  | == Exceptional Cases - "Command" APIs | 
|  |  | 
|  | The pairing of semantic HTTP verbs and "resource"-based paths gives Solr an intuitive pattern for representing many operations, but not all. | 
|  | Many Solr APIs cover complex operations that don't map cleanly to an HTTP verb. | 
|  | Often these operations were initially conceived of as procedural "commands" and as such are hard to fit into the v2 APIs resource-first model. | 
|  |  | 
|  | Solr's v2 API currently accommodates these "command" APIs by appending the command name (often a verb like "unload", "reload", or "split") onto the otherwise "resource"-based path. | 
|  | For example: Solr's core "unload" command uses the API `POST /api/cores/specificCoreName/unload`. |