phoenix 开发API系列(二)phoenix 各类 api 实现方式
概述
上一篇已经提到如何安装以及利用 phoenix framework 来开发一个简单的 api。 接着上次的工程,下面演示如何通过 phoenix framework 来构建各种类型的 api 来应对前端的各类请求。
注 下面使用的工程的完整代码已经公开在: http://git.oschina.net/wangyubin/phoenix-api
各类 api 的实现示例
restful url 的参数
introduce by code:
- controller 中相关代码:
@doc "/api/param/:name" def rest_param1(conn, %{"name" => name}) do json conn, %{ "result": "success", "message": "your name is " <> name, } end @doc "/api/param/:name/:age" def rest_param2(conn, %{"name" => name, "age" => age}) do json conn, %{ "result": "success", "message": "your name is " <> name <> " and age is " <> age, } end
- router 相关代码: (router.ex)
get "/param/:name", ApiParamController, :rest_param1 get "/param/:name/:age", ApiParamController, :rest_param2
- 启动 phoenix 开发服务器,就可以在浏览器中访问对应的 URL
mix phoenix.server
在 浏览器 中访问 http://localhost:4000/api/param/wang 和 http://localhost:4000/api/param/wang/33 可以看到返回的 json。
GET 请求中的参数
introduce by code: api的参数的上面的示例一样
- controller 中相关代码:(api_param_controller.ex)
@doc "/api/param?name=xxx&age=yyy" def rest_param3(conn, params) do if Map.has_key?(params, "age") do json conn, %{ "result": "success from rest_param3", "message": "your name is " <> params["name"] <> " and age is " <> params["age"], } else json conn, %{ "result": "success from rest_param3", "message": "your name is " <> params["name"], } end end
- router 相关代码: (router.ex)
get "/param", ApiParamController, :rest_param3
- 启动 phoenix 开发服务器,就可以在浏览器中访问对应的 URL
mix phoenix.server
在 浏览器 中访问 http://localhost:4000/api/param?name=wang&age=33 和 http://localhost:4000/api/param?name=wang 可以看到返回的 json。
POST 请求中的参数
introduce by code: api的参数的上面的示例一样
- controller 中相关代码:(api_param_controller.ex)
@doc "/api/param" def post_param(conn, params) do if Map.has_key?(params, "age") do json conn, %{ "result": "success from post_param", "message": "your name is " <> params["name"] <> " and age is " <> params["age"], } else json conn, %{ "result": "success from post_param", "message": "your name is " <> params["name"], } end end
- router 相关代码: (router.ex)
post "/param", ApiParamController, :post_param
- 启动 phoenix 开发服务器,就可以在浏览器中访问对应的 URL
mix phoenix.server
测试api 可以使用 curl 命令:
curl -X POST -H "Cache-Control: no-cache" -F "name=wyb" "http://localhost:4000/api/param" curl -X POST -H "Cache-Control: no-cache" -F "name=wyb" -F "age=33" "http://localhost:4000/api/param"
json 格式参数
introduce by code: api的参数的上面的示例一样
- controller 中相关代码:(api_param_controller.ex)
@doc "/api/json-param" def json_param(conn, params) do if Map.has_key?(params, "age") do json conn, %{ "result": "success from json_param", "message": "your name is " <> params["name"] <> " and age is " <> to_string(params["age"]), } else json conn, %{ "result": "success from json_param", "message": "your name is " <> params["name"], } end end
- router 相关代码: (router.ex)
post "/json-param", ApiParamController, :json_param
- 启动 phoenix 开发服务器,就可以在浏览器中访问对应的 URL
mix phoenix.server
测试api 可以使用 curl 命令:
curl -X POST -H "Content-Type: application/json" -H "Cache-Control: no-cache" -d '{ "name": "wyb" }' "http://localhost:4000/api/json-param" curl -X POST -H "Content-Type: application/json" -H "Cache-Control: no-cache" -d '{ "name": "wyb", "age": 33 }' "http://localhost:4000/api/json-param"
下载 文件
introduce by code: api的参数的上面的示例一样
- controller 中相关代码:(api_param_controller.ex)
@doc "/api/file-param" def file_param(conn, params) do filepath = "/tmp/downloadfile.txt" if Map.has_key?(params, "age") do File.write(filepath, "your name is " <> params["name"] <> " and age is " <> to_string(params["age"])) else File.write(filepath, "your name is " <> params["name"]) end conn |> send_file(200, filepath) end
- router 相关代码: (router.ex)
get "/file-param", ApiParamController, :file_param
- 启动 phoenix 开发服务器,就可以在浏览器中访问对应的 URL
mix phoenix.server
在 浏览器 中访问 http://localhost:4000/api/file-param?name=wang&age=33 和 http://localhost:4000/api/file-param?name=wang 可以看到返回的 json。
上传 文件
introduce by code: api的参数的上面的示例一样
- controller 中相关代码:(api_param_controller.ex)
@doc "/api/file-param" def upload_param(conn, params) do file = params["file"] File.cp(file.path, "/tmp/upload.file") json conn, %{ "result": "success from file_param", "message": "your name is " <> params["name"] <> " and age is " <> to_string(params["age"]) <> " and the filename which you upload is " <> file.filename, } end
- router 相关代码: (router.ex)
post "/file-param", ApiParamController, :upload_param
- 启动 phoenix 开发服务器,就可以在浏览器中访问对应的 URL
mix phoenix.server
测试api 可以使用 curl 命令: 命令中的 file 要替换成你的实际文件路径
curl -X POST -H "Cache-Control: no-cache" -H "Content-Type: multipart/form-data" \ -F "name=wyb" -F "age=33" -F "file=@/tmp/test.jpg" "http://localhost:4000/api/file-param"
总结
可以看岀,phoenix framework 的 Plug 提供了丰富的功能,所以编写 api 非常方便。 掌握了上面的示例,基本就可以满足构建web服务时大部分的 api 的写法了。
上一篇: Python函数参数与参数解构
下一篇: Ruby异常处理的基础