changeset 1708:fee9895fa46e beta

changed API to match fully JSON-RPC specs
author Marcin Kuzminski <marcin@python-works.com>
date Mon, 21 Nov 2011 03:08:09 +0200
parents 54fda6ce9e98
children 5ca2a5e96793
files docs/api/api.rst rhodecode/controllers/api/__init__.py
diffstat 2 files changed, 13 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/docs/api/api.rst	Mon Nov 21 02:53:17 2011 +0200
+++ b/docs/api/api.rst	Mon Nov 21 03:08:09 2011 +0200
@@ -11,18 +11,20 @@
 <your_server>/_admin/api
 
 
-All clients need to send JSON data in such format::
+All clients are required to send JSON-RPC spec JSON data::
 
-    {
+    {   
+        "id:<id>,
         "api_key":"<api_key>",
         "method":"<method_name>",
         "args":{"<arg_key>":"<arg_val>"}
     }
 
 Example call for autopulling remotes repos using curl::
-    curl https://server.com/_admin/api -X POST -H 'content-type:text/plain' --data-binary '{"api_key":"xe7cdb2v278e4evbdf5vs04v832v0efvcbcve4a3","method":"pull","args":{"repo":"CPython"}}'
+    curl https://server.com/_admin/api -X POST -H 'content-type:text/plain' --data-binary '{"id":1,"api_key":"xe7cdb2v278e4evbdf5vs04v832v0efvcbcve4a3","method":"pull","args":{"repo":"CPython"}}'
 
 Simply provide
+ - *id* A value of any type, which is used to match the response with the request that it is replying to.
  - *api_key* for access and permission validation.
  - *method* is name of method to call
  - *args* is an key:value list of arguments to pass to method
@@ -32,9 +34,10 @@
     api_key can be found in your user account page
 
 
-RhodeCode API will return always a JSON formatted answer::
+RhodeCode API will return always a JSON-RPC response::
 
-    {
+    {   
+        "id":<id>,
         "result": "<result>",
         "error": null
     }
--- a/rhodecode/controllers/api/__init__.py	Mon Nov 21 02:53:17 2011 +0200
+++ b/rhodecode/controllers/api/__init__.py	Mon Nov 21 03:08:09 2011 +0200
@@ -50,6 +50,7 @@
 
     def __init__(self, message):
         self.message = message
+        super(JSONRPCError, self).__init__()
 
     def __str__(self):
         return str(self.message)
@@ -60,7 +61,7 @@
     Generate a Response object with a JSON-RPC error body
     """
     from pylons.controllers.util import Response
-    resp = Response(body=json.dumps(dict(result=None, error=message)),
+    resp = Response(body=json.dumps(dict(id=None, result=None, error=message)),
                     status=code,
                     content_type='application/json')
     return resp
@@ -117,6 +118,7 @@
         # check AUTH based on API KEY
         try:
             self._req_api_key = json_body['api_key']
+            self._req_id = json_body['id']
             self._req_method = json_body['method']
             self._req_params = json_body['args']
             log.debug('method: %s, params: %s',
@@ -220,7 +222,8 @@
         if self._error is not None:
             raw_response = None
 
-        response = dict(result=raw_response, error=self._error)
+        response = dict(id=self._req_id, result=raw_response,
+                        error=self._error)
 
         try:
             return json.dumps(response)