HTTP Bridge Callee¶
The HTTP Callee feature is available starting with Crossbar 0.10.3.
The HTTP Callee is a service that translates WAMP procedures to HTTP requests.
Try it¶
Clone the Crossbar.io examples
repository, and go
to the rest/callee
subdirectory.
Now start Crossbar:
crossbar start
This example is configured to register a WAMP procedure named
com.myap.rest
, which sends requests to httpbin.org
. The
procedure’s complete keyword arguments are detailed further down, but if
we use a kwargs of {"url": "get", "method": "GET"}
, Crossbar will
send a HTTP GET request to httpbin.org/get
and respond with the
result. You can test this using the HTTP Caller configured in the example:
shell curl -H "Content-Type: application/json" \ -d '{"procedure": "com.myapp.rest", "kwargs": {"url": "get", "method": "GET"}}' \ http://127.0.0.1:8080/call
This will call the procedure and print the web response to the terminal.
Configuration¶
The HTTP Callee is configured as a WAMP component. Here it is as part of a Crossbar configuration:
{
"type": "container",
"options": {
"pythonpath": [".."]
},
"components": [
{
"type": "class",
"classname": "crossbar.adapter.rest.RESTCallee",
"realm": "realm1",
"extra": {
"procedure": "com.myapp.rest",
"baseurl": "https://httpbin.org/"
},
"transport": {
"type": "websocket",
"endpoint": {
"type": "tcp",
"host": "127.0.0.1",
"port": 8080
},
"url": "ws://127.0.0.1:8080/ws"
}
}
]
}
The callee is configured through the extra
dictionary:
option |
description |
---|---|
procedure |
The WAMP procedure name to register the callee as. (required) |
baseurl |
The base URL that the callee will use. All calls will work downward from this URL. If you wish to call any URL, set it as an empty string “”. This URL must contain the protocol (e.g. “https://”) (required) |
When making calls to the registered WAMP procedure, you can use the following keyword arguments:
argument |
description |
---|---|
method |
The HTTP method. (required) |
url |
The url which will be appended to the configurd base URL. For example, if the base URL was “http://example.com”, providing “test” as this argument would send the request to http://example.com/test. (optional, uses the configured base URL if not provided) |
body |
The body of the request as a string. (optional, empty if not provided) |
headers |
A dictionary, containing the header names as the key, and a list of header values as the value. For example, to send a Content-Type of application/json, you would use {“Content-Type”: [“application/json”]} as the argument. (optional) |
params |
Request parameters to send, as a dictionary. (optional) |
Examples¶
Wikipedia¶
Wikipedia has a web API that we can use for this demonstration.
Configure the RESTCallee
WAMP component:
"extra": {
"procedure": "org.wikipedia.en.api",
"baseurl": "http://en.wikipedia.org/w/api.php"
}
This code snippet calls the procedure with the parameters to look up the current revision of the Twisted Wikipedia page, reads the web response as JSON, and then pretty prints the response to the terminal.
import json
from twisted.internet import reactor
from twisted.internet.defer import inlineCallbacks
from autobahn.twisted.wamp import ApplicationSession, ApplicationRunner
class AppSession(ApplicationSession):
@inlineCallbacks
def onJoin(self, details):
res = yield self.call("org.wikipedia.en.api",
method="GET",
url="",
params={
"format": "json",
"action": "query",
"titles": "Twisted (software)",
"prop": "revisions",
"rvprop": "content"
})
pageContent = json.loads(res["content"])
print(json.dumps(pageContent, sort_keys=True,
indent=4, separators=(',', ': ')))
reactor.stop()
if __name__ == '__main__':
from autobahn.twisted.wamp import ApplicationRunner
runner = ApplicationRunner("ws://127.0.0.1:8080/ws", "realm1")
runner.run(AppSession)