angularjs - 使用 Go 为 Rest API 返回 0

标签 angularjs rest google-app-engine go

我一直在尝试使用 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/

相关文章:

java - 使用 jersey-Rest 的 Post 方法并从 url 获取参数

python - flask Restful : passing parameters to GET request

javascript - 使用他们的 API 从 AWS S3 获取一个非公开的 JavaScript 文件

java - GAE Datastore Admin Backup 在 mapreduce 上失败并显示 404

java - Cloud Endpoints 为作为命名参数传递的特殊字符生成 HTTP 404

javascript - 当前行的 ng-hide 和 ng-show

javascript - Angular $q.all 在第一个 promise 完成后被调用

google-app-engine - GAE java.lang.IllegalStateException : Must call one of set*BlobStorage() first

javascript - Angular 和 Laravel - 从 mysql 获取数据

javascript - 使用 LESS js 为 AngularJS 指令渲染 CSS