• 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/wanghttp://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=33http://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=33http://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 的写法了。

    来源:http://blog.iotalabs.io/

  • 相关阅读:
    第一章—v-text和v-html
    第一章—v-for
    第一章—v-show
    react_9
    【软件工程】
    【软件工程】网页设计基础 第一章
    【软件工程】psp四则运算
    【python】网络爬虫与信息提取
    【python】数据库学习笔记,设计自己的大学排名
    【python】用python玩微信跳一跳小游戏
  • 原文地址:https://www.cnblogs.com/wang_yb/p/5849441.html
Copyright © 2020-2023  润新知