API: Difference between revisions

From Noisebridge
Jump to navigation Jump to search
No edit summary
(modified curl command cf --resolve arg)
 
(5 intermediate revisions by 2 users not shown)
Line 15: Line 15:
For instance, to open the door using curl:
For instance, to open the door using curl:


<source lang="bash">   curl -X POST -d open=True http://api.noisebridge.net/gate/</source>
<source lang="bash">
    curl -X POST -d open=True http://api.noisebridge.net/gate/
 
    alternatively:
 
    curl --resolve 'api.noisebridge.net:80:172.30.0.4' -X POST -d open=True http://api.noisebridge.net/gate/
</source>
=== GET /hello/[name] ===
=== GET /hello/[name] ===


Line 59: Line 65:
Suppose you have a doorcode 8499146, and you'd like to give a friend a new doorcode. She asks if she can have the number '7895473'
Suppose you have a doorcode 8499146, and you'd like to give a friend a new doorcode. She asks if she can have the number '7895473'


<source lang="bash">curl -v -X POST -d create=True -d preferred=7895473 -d comment=&quot;I'm Dara, my email is newperson@example.com&quot; http://localhost:8080/gate/key/8499146</source>
<source lang="bash">
would return something like this: <tt>&gt; POST /gate/key/8499146 HTTP/1.1 &gt; User-Agent: curl/7.26.0 &gt; Host: localhost:8080 &gt; Accept: */* &gt; Content-Length: 29 &gt; Content-Type: application/x-www-form-urlencoded &gt;  * upload completely sent off: 29 out of 29 bytes * additional stuff not fine transfer.c:1037: 0 0 * HTTP 1.0, assume close after body &lt; HTTP/1.0 303 See Other &lt; Date: Mon, 05 Nov 2012 05:07:29 GMT &lt; localhost - - [04/Nov/2012 21:07:29] &quot;POST /gate/key/8499146 HTTP/1.1&quot; 303 0 Server: WSGIServer/0.1 Python/2.7.3rc2 &lt; Content-Length: 0 &lt; Content-Type: text/html; charset=UTF-8 &lt; Location: http://localhost:8080/gate/key/7895473 &lt;  * Closing connection #0</tt>
curl -v -X POST -d create=True -d preferred=7895473 \
    -d comment=&quot;I'm Dara, my email is new@example.com&quot; http://localhost:8080/gate/key/8499146
</source>
would return something like this:


<pre class="text">
&gt; POST /gate/key/8499146 HTTP/1.1
&gt; User-Agent: curl/7.26.0
&gt; Host: localhost:8080
&gt; Accept: */*
&gt; Content-Length: 29
&gt; Content-Type: application/x-www-form-urlencoded
&gt;
* upload completely sent off: 29 out of 29 bytes
* additional stuff not fine transfer.c:1037: 0 0
* HTTP 1.0, assume close after body
&lt; HTTP/1.0 303 See Other
&lt; Date: Mon, 05 Nov 2012 05:07:29 GMT
&lt; localhost - - [04/Nov/2012 21:07:29] &quot;POST /gate/key/8499146 HTTP/1.1&quot; 303 0
Server: WSGIServer/0.1 Python/2.7.3rc2
&lt; Content-Length: 0
&lt; Content-Type: text/html; charset=UTF-8
&lt; Location: http://localhost:8080/gate/key/7895473
&lt;
* Closing connection #0
</pre>
The Location header contains the new doorcode.
The Location header contains the new doorcode.


Line 74: Line 104:
Just add a function of the form:
Just add a function of the form:


<syntaxhighlight lang="python">
<source lang="python">
@api_app.route(&quot;/myurl/&quot;)
@api_app.route(&quot;/myurl/&quot;)
def myfunc()
def myfunc()
     do_something_in_the_space()
     do_something_in_the_space()
     return { 'success' : True, 'OMG IT WORXORRED' }
     return { 'success' : True, 'OMG IT WORXORRED' }
</syntaxhighlight>
</source>
== Deploying your new API ==
== Deploying your new API ==


You'll need sudo powers on minotaur. Check out the code using git:
You'll need sudo powers on minotaur. Check out the code using git:


<source lang="bash">   git clone git@github.com:noisebridge/noise-api.git</source>
<source lang="bash">
    git clone git@github.com:noisebridge/noise-api.git
</source>
Make your changes, and test them locally using
Make your changes, and test them locally using


<source lang="bash">   python api.py --debug</source>
<source lang="bash">
  python api.py --debug
</source>
When you're ready to deploy, change the Debian changelog in debian/changelog (the [http://honk.sigxcpu.org/projects/git-buildpackage/manual-html/gbp.man.git.dch.html git-dch] program can help with this), and commit the code to the github repository..
When you're ready to deploy, change the Debian changelog in debian/changelog (the [http://honk.sigxcpu.org/projects/git-buildpackage/manual-html/gbp.man.git.dch.html git-dch] program can help with this), and commit the code to the github repository..


Log onto minotaur, clone the git repository, and make a Debian package. Install it using dpkg -i
Log onto minotaur, clone the git repository, and make a Debian package. Install it using dpkg -i


