当内容类型为“application / json”时,Revel不会解析JSON参数。
如何执行此操作?
示例:
POSThttp://localhost:9000/foundations
函数中的 Foundations.Create
。
在此函数中,我使用fmt.Println("Params :", c.Params)
来检查参数
Ruby POST JSON数据
#!/usr/bin/env ruby
require "rubygems"
require "json"
require "net/https"
uri = URI.parse("http://localhost:9000/foundations")
http = Net::HTTP.new(uri.host, uri.port)
header = { "Content-Type" => "application/json" }
req = Net::HTTP::Post.new(uri.path, header)
req.body = {
"data" => "mysurface"
}.to_json()
res = http.start { |http| http.request(req) }
调试打印是
Params : &{map[] map[] map[] map[] map[] map[] []}
当我没有使用“application / json”时:
curl -F 'data=mysurface' http://127.0.0.1:9000/foundations
印刷品是:
Params : &{map[data:[mysurface]] map[] map[] map[] map[data:[mysurface]] map[] []}
答案 0 :(得分:2)
问题在于,使用json,Revel无法像对待"普通"那样真正地处理它。发布请求。通常,它可以将每个参数绑定到map[string]string
对象中。但是使用JSON,它必须能够处理数组和嵌套对象,如果事先不知道JSON的结构将会是什么,就没有好办法。
所以解决方案就是自己处理它 - 你应该知道期望哪些字段,所以用这些字段创建一个struct
,并在其中json.Unmarshal
。
import (
"encoding/json"
"fmt"
)
type Surface struct {
Data string `json:"data"` //since we have to export the field
//but want the lowercase letter
}
func (c MyController) Action() revel.Result {
var s Surface
err := json.Unmarshal([]byte(c.Request.Body), &s)
fmt.Println(s.Data) //mysurface
}
如果您不想使用json:"data"
代码或不想导出字段,您也可以编写自己的UnmarshalJSON
函数
type Surface struct {
data string `json:"data"` //can use unexported field
//since we handle JSON ourselves
}
func (s *Structure) UnmarshalJSON(data []byte) error {
if (s == nil) {
return errors.New("Structure: UnmarshalJSON on nil pointer")
}
var fields map[string]string
json.Unmarshal(data, &fields)
*s.data = fields["data"]
return nil
}