【问题标题】:how to dynamically render as HTML/JSON/XML in golang with martini?如何使用马提尼在 golang 中动态呈现为 HTML/JSON/XML?
【发布时间】:2015-02-22 20:41:35
【问题描述】:

我试图在 golang 站点中拥有一个简单的 REST API 服务器,该服务器提供与客户端请求的日期相同的 HTML、JSON 或 XML 格式。我无法弄清楚。我希望我没有做傻事。

代码:

package main

import (
    "github.com/go-martini/martini"
    "github.com/martini-contrib/render"
)

type Ticket struct {
    Number      int    `json:"number"`
    Description string `json:"description"`
    State       string `json:"state"`
}

func dummyStatus() Ticket {

    ticket := Ticket{
        Number:      2345,
        Description: "A dummy customer ticket",
        State:       "resolved",
    }
    return ticket
}

// http://localhost:3000/status/id:1
func ReadStatus(r render.Render, params martini.Params) Ticket {

    // read from DB
    return dummyStatus()
}

func WriteStatus(params martini.Params) Ticket {

    // write to DB
    return dummyStatus()
}

func main() {

    m := martini.Classic()
    m.Use(render.Renderer())

    m.Group("/status", func(r martini.Router) {
        r.Get("/:id", ReadStatus)
        r.Post("/:id", WriteStatus)
    })

    m.Run()

}

结果: 我请求 JSON,我只收到一个字符串

$ curl -i -H "Accept: application/json" -H "Content-Type:application/json" -X GET http://localhost:3000/status/id:12345
HTTP/1.1 200 OK
Date: Wed, 24 Dec 2014 20:01:32 GMT
Content-Length: 19
Content-Type: text/plain; charset=utf-8

<main.Ticket Value>

【问题讨论】:

    标签: xml json rest go martini


    【解决方案1】:

    经过反复试验,我发现了这一点,但是,我仍在努力使其与路由组一起使用。如果我弄清楚了,我会更新这个答案。希望这会有所帮助。

    package main
    
    import (
        "github.com/go-martini/martini"
        "github.com/martini-contrib/render"
    )
    
    type Ticket struct {
        Number      int    `json:"number"`
        Description string `json:"description"`
        State       string `json:"state"`
    }
    
    func ReadStatus(p martini.Params) Ticket {
    
        ticket := Ticket{
            Number:      645,
            Description: "A dummy customer ticket " + p["id"],
            State:       "resolved",
        }
        return ticket
    }
    
    func main() {
    
        m := martini.Classic()
        m.Use(render.Renderer())
    
        m.Get("/status/:id", func(r render.Render, params martini.Params) { r.JSON(200, ReadStatus(params)) })
    
        m.Run()
    
    }
    

    【讨论】:

    • 哦,我忘了提到我对这段代码的第二个限制......它不会根据请求动态更改格式。现在硬编码 JSON 响应。 :-(
    • 我不得不执行一个类似的任务,其中默认输出是 JSON,然后是 XML。我现在只是使用辅助路由来执行此操作,该路由对我的数据执行一个方法以将其呈现为 XML,然后 r.Data(200, []byte(xmlstring))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-04
    • 1970-01-01
    • 2021-06-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多