''JSON-RPC is a stateless, light-weight remote procedure call (RPC) protocol. It uses [JSON] (RFC 4627) as data format, and is transport-independent. It is designed to be simple!'' - from the JSON-RPC specification [http://groups.google.com/group/json-rpc/web/json-rpc-1-2-proposal]. [APN] 20080705 A Tcl implementation of the JSON-RPC client-side API is now part of [TclSOAP]. Most of the server-side calls are implemented, but not integrated with any http servers. [MaxJarek] JSON-RPC is my primary technology for client-server applications. I use Tk GUI on client side and Wibble as JSON-RPC http server. Sample client example: ====== package require JSONRPC JSONRPC::create add -proxy "http://www.raboof.com/projects/jayrock/demo.ashx" \ -params { val1 int val2 int } puts [::add 2 3456] ====== Sample server side example (for wibble::jsonrpc::proxy package): ====== namespace eval ::wibble::json-rpc { proc add {a b} {return [expr {$a+$b}]} } ====== TclSOAP don't support https transport for JSON-RPC. I have created patch for SOAP::https which is waiting in repo. wibble::jsonrpc::proxy is my package thats change Wibble in good (for me) SOA application server. jsonrpc-proxy needs same corrects in Wibble core. I am waiting for new Wibble version then proxy package will be public available. :) [AMG]: Please let me know what changes you would like in the [Wibble] core, and I'll see what I can incorporate directly. For anything that I can't just drop in without breaking compatibility and/or adding prerequisites, I may have ideas on how to modify the core to be more receptive to outside customization. The next version of Wibble, when I have time to work on it, should feature charset support, rather than being tied to ISO8859-1. That's my primary goal. I'm also collecting little fixes and updates. For example, I modified [[getrequest]] to permit application/json-rpc to be parsed by a zone handler, and I modified [[listen]] to work better with [TLS], both thanks to your suggestions and contributions. [MaxJarek]: Ok, let's start with Wibble 0.2 :). This is initial version. ====== # Simple JSONRPC proxy for Wibble # J. Lewandowski, (MaxJarek) # Available under the Tcl/Tk license. http://tcl.tk/software/tcltk/license.html package provide wibble::jsonrpc::proxy 0.1 namespace eval ::wibble::zone { proc jsonrpc-proxy {namespace state} { dict set state response status 200 dict set state response header content-type "" "application/json-rpc; charset=utf-8" dict with state request {} if {$method eq "POST" && [dict exists $header content-type ""] && [dict get $header content-type ""] eq "application/json-rpc"} { array set json_req [json::json2dict [dehex $rawpost]] # execute method with params catch {set result [eval ${namespace}::$json_req(method) $json_req(params)]} err } else { set err "JSON-RPC error" } if {![info exists result]} { dict set state response content [json::write object id null \ error [json::write object name [json::write string JSONRPCError] message [json::write string $err]]] ::wibble::log "JSON-RPC: $err" } else { dict set state response content [json::write object result [json::write string $result] id $json_req(id)] } sendresponse [dict get $state response] } } ====== Example Wibble startup script: ====== namespace eval ::wibble::json-rpc { proc strlen {a} {return "[string length $a]"} proc date {} {return [clock seconds]} proc add {a b} {return [expr {$a+$b}]} } package require wibble package require json package require json::write package require wibble::jsonrpc::proxy set ::wibble::zonehandlers {} ::wibble::handle /maxgui [list jsonrpc-proxy ::wibble::json-rpc] ::wibble::handle / notfound wibble::listen 8080 vwait forever ====== Example client code: ====== package require JSONRPC JSONRPC::configure -transport http JSONRPC::create add -proxy "http://localhost:8080/maxgui" \ -params { val1 int val2 int } puts [::add 2 3456] ====== If you want any new json-rpc method simple insert new funkcion in ::wibble::json-rpc namespace <> Acronym