Wakanda#3

425 views
372 views

Published on

sample solution and database posted on GitHub:

https://github.com/miyako/4d-training-wakanda-3

Published in: Technology, Business
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
425
On SlideShare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
6
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Wakanda#3

  1. 1. Shibuya, Tokyo Wakanda 勉強会 #3 2013-08-20 presented by
  2. 2. Shibuya, Tokyo .../Executing-Code-on-the-Server.300-575371.ja.html agenda remote procedure call
  3. 3. Shibuya, Tokyo .../Executing-Code-on-the-Server.300-575371.ja.html agenda remote procedure call JSON-RPC HttpRequestHandler Datastore タイプ サービス リクエストハンドラー クラスメソッド 再起動不要 no yes no クライアント JavaScript HTTP JavaScript
  4. 4. Shibuya, Tokyo .../Executing-Code-on-the-Server.300-575371.ja.html JSON-RPC remote procedure call JSON-RPC HttpRequestHandler Datastore タイプ サービス リクエストハンドラー クラスメソッド 再起動不要 no yes no クライアント JavaScript HTTP JavaScript
  5. 5. Shibuya, Tokyo .../About-JSON-RPC-Services-in-Wakanda.300-306542.ja.html JSON-RPC wakanda application framework browsers server NoSQL object datastore + web server + Server Side JavaScript client Side JavaScript + WAF: datasource (widgets) + WAF: dataprovider (REST)
  6. 6. Shibuya, Tokyo .../About-JSON-RPC-Services-in-Wakanda.300-306542.ja.html JSON-RPC wakanda application framework browsers server NoSQL object datastore + web server + Server Side JavaScript client Side JavaScript + WAF: datasource (widgets) + WAF: dataprovider (REST)
  7. 7. Shibuya, Tokyo .../About-JSON-RPC-Services-in-Wakanda.300-306542.ja.html JSON-RPC no framework browsers server NoSQL object datastore + web server + Server Side JavaScript client Side JavaScript
  8. 8. Shibuya, Tokyo .../About-JSON-RPC-Services-in-Wakanda.300-306542.ja.html JSON-RPC no framework browsers server NoSQL object datastore + web server + Server Side JavaScript client Side JavaScript
  9. 9. Shibuya, Tokyo .../About-JSON-RPC-Services-in-Wakanda.300-306542.ja.html JSON-RPC remote procedure call browsers server NoSQL object datastore + web server + Server Side JavaScript client Side JavaScript JSON-RPC http://en.wikipedia.org/wiki/JSON-RPC
  10. 10. Shibuya, Tokyo .../About-JSON-RPC-Services-in-Wakanda.300-306542.ja.html JSON-RPC remote procedure call browsers server NoSQL object datastore + web server + Server Side JavaScript client Side JavaScript JSON-RPC http://en.wikipedia.org/wiki/JSON-RPC {"method": "echo", "params": ["Hello JSON-RPC"], "id": 1}
  11. 11. Shibuya, Tokyo .../About-JSON-RPC-Services-in-Wakanda.300-306542.ja.html JSON-RPC remote procedure call browsers server NoSQL object datastore + web server + Server Side JavaScript client Side JavaScript JSON-RPC http://en.wikipedia.org/wiki/JSON-RPC {"method": "echo", "params": ["Hello JSON-RPC"], "id": 1} {"result": "Hello JSON-RPC", "error": null, "id": 1}
  12. 12. Shibuya, Tokyo .../About-JSON-RPC-Services-in-Wakanda.300-306542.ja.html JSON-RPC remote procedure call browsers server NoSQL object datastore + web server + Server Side JavaScript client Side JavaScript JSON-RPC http://en.wikipedia.org/wiki/JSON-RPC commonJS http://www.commonjs.org/
  13. 13. Shibuya, Tokyo commonJS 場所: {projectFolder}/Modules/myRPC.JS (サブフォルダーでも良い) 構成: 1 file/module, n functions/module javascript: not just for browsers any more! http://www.commonjs.org/specs/modules/1.0/ 戻り値: 必須 (null, ""でも良い) アクセス権: module毎, function毎 JSON-RPC .../Configuring-CommonJS-Modules-for-RPC.300-306585.ja.html
  14. 14. Shibuya, Tokyo .../Configuring-CommonJS-Modules-for-RPC.300-306585.ja.html commonJS regular function add (a, b) {           return (a + b); } exports.add = function add (a, b) {           return (a + b); }; commonJS JSON-RPC
  15. 15. Shibuya, Tokyo .../Configuring-CommonJS-Modules-for-RPC.300-306585.ja.html commonJS var notExposedVar = 'foo'; exports.CONSTANT_1 = 'hello'; exports.add = function add (a, b) {           return (a + b); }; Modules/myRPC.js notExposedVarはエクスポートされない 【参考】 JSON-RPC
  16. 16. Shibuya, Tokyo .../Configuring-CommonJS-Modules-for-RPC.300-306585.ja.html commonJS require('myRPC').add(); 他のサーバーサイドJavaScriptからモジュールを呼び出すとき var notExposedVar = 'foo'; exports.CONSTANT_1 = 'hello'; exports.add = function add (a, b) {           return (a + b); }; Modules/myRPC.js 【参考】 JSON-RPC
  17. 17. Shibuya, Tokyo Configuring-CommonJS-Modules-for-RPC.300-306585.ja.html JSON-RPC
  18. 18. Shibuya, Tokyo Configuring-CommonJS-Modules-for-RPC.300-306585.ja.html JSON-RPC
  19. 19. Shibuya, Tokyo Configuring-CommonJS-Modules-for-RPC.300-306585.ja.html JSON-RPC
  20. 20. Shibuya, Tokyo Configuring-CommonJS-Modules-for-RPC.300-306585.ja.html JSON-RPC
  21. 21. Shibuya, Tokyo Configuring-CommonJS-Modules-for-RPC.300-306585.ja.html JSON-RPC
  22. 22. Shibuya, Tokyo Configuring-CommonJS-Modules-for-RPC.300-306585.ja.html JSON-RPC
  23. 23. Shibuya, Tokyo Configuring-CommonJS-Modules-for-RPC.300-306585.ja.html JSON-RPC
  24. 24. Shibuya, Tokyo Configuring-CommonJS-Modules-for-RPC.300-306585.ja.html JSON-RPC
  25. 25. Shibuya, Tokyo Configuring-CommonJS-Modules-for-RPC.300-306585.ja.html JSON-RPC
  26. 26. Shibuya, Tokyo Configuring-CommonJS-Modules-for-RPC.300-306585.ja.html JSON-RPC
  27. 27. Shibuya, Tokyo .../Configuring-CommonJS-Modules-for-RPC.300-306585.ja.html Set as RPC <?xml version="1.0" encoding="UTF-8"?> <permissions> <allow type="module" resource="myRPC" action="executeFromClient"/> </permissions> {projectFolder}/permissions.waPerm JSON-RPC
  28. 28. Shibuya, Tokyo .../Assigning-Group-Permissions.200-725897.ja.html permission attribute value remarks type module funtion resource modulePath modulePath/funtionName action executeFromClient promote promote: アクセス権を昇格して実行 groupID group UUID default: no authentication JSON-RPC
  29. 29. Shibuya, Tokyo .../Assigning-Group-Permissions.200-725897.ja.html JSON-RPC
  30. 30. Shibuya, Tokyo .../Assigning-Group-Permissions.200-725897.ja.html JSON-RPC
  31. 31. Shibuya, Tokyo .../Assigning-Group-Permissions.200-725897.ja.html {projectFolder}/{projectName}/.waSettings publish <?xml version="1.0" encoding="UTF-8"?> <settings> <project/> <http/> <service name="webApp" modulePath="services/webApp" enabled="true" autoStart="true"/> <service name="rpc" modulePath="services/rpc" enabled="true" autoStart="true" proxyPattern="^/rpc-proxy/" publishInClientGlobalNamespace="false"/> <service name="dataStore" modulePath="services/dataStore" enabled="true" autoStart="true"/> <service name="upload" modulePath="services/upload" enabled="true" autoStart="true"/> <service name="Git HTTP Service" modulePath="services/waf-git/waf-GitService" enabled="true"/> <resources/> <javaScript/> </settings> JSON-RPC
  32. 32. Shibuya, Tokyo .../Assigning-Group-Permissions.200-725897.ja.html {projectFolder}/{projectName}/.waSettings publish <?xml version="1.0" encoding="UTF-8"?> <settings> <project/> <http/> <service name="webApp" modulePath="services/webApp" enabled="true" autoStart="true"/> <service name="rpc" modulePath="services/rpc" enabled="true" autoStart="true" proxyPattern="^/rpc-proxy/" publishInClientGlobalNamespace="false"/> <service name="dataStore" modulePath="services/dataStore" enabled="true" autoStart="true"/> <service name="upload" modulePath="services/upload" enabled="true" autoStart="true"/> <service name="Git HTTP Service" modulePath="services/waf-git/waf-GitService" enabled="true"/> <resources/> <javaScript/> </settings> JSON-RPC
  33. 33. Shibuya, Tokyo Configuring-CommonJS-Modules-for-RPC.300-306585.ja.html JSON-RPC
  34. 34. Shibuya, Tokyo Configuring-CommonJS-Modules-for-RPC.300-306585.ja.html JSON-RPC
  35. 35. Shibuya, Tokyo .../Configuring-CommonJS-Modules-for-RPC.300-306585.ja.html namespace index.waPage/index.html <meta name="WAF.config.rpc.file" content="rpc-proxy/myRPC?namespace=myRPC"/> <script type="text/javascript" src="/rpc-proxy/myRPC?namespace=myRPC"> </script> any html デフォルト名前空間: RPCモジュール.jsのファイル名 JSON-RPC
  36. 36. Shibuya, Tokyo .../Configuring-CommonJS-Modules-for-RPC.300-306585.ja.html namespace syntax#1 var mathTools = {     sine : function () {},     cos : function () {},     atan : function () {} }; var mathTools = {}; mathTools.sine= function () {}; mathTools.cos = function () {}; mathTools.atan = function () {}; syntax#2 【参考】 JSON-RPC
  37. 37. Shibuya, Tokyo Configuring-CommonJS-Modules-for-RPC.300-306585.ja.html JSON-RPC
  38. 38. Shibuya, Tokyo .../Calling-Methods-from-the-Client-Side.300-306631.ja.html button1.click = function button1_click (event) synchronous call try { { var a = $$('textField1').getValue(); var b = $$ ('textField2').getValue(); var result = myRPC.add(a,b); $$('richText1').setValue(result); }catch (e) { console.log(e.message); } JSON-RPC
  39. 39. Shibuya, Tokyo .../Using-JSON-RPC-Services/Error-Handling.300-306655.ja.html button1.click = function button1_click (event) try { { var a = $$('textField1').getValue(); var b = $$ ('textField2').getValue(); var result = myRPC.add(a,b); $$('richText1').setValue(result); } catch (e) { console.log(e.message); } e.code: エラーコード e.message: エラーメッセージ error handling JSON-RPC
  40. 40. Shibuya, Tokyo .../Using-JSON-RPC-Services/Error-Handling.300-306655.ja.html error handling code message remarks -32601 Method not found -32603 Internal error while... throw: カスタムエラー JSON-RPC
  41. 41. Shibuya, Tokyo .../Using-JSON-RPC-Services/Error-Handling.300-306655.ja.html button1.click = function button1_click (event) try { { var a = $$('textField1').getValue(); var b = $$ ('textField2').getValue(); var result = myRPC.add(a,b); $$('richText1').setValue(result); } catch (e) { console.log(e.message); } e.code: エラーコード e.message: エラーメッセージ error handling JSON-RPC
  42. 42. Shibuya, Tokyo .../Using-JSON-RPC-Services/Error-Handling.300-306655.ja.html try { { var a = $$('textField1').getValue(); var b = $$ ('textField2').getValue(); var result = myRPC.add(a,b); $$('richText1').setValue(result); } catch (e) { console.log(e.data); } e.code: エラーコード e.message: エラーメッセージ error handling e.data: エラーメッセージオブジェクト button1.click = function button1_click (event) JSON-RPC
  43. 43. Shibuya, Tokyo .../Using-JSON-RPC-Services/Error-Handling.300-306655.ja.html Modules/myRPC.js exports.add = function add (a, b) { " if ((a.length) && (b.length))          return (a + b); " else " " throw new UserException("Arguments can't be empty.", 1); }; function UserException(message, code) { this.moduleName = "myRPC"; this.message = message; this.code = code; }; error handling JSON-RPC
  44. 44. Shibuya, Tokyo .../Calling-Methods-from-the-Client-Side.300-306631.ja.html button1.click = function button1_click (event) synchronous call try { { var a = $$('textField1').getValue(); var b = $$ ('textField2').getValue(); var result = myRPC.add(a,b); $$('richText1').setValue(result); }catch (e) { console.log(e.message); } JSON-RPC
  45. 45. Shibuya, Tokyo .../Calling-Methods-from-the-Client-Side.300-306631.ja.html button1.click = function button1_click (event) asynchronous call { myRPC.addAsync( " function (result) {$$('richText1').setValue(result);}, $$ ('textField1').getValue(), $$('textField2').getValue()); } JSON-RPC
  46. 46. Shibuya, Tokyo .../Calling-Methods-from-the-Client-Side.300-306631.ja.html button1.click = function button1_click (event) asynchronous call { myRPC.addAsync( " function (result) {$$('richText1').setValue(result);}, $$ ('textField1').getValue(), $$('textField2').getValue()); } Async: 非同期モードRPCのsuffix JSON-RPC
  47. 47. Shibuya, Tokyo .../Calling-Methods-from-the-Client-Side.300-306631.ja.html button1.click = function button1_click (event) asynchronous call { myRPC.addAsync( " function (result) {$$('richText1').setValue(result);}, $$ ('textField1').getValue(), $$('textField2').getValue()); } コールバックメソッド(成功時のみ) Async: 非同期モードRPCのsuffix JSON-RPC
  48. 48. Shibuya, Tokyo .../Calling-Methods-from-the-Client-Side.300-306631.ja.html button1.click = function button1_click (event) asynchronous call { myRPC.addAsync( " function (result) {$$('richText1').setValue(result);}, $$ ('textField1').getValue(), $$('textField2').getValue()); } コールバックメソッド(成功時のみ) Async: 非同期モードRPCのsuffix パラメーター(そのまま列挙) JSON-RPC
  49. 49. Shibuya, Tokyo .../Calling-Methods-from-the-Client-Side.300-306631.ja.html button1.click = function button1_click (event) asynchronous call { var result = myRPC.addAsync({ 'onSuccess': function (result) { $$('richText1').setValue(result); }, 'onError': function (error) { console.log(e.data); }," " 'params': [$$('textField1').getValue(), $$('textField2').getValue()] }); } JSON-RPC
  50. 50. Shibuya, Tokyo .../Calling-Methods-from-the-Client-Side.300-306631.ja.html button1.click = function button1_click (event) asynchronous call { var result = myRPC.addAsync({ 'onSuccess': function (result) { $$('richText1').setValue(result); }, 'onError': function (error) { console.log(e.data); }," " 'params': [$$('textField1').getValue(), $$('textField2').getValue()] }); } コールバックメソッド(成功時,失敗時) JSON-RPC
  51. 51. Shibuya, Tokyo .../Calling-Methods-from-the-Client-Side.300-306631.ja.html button1.click = function button1_click (event) asynchronous call { var result = myRPC.addAsync({ 'onSuccess': function (result) { $$('richText1').setValue(result); }, 'onError': function (error) { console.log(e.data); }," " 'params': [$$('textField1').getValue(), $$('textField2').getValue()] }); } パラメーター(配列) コールバックメソッド(成功時,失敗時) JSON-RPC
  52. 52. Shibuya, Tokyo .../Using-JSON-RPC-Services/Error-Handling.300-306655.ja.html synchronous call JSON-RPC
  53. 53. Shibuya, Tokyo .../Configuring-CommonJS-Modules-for-RPC.300-306585.ja.html namespace index.waPage/index.html <meta name="WAF.config.rpc.file" content="rpc-proxy/myRPC?namespace=myRPC"/> <script type="text/javascript" src="/rpc-proxy/myRPC?namespace=myRPC"> </script> any html デフォルト名前空間: RPCモジュール.jsのファイル名 JSON-RPC
  54. 54. Shibuya, Tokyo .../Configuring-CommonJS-Modules-for-RPC.300-306585.ja.html namespace index.waPage/index.html <meta name="WAF.config.rpc.file" content="rpc-proxy/myRPC?namespace=myRPC"/> <script type="text/javascript" src="/rpc-proxy/myRPC?namespace=myRPC"> </script> any html デフォルト名前空間: RPCモジュール.jsのファイル名 JSON-RPC
  55. 55. Shibuya, Tokyo .../Using-JSON-RPC-Services/Error-Handling.300-306655.ja.html plain.html <!DOCTYPE html> <html> <head> <title>plain</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> " " <script type="text/javascript" src="/rpc-proxy/myRPC?namespace=myRPC"></script> </head> <body> <h1> " " " <input type="text" id="textInput1" value="Hello " ></input> " " " <input type="text" id="textInput2" value="World!! " ></input> " " " <button onclick="document.getElementById('textInput3').value = myRPC.add(document.getElementById('textInput1').value, document.getElementById('textInput2').value);">myRPC.add()</button> " " " <input type="text" id="textInput3" readOnly="true" ></input> </h1> </body> </html> synchronous call JSON-RPC
  56. 56. Shibuya, Tokyo .../Using-JSON-RPC-Services/Error-Handling.300-306655.ja.html plain.html <!DOCTYPE html> <html> <head> <title>plain</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> " " <script type="text/javascript" src="/rpc-proxy/myRPC?namespace=myRPC"></script> </head> <body> <h1> " " " <input type="text" id="textInput1" value="Hello " ></input> " " " <input type="text" id="textInput2" value="World!! " ></input> " " " <button onclick="document.getElementById('textInput3').value = myRPC.add(document.getElementById('textInput1').value, document.getElementById('textInput2').value);">myRPC.add()</button> " " " <input type="text" id="textInput3" readOnly="true" ></input> </h1> </body> </html> synchronous call JSON-RPC
  57. 57. Shibuya, Tokyo .../Using-JSON-RPC-Services/Error-Handling.300-306655.ja.html synchronous call JSON-RPC
  58. 58. Shibuya, Tokyo .../Executing-Code-on-the-Server.300-575371.en.html remote procedure call JSON-RPC HttpRequestHandler Datastore タイプ サービス リクエストハンドラー クラスメソッド 再起動不要 no yes no クライアント JavaScript HTTP JavaScript HTTP request handler
  59. 59. Shibuya, Tokyo .../Executing-Code-on-the-Server.300-575371.en.html HTTP request handler remote procedure call JSON-RPC HttpRequestHandler Datastore タイプ サービス リクエストハンドラー クラスメソッド 再起動不要 no yes no クライアント JavaScript HTTP JavaScript
  60. 60. Shibuya, Tokyo .../HTTP/HTTP.200-803294.ja.html HTTP request handler browsers server NoSQL object datastore + web server + Server Side JavaScript client Side JavaScript no framework
  61. 61. Shibuya, Tokyo .../HTTP/HTTP.200-803294.ja.html HTTP request handler browsers server NoSQL object datastore + web server + Server Side JavaScript HTTP client no JavaScript
  62. 62. Shibuya, Tokyo .../HTTP/HTTP.200-803294.ja.html HTTP request handler browsers server NoSQL object datastore + web server + Server Side JavaScript HTTP client no server restart
  63. 63. Shibuya, Tokyo .../Global-Application/Application/addHttpRequestHandler.301-636268.ja.html HTTP request handler addHttpRequestHandler( '(?i)^/demo$', 'myRequestHandler.js', 'do_demo' ); add handler
  64. 64. Shibuya, Tokyo .../Global-Application/Application/addHttpRequestHandler.301-636268.ja.html HTTP request handler addHttpRequestHandler( '(?i)^/demo$', 'myRequestHandler.js', 'do_demo' ); リクエストURLパターン: ICU正規表現 add handler http://www.icu-project.org/userguide/regexp.html
  65. 65. Shibuya, Tokyo .../Global-Application/Application/addHttpRequestHandler.301-636268.ja.html HTTP request handler addHttpRequestHandler( '(?i)^/demo$', 'myRequestHandler.js', 'do_demo' ); リクエストURLパターン: ICU正規表現 add handler ファイル名
  66. 66. Shibuya, Tokyo .../Global-Application/Application/addHttpRequestHandler.301-636268.ja.html HTTP request handler addHttpRequestHandler( '(?i)^/demo$', 'myRequestHandler.js', 'do_demo' ); リクエストURLパターン: ICU正規表現 add handler 関数名 ファイル名
  67. 67. Shibuya, Tokyo .../Introduction-to-HTTP-Request-Handlers.200-803294.ja.html HTTP request handler
  68. 68. Shibuya, Tokyo .../Introduction-to-HTTP-Request-Handlers.200-803294.ja.html HTTP request handler
  69. 69. Shibuya, Tokyo .../Introduction-to-HTTP-Request-Handlers.200-803294.ja.html HTTP request handler function do_demo(request, response) { return "Hello world"; } handler function
  70. 70. Shibuya, Tokyo .../HTTP-Request-Handlers/HTTPRequest.201-803366.ja.html HTTP request handler HTTPRequest body- String | Image | Blob requestLine- String isSSL- Boolean contentType- String url- String method- String rawURL- String parts- MIMEMessage host- String urlPath- String headers- HTTPRequestHeader version- String urlQuery- String user- String remoteAddress - String remotePort- Number password- String localAddress- String localPort- Number
  71. 71. Shibuya, Tokyo .../HTTP-Request-Handlers/HTTPResponse.201-805902.ja.html HTTP request handler HTTPResponse body- String | Image | Blob requestLine- String isSSL- Boolean contentType- String url- String method- String rawURL- String parts- MIMEMessage host- String urlPath- String headers- HTTPRequestHeader version- String urlQuery- String statusCode- Number user- String remoteAddress - String remotePort- Number password- String localAddress- String localPort- Number allowCache() allowCompression()
  72. 72. Shibuya, Tokyo .../Executing-Code-on-the-Server.300-575371.en.html remote procedure call JSON-RPC HttpRequestHandler Datastore タイプ サービス リクエストハンドラー クラスメソッド 再起動不要 no yes no クライアント JavaScript HTTP JavaScript datastore class method
  73. 73. Shibuya, Tokyo .../Using-Datastore-Class-Methods.200-878615.ja.html remote procedure call JSON-RPC HttpRequestHandler Datastore タイプ サービス リクエストハンドラー クラスメソッド 再起動不要 no yes no クライアント JavaScript HTTP JavaScript datastore class method
  74. 74. Shibuya, Tokyo .../Using-Datastore-Class-Methods.200-878615.ja.html datastore class method
  75. 75. Shibuya, Tokyo .../Using-Datastore-Class-Methods.200-878615.ja.html datastore class method
  76. 76. Shibuya, Tokyo .../Using-Datastore-Class-Methods.200-878615.ja.html datastore class method
  77. 77. Shibuya, Tokyo .../Using-Datastore-Class-Methods.200-878615.ja.html datastore class method
  78. 78. Shibuya, Tokyo .../Using-Datastore-Class-Methods.200-878615.ja.html scope client server derived class class public OK OK OK OK public on server OK OK OK protected OK OK private OK datastore class method
  79. 79. Shibuya, Tokyo .../Using-Datastore-Class-Methods.200-878615.ja.html datasource index.waPage/index.html var result = sources.myClass.myMethod(); datastore class method dataSource名の大文字/小文字に注意
  80. 80. Shibuya, Tokyo .../Using-Datastore-Class-Methods.200-878615.ja.html dataprovider index.waPage/index.html datastore class method var result =ds.MyClass.myMethod(); class名の大文字/小文字に注意
  81. 81. Shibuya, Tokyo .../Using-Datastore-Class-Methods.200-878615.ja.html datastore class method datasource/dataprovider
  82. 82. Shibuya, Tokyo .../HTTP-REST/Manipulating-Data/datastoreClassmethod.303-814342.ja.html REST GET http://127.0.0.1:8081/rest/MyClass/myMethod POST http://127.0.0.1:8081/rest/MyClass/myMethod datastore class method
  83. 83. Shibuya, Tokyo .../HTTP-REST/Manipulating-Data/datastoreClassmethod.303-814342.ja.html REST GET http://127.0.0.1:8081/rest/MyClass/myMethod POST http://127.0.0.1:8081/rest/MyClass/myMethod datastore class method class, method名の大文字/小文字に注意
  84. 84. Shibuya, Tokyo .../HTTP-REST/Manipulating-Data/datastoreClassmethod.303-814342.ja.html datastore class method REST GET http://127.0.0.1:8081/rest/MyClass/myMethod(a,b,c) POST http://127.0.0.1:8081/rest/MyClass/myMethod body: [a,b,c]
  85. 85. Shibuya, Tokyo .../HTTP-REST/Manipulating-Data/datastoreClassmethod.303-814342.ja.html datastore class method REST GET http://127.0.0.1:8081/rest/MyClass/myMethod(a,b,c) POST http://127.0.0.1:8081/rest/MyClass/myMethod body: [a,b,c] {"result":"abc"}
  86. 86. Shibuya, Tokyo Wakanda 勉強会 #3 2013-08-20 presented by

×