我应该在林的POST请求中使用什么类型?

时间:2013-05-28 21:02:52

标签: go

我是Go的新手所以请原谅我,如果这是明显的愚蠢。

我正在尝试将表单发布到使用gorest在Go中编写的REST API。我已成功使用GET完成此操作,但我无法将POST数据解析为映射。这是我的Go代码

gotest.go:

package main
import (
  "code.google.com/p/gorest"
  "net/http"
  "fmt"
)

func main() {
  gorest.RegisterService(new(HelloService)) //Register our service                                        
  http.Handle("/",gorest.Handle())
  http.ListenAndServe(":8787",nil)
}

//Service Definition                                                                                      
type HelloService struct {
  gorest.RestService `root:"/api/"`
  save   gorest.EndPoint `method:"POST" path:"/save/" output:"string" postdata:"map[string]string"`
}

func(serv HelloService) Save(PostData map[string]string) {
  fmt.Println(PostData)
}

我真棒的HTML格式:

<form method="POST" action="http://127.0.0.1:8787/api/save/">
  key: <input type="text" name="key" /><br />  
  json: <input type="text" name="json" /><br />
  <input type="submit" />
</form>

我认为这会将我的帖子数据变成一张我可以访问的漂亮地图。我填写表单,点击提交,然后返回错误:

Error Unmarshalling data using application/json. Client sent incompetible data format in entity. (invalid character 'k' looking for beginning of value)

编辑:正如greggory.hz所指出的,程序似乎认为帖子数据是json。这个错误是因为json必须以括号,括号或引号开头。

如果map[string]string带有string,则会将以下内容打印到运行此操作的bash终端:

key=arst&json=%7B%27arst%27%3A%27arst%27%7D

在go rest文档中,我能找到的唯一例子是:

posted gorest.EndPoint method:"POST" path:"/post/"  postdata:"User" 
func(serv HelloService) Posted(posted User)

但是我创建自定义结构的尝试也因上面看到的同样的解组错误而失败。

type MyStruct struct {
  key,json string
}

有人可以告诉我我应该使用哪种数据类型?

1 个答案:

答案 0 :(得分:3)

您正在尝试将html表单发布到期望json正文的服务中。但是你的浏览器不会将帖子格式化为application / json。它会将其格式化为urlencoded主体。问题不在你的服务器代码中,而是在html表单中。您可能希望使用javascript打包并发送您的帖子而不是标准的html表单。

<div>
  <input type="hidden" name="endpont" value="http://127.0.0.1:8787/api/save/" />
  key: <input type="text" name="key" /><br /> <!-- this should be used in your post url -->
  json: <input type="text" name="json" /><br /> <!-- this will get sent by your javascript as the post body -->
  <input type="button" onclick="send_using_ajax();" />
</div>