goa でレスポンスを XML で返す

概要

goa のレスポンスはデフォルトでは json になっているが,これを XML で返したい.

ちなみに,入力の方は json, XML, gob (!!!) がデフォルトで受け取れるようになっている.

例で使ったコードはここにあるやつです :

https://github.com/ikawaha/cellar/tree/xml

方法

cellar の example をちょっと修正して動作を試してみます.

1. デザインで Produces を指定する

package design

import (
    . "github.com/goadesign/goa/design"
    . "github.com/goadesign/goa/design/apidsl"
)

var _ = API("cellar", func() {
    Title("The virtual wine cellar")
    Description("A simple goa service")
    Scheme("http")
    Host("localhost:8080")

    Produces("application/xml") // ★ これを追加
})

var _ = Resource("bottle", func() {
    BasePath("/bottles")
    DefaultMedia(BottleMedia)

    Action("show", func() {
        Description("Get bottle by id")
        Routing(GET("/:bottleID"))
        Params(func() {
            Param("bottleID", Integer, "Bottle ID")
        })
        Response(OK)
        Response(NotFound)
    })
})

var BottleMedia = MediaType("application/vnd.goa.example.bottle+xml", func() { // ★ レスポンスは XML なので適当に変更する
    Description("A bottle of wine")
    Attributes(func() {
        Attribute("id", Integer, "Unique bottle ID")
        Attribute("href", String, "API href for making requests on the bottle")
        Attribute("name", String, "Name of wine")
        Required("id", "href", "name")
    })
    View("default", func() {
        Attribute("id")
        Attribute("href")
        Attribute("name")
    })
})

2. goagen

goagen します.

3. 起動してアクセスしてみる

コントローラーは何も書いてないので,適当に返ってくるのを見るだけ(^^ゞ

$ curl -i localhost:8080/bottles/0
HTTP/1.1 200 OK
Content-Type: application/vnd.goa.example.bottle+xml
Date: Thu, 04 Apr 2019 09:08:28 GMT
Content-Length: 73

<GoaExampleBottle><href></href><id>0</id><name></name></GoaExampleBottle>

レスポンスボディは XML 形式になってます. Content-Type も MediaType で指定したものになっています.

Happy hacking!