diff options
Diffstat (limited to 'docs/api')
-rw-r--r-- | docs/api/rest.rst | 194 | ||||
-rw-r--r-- | docs/api/xmlrpc.rst | 64 |
2 files changed, 258 insertions, 0 deletions
diff --git a/docs/api/rest.rst b/docs/api/rest.rst new file mode 100644 index 0000000..75e31f6 --- /dev/null +++ b/docs/api/rest.rst @@ -0,0 +1,194 @@ +The REST API +============ + +Patchwork provides a REST API. This API can be used to retrieve and modify +information about patches, projects and more. + +This guide provides an overview of how one can interact with the REST API. For +detailed information on type and response format of the various resources +exposed by the API, refer to the web browsable API. This can be found at: + + https://patchwork.example.com/api/1.0/ + +where `patchwork.example.com` refers to the URL of your Patchwork instance. + +.. important:: + + The REST API can be enabled/disabled by the administrator: it may not be + available in every instance. Refer to ``/about`` on your given instance for + the status of the API, e.g. + + https://patchwork.ozlabs.org/about + +.. versionadded:: 2.0 + + The REST API was introduced in Patchwork v2.0. Users of earlier Patchwork + versions should instead refer to :doc:`XML-RPC API <xmlrpc>` documentation. + +Getting Started +--------------- + +The easiest way to start experimenting with the API is to use the web browsable +API, as described above. + +REST APIs run over plain HTTP(S), thus, the API can be interfaced using +applications or libraries that support this widespread protocol. One such +application is `curl`_, which can be used to both retrieve and send information +to the REST API. For example, to get the version of the REST API for a +Patchwork instance hosted at `patchwork.example.com`, run: + +.. code-block:: shell + + $ curl -s 'https://patchwork.example.com/api/1.0/' | python -m json.tool + { + "bundles": "https://patchwork.example.com/api/1.0/bundles/", + "covers": "https://patchwork.example.com/api/1.0/covers/", + "events": "https://patchwork.example.com/api/1.0/events/", + "patches": "https://patchwork.example.com/api/1.0/patches/", + "people": "https://patchwork.example.com/api/1.0/people/", + "projects": "https://patchwork.example.com/api/1.0/projects/", + "series": "https://patchwork.example.com/api/1.0/series/", + "users": "https://patchwork.example.com/api/1.0/users/" + } + + +In addition, a huge variety of libraries are available for interacting with and +parsing the output of REST APIs. The `requests`_ library is wide-spread and +well-supported. To repeat the above example using `requests`:, run + +.. code-block:: pycon + + $ python + >>> import json + >>> import requests + >>> r = requests.get('https://patchwork.example.com/api/1.0/') + >>> print(json.dumps(r.json(), indent=2)) + { + "bundles": "https://patchwork.example.com/api/1.0/bundles/", + "covers": "https://patchwork.example.com/api/1.0/covers/", + "events": "https://patchwork.example.com/api/1.0/events/", + "patches": "https://patchwork.example.com/api/1.0/patches/", + "people": "https://patchwork.example.com/api/1.0/people/", + "projects": "https://patchwork.example.com/api/1.0/projects/", + "series": "https://patchwork.example.com/api/1.0/series/", + "users": "https://patchwork.example.com/api/1.0/users/" + } + +Tools like `curl` and libraries like `requests` can be used to build anything +from small utilities to full-fledged clients targeting the REST API. For an +overview of existing API clients, refer to :doc:`../usage/clients`. + +.. tip:: + + While you can do a lot with existing installations, it's possible that you + might not have access to all resources or may not wish to modify any + existing resources. In this case, it might be better to :doc:`deploy your + own instance of Patchwork locally <../development/installation>` and + experiment with that instead. + +Schema +------ + +Responses are returned as JSON. Blank fields are returned as ``null``, rather +than being omitted. Timestamps use the ISO 8601 format:: + + YYYY-MM-DDTHH:MM:SSZ + +Requests should use either query parameters or form-data, depending on the +method. Further information is provided `below <rest_parameters>`__. + +Summary Representations +~~~~~~~~~~~~~~~~~~~~~~~ + +Some resources are particularly large or expensive to compute. When listing +these resources, a summary representation is returned that omits certain +fields. To get all fields, fetch the detailed representation. For example, +listing patches will return summary representations for each patch: + +.. code-block:: http + + GET /patches HTTP/1.1 + +Detailed Representations +~~~~~~~~~~~~~~~~~~~~~~~~ + +When fetching an individual resource, all fields will be returned. For example, +fetching a patch with an ID of ``123`` will return all available fields for +that particular resource: + +.. code-block:: http + + GET /patches/123 HTTP/1.1 + +.. _rest_parameters: + +Parameters +---------- + +Most API methods take optional parameters. For ``GET`` requests, these +parameters are mostly used for filtering and should be passed as a HTTP query +string parameters: + +.. code-block:: shell + + $ curl 'https://patchwork.example.com/api/patches?state=under-review' + +For all other types of requests, including ``POST`` and ``PATCH``, these +parameters should be passed as form-encoded data: + +.. code-block:: shell + + $ curl -X POST -F 'state=under-review' \ + 'https://patchwork.example.com/api/patches/123' + +Authentication +-------------- + +Patchwork only supports basic authentication: + +.. code-block:: shell + + $ curl -u username:password 'https://patchwork.example.com/api/' + +Not all resources require authentication. Those that do will return ``404 Not +Found`` if authentication is not provided to avoid leaking information. + +Pagination +---------- + +Requests that return multiple items will be paginated by 30 items by default, +though this can vary from instance to instance. You can change page using the +``?page`` parameter. You can also set custom page sizes up to 100 on most +endpoints using the ``?per_page`` parameter. + +.. code-block:: shell + + $ curl 'https://patchwork.example.com/api/patches?page=2&per_page=100' + +Link Header +~~~~~~~~~~~ + +The `Link header`_ includes pagination information:: + + Link: <https://patchwork.example.com/api/patches?page=3&per_page=100>; rel="next", + <https://patchwork.example.com/api/patches?page=50&per_page=100>; rel="last" + +The possible ``rel`` values are: + +.. list-table:: + :header-rows: 1 + + * - Name + - Description + * - ``next`` + - The link relation for the immediate next page of results. + * - ``last`` + - The link relation for the last page of results. + * - ``first`` + - The link relation for the first page of results. + * - ``prev`` + - The link relation for the immediate previous page of results. + +.. _curl: https://curl.haxx.se/ +.. _requests: http://docs.python-requests.org/en/master/ +.. _Link header: https://tools.ietf.org/html/rfc5988 diff --git a/docs/api/xmlrpc.rst b/docs/api/xmlrpc.rst new file mode 100644 index 0000000..374df96 --- /dev/null +++ b/docs/api/xmlrpc.rst @@ -0,0 +1,64 @@ +The XML-RPC API +=============== + +Patchwork provides an XML-RPC API. This API can be used to be used to retrieve +and modify information about patches, projects and more. + +.. important:: + + The XML-RPC API can be enabled/disabled by the administrator: it may not be + available in every instance. Refer to ``/about`` on your given instance for + the status of the API, e.g. + + https://patchwork.ozlabs.org/about + + Alternatively, simply attempt to make a request to the API. + +.. deprecated:: 2.0 + + The XML-RPC API is a legacy API and has been deprecated in favour of the + :doc:`REST API <rest>`. It will be removed in Patchwork 3.0. + +Getting Started +--------------- + +The Patchwork XML-RPC API provides a number of "methods". Some methods require +authentication (via HTTP Basic Auth) while others do not. Authentication uses +your Patchwork account and the on-server documentation will indicate where it +is necessary. We will only cover the unauthenticated method here for brevity - +consult the `xmlrpclib`_ documentation for more detailed examples: + +To interact with the Patchwork XML-RPC API, a XML-RPC library should be used. +Python provides such a library - `xmlrpclib`_ - in its standard library. For +example, to get the version of the XML-RPC API for a Patchwork instance hosted +at `patchwork.example.com`, run: + +.. code-block:: pycon + + $ python + >>> import xmlrpclib # or 'xmlrpc.client' for Python 3 + >>> rpc = xmlrpclib.ServerProxy('http://patchwork.example.com/xmlrpc/') + >>> rpc.pw_rpc_version() + 1.1 + +Once connected, the ``rpc`` object will be populated with a list of available +functions (or procedures, in RPC terminology). In the above example, we used +the ``pw_rpc_version`` method, however, it should be possible to use all the +methods listed in the server documentation. + +Further Information +------------------- + +Patchwork provides automatically generated documentation for the XML-RPC API. +You can find this at the following URL: + + https://patchwork.example.com/xmlrpc/ + +where `patchwork.example.com` refers to the URL of your Patchwork instance. + +.. versionchanged:: 1.1 + + Automatic documentation generation for the Patchwork API was introduced in + Patchwork v1.1. Prior versions of Patchwork do not offer this functionality. + +.. _xmlrpclib: https://docs.python.org/2/library/xmlrpclib.html |