我一直在尝试使用 Go 在前端使用 Google App Engine 及其数据存储和 AngularJS 构建一些简单的后端 REST API。除了编辑之外,我能够使一切正常工作。而且我不确定为什么 JSON 没有正确解码。
结构:
type Article struct {
Key int64 `json:"Key" datastore:"-"`
Title string
Text string `datastore:",noindex"`
Author string
Tags string
Posted time.Time
}
当我加载文章时,我使用数据存储中的 id 值填充 Key 属性。示例:5593215650496512
我将该字段保存在我的表单的隐藏输入中,并通过 HTTP Post 将表单的内容作为 JSON 提交到 Go 后端。
在提交之前,我可以看到 Key 持有正确的值。这是表格:
<form name="articleForm" ng-submit="saveArticle(article)">
<fieldset>
<input type="hidden" name="key" ng-value="article.Key" />
<div class="form-group">
<input class="form-control" ng-model="article.Title" placeholder="Title" name="title" type="text" required autofocus />
<div class="alert alert-danger" ng-show="articleForm.Title.$invalid && articleForm.Title.$dirty">
<ul>
<li ng-show="articleForm.title.$error.required">this field is required</li>
</ul>
</div>
</div>
<div class="form-group">
<wysiwyg
name="text"
textarea-id="articleText"
textarea-class="form-control"
textarea-height="180px"
textarea-name="articleText"
ng-model="article.Text"
enable-bootstrap-title="true"
textarea-required>
</wysiwyg>
<div class="alert alert-danger" ng-show="articleForm.text.$invalid && articleForm.text.$dirty">
<ul>
<li ng-show="articleForm.text.$error.required">this field is required</li>
</ul>
</div>
</div>
<div class="form-group">
<tags-input ng-model="tags"></tags-input>
</div>
<button type="submit" ng-disabled="!articleForm.$valid" class="btn btn-primary">
Save Article
</button>
</fieldset>
</form>
http post 之前的 $scope.article 对象:
Author: "Matt Ridley" Key: "5593215650496512" Posted: "2015-06-29T12:57:20.833525Z" Tags: "test,so-cool" Text: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio. Praesent libero. Sed cursus ante dapibus diam. Sed nisi. Nulla quis sem at nibh elementum imperdiet. Duis sagittis ipsum. Praesent mauris. Fusce nec tellus sed augue semper porta. Mauris massa. Vestibulum lacinia arcu eget nulla. " Title: "Example Article 8"
但是,Key 属性仍然为 0。我能够将该值作为单个 id 值传递,而不会出现删除和加载问题。
仅加载 id 的代码(这是加载版本,有效):
var id int64
json.Unmarshal(body, &id)
c.Infof("ID: %v", id)
key := datastore.NewKey(c, "Article", "", id, nil)
具有附加值的编辑代码(不起作用,id = 0):
var article Article
json.Unmarshal(body, &article)
c.Infof("Article:%g", article)
c.Infof("Body:" + string(body))
c.Infof("Key:%v", article.Key)
article.Posted = time.Now()
这是 json.Unmarshal 之后的结构转储:
2015/06/29 03:04:08 INFO: Article:{%!g(int64=0) %!g(string=Example Article 8) %!g(string=Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio. Praesent libero. Sed cursus ante dapibus diam. Sed nisi. Nulla quis sem at nibh elementum imperdiet. Duis sagittis ipsum. Praesent mauris. Fusce nec tellus sed augue semper porta. Mauris massa. Vestibulum lacinia arcu eget nulla. ) %!g(string=Matt Ridley) %!g(string=test,so-cool) {%!g(int64=63570890170) %!g(int32=842211000) %!g(*time.Location=&{UTC [] [] 0 0 })}}
key 记录为...
2015/06/29 03:04:08 INFO: Key:0
body 转储:
2015/06/29 14:00:34 INFO: Body:{"Key":"5593215650496512","Title":"Example Article 8","Text":"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio. Praesent libero. Sed cursus ante dapibus diam. Sed nisi. Nulla quis sem at nibh elementum imperdiet. Duis sagittis ipsum. Praesent mauris. Fusce nec tellus sed augue semper porta. Mauris massa. Vestibulum lacinia arcu eget nulla. ","Author":"Matt Ridley","Tags":"test,so-cool","Posted":"2015-06-29T13:28:06.168062Z"}
几天来我一直在努力解决这个问题,所以任何见解都将不胜感激。谢谢!
最佳答案
当您 Unmarshal 到您的文章中时,您忽略了错误。您应该会看到 json: cannot unmarshal string into Go value of type int64
,因为正文中的 Key
值正在被格式化为字符串。
如果它是您所期望的,那么您可以通过向标记添加 string
选项来告诉 json 包使用它:
type Article struct {
Key int64 `json:"Key,string" datastore:"-"`
Title string
Text string `datastore:",noindex"`
Author string
Tags string
Posted time.Time
}
关于angularjs - 使用 Go 为 Rest API 返回 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31107212/