<source lang="bash">   git clone git://github.com/noisebridge/noise-api.git
<source lang="bash">
  git clone git://github.com/noisebridge/noise-api.git
   cd noise-api
   cd noise-api
   make package
   make package
   sudo dpkg -i ../noisebridge-api_0[whatever the version number is]*.deb
   sudo dpkg -i ../noisebridge-api_0[whatever the version number is]*.deb
</source>
</source>

Latest revision as of 19:58, 11 April 2013

API for Noisebridge[edit]

This is a very simple Python WSGI App that provides a RESTful API for fun things in the Noisebridge space.

In the Noisebridge tradition, it's not stable! It will, however try to break in as noisy a way as possible if things change.

Using the API[edit]

The API is currently only available within the space. Once we have authorisation running, this will change.

The API is RESTful, and can be called at the URL:

http://api.noisebridge.net/[call]

For instance, to open the door using curl:

<source lang="bash">

   curl -X POST -d open=True http://api.noisebridge.net/gate/
   alternatively:
   curl --resolve 'api.noisebridge.net:80:172.30.0.4' -X POST -d open=True http://api.noisebridge.net/gate/

</source>

GET /hello/[name][edit]

Returns 'hello [name]'

GET /spaceapi/[edit]

Returns Noisebridge status, formatted as per http://hackerspaces.nl/spaceapi/

GET /gate/[edit]

Gets interesting info about the gate. If you send a "Accept: application/json" header, you'll get a status object, which is currently:

    {
    ringing: boolean
    }

Where 'ringing' is true if the gate buzzer is ringing at that moment, or in the last few seconds, as users may push the button for a very short time. The amount of time that this state is cached is totally up to the Gateman daemon that runs to interact with the gate hardware.

If you send a "Accept: text/html" header (as web browsers do), it will return with some useful gate web forms, including one for opening the door with a keycode, and another for getting a new keycode.

POST /gate/[edit]

With open=True, opens the door. Returns a 300 error if unsuccessful, and the following additions to the /gate/ stats if successful:

    {
    open : True
    message: string
    }

With key=XXXX, will optionally check the key against the door code list.

Note that this isn't a required field. Currently if you omit the key field, the door will always open. It's intended to optionally allow other apps to offer the same door code authentication that we use for the phone booth entry.

POST /gate/key/[doorcode][edit]

With create=True and an existing, valid doorcode, redirects to a URL of the form /gate/key/[newdoorcode] which gives a valid new doorcode to open the door.

Note: Jake asked me to (temporarily?) disable this, so I have

With preferred=[number] you can suggest a doorcode you'd like to use. It's not guaranteed that the preferred option will be returned.

Requires comment=[contact email address for new number]

Suppose you have a doorcode 8499146, and you'd like to give a friend a new doorcode. She asks if she can have the number '7895473'

<source lang="bash"> curl -v -X POST -d create=True -d preferred=7895473 \

   -d comment="I'm Dara, my email is new@example.com" http://localhost:8080/gate/key/8499146

</source> would return something like this:

> POST /gate/key/8499146 HTTP/1.1
> User-Agent: curl/7.26.0
> Host: localhost:8080
> Accept: */*
> Content-Length: 29
> Content-Type: application/x-www-form-urlencoded
> 
* upload completely sent off: 29 out of 29 bytes
* additional stuff not fine transfer.c:1037: 0 0
* HTTP 1.0, assume close after body
< HTTP/1.0 303 See Other
< Date: Mon, 05 Nov 2012 05:07:29 GMT
< localhost - - [04/Nov/2012 21:07:29] "POST /gate/key/8499146 HTTP/1.1" 303 0
Server: WSGIServer/0.1 Python/2.7.3rc2
< Content-Length: 0
< Content-Type: text/html; charset=UTF-8
< Location: http://localhost:8080/gate/key/7895473
< 
* Closing connection #0

The Location header contains the new doorcode.

POST /audio/[edit]

With say=[TEXT] will convert the TEXT into speech, and announce it to the space.

Adding to the API[edit]

api.py is a Bottle. It should be pretty self explanatory, even if you don't know much Python.

Just add a function of the form:

<source lang="python"> @api_app.route("/myurl/") def myfunc()

   do_something_in_the_space()
   return { 'success' : True, 'OMG IT WORXORRED' }

</source>

Deploying your new API[edit]

You'll need sudo powers on minotaur. Check out the code using git:

<source lang="bash">

   git clone git@github.com:noisebridge/noise-api.git

</source> Make your changes, and test them locally using

<source lang="bash">

  python api.py --debug

</source> When you're ready to deploy, change the Debian changelog in debian/changelog (the git-dch program can help with this), and commit the code to the github repository..

Log onto minotaur, clone the git repository, and make a Debian package. Install it using dpkg -i

<source lang="bash">

  git clone git://github.com/noisebridge/noise-api.git
  cd noise-api
  make package
  sudo dpkg -i ../noisebridge-api_0[whatever the version number is]*.deb

</source>