Идентификатор возвращает 0 для API отдыха с Go

0

Я пытаюсь создать простой API-интерфейс REST, используя Go, используя Google App Engine и его хранилище данных и AngularJS на интерфейсе. Я смог получить все, кроме редактирования. И я не уверен, почему JSON не исправляет ошибки.

Struct:

type Article struct {
    Key    int64    'json:"Key" datastore:"-"'
    Title  string
    Text   string   'datastore:",noindex"'
    Author string
    Tags   string
    Posted time.Time
}

Когда я загружаю статью, я заполняю свойство Key значением id из хранилища данных. Пример: 5593215650496512

Я сохраняю это поле в скрытом входе в мою форму и отправляю содержимое формы как JSON через HTTP-сообщение на ходу.

Перед отправкой я вижу, что ключ имеет правильное значение. Вот форма:

                <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>

Объект $ scope.article прямо перед сообщением http:

Автор: "Matt Ridley" Ключ: "5593215650496512" Опубликовано: "2015-06-29T12: 57: 20.833525Z" Теги: "test, so-cool" Текст: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio Преданный либеро. 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. "Название:" Пример Статья 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 (строка = пример статьи 8)%! G (строка = Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer Невероятный либеро. 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})}}

Ключ записывается как...

2015/06/29 03:04:08 INFO: Ключ: 0

Свалка кузова:

2015/06/29 14:00:34 INFO: Тело: {"Ключ": "5593215650496512", "Название": "Пример статьи 8", "Текст": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Одиже. Преданный либеро. 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. "," Автор ":" Matt Ridley "," Tags ":" test, so-cool "," Добавлено ":" 2015-06-29T13: 28: 06.168062Z "}

Я несколько раз бил головой об этом в течение нескольких дней, поэтому любое понимание было бы оценено. Благодарю!

Теги:
go
rest
google-app-engine

1 ответ

1
Лучший ответ

Вы игнорируете ошибку, когда используете Unmarshal в своей статье. Вы должны увидеть json: cannot unmarshal string into Go value of type int64, потому что значение Key в теле форматируется как строка.

Если это то, что вы ожидаете, вы можете сказать json-пакет, чтобы использовать его, добавив параметр string в тег:

type Article struct {
    Key    int64    'json:"Key,string" datastore:"-"'
    Title  string
    Text   string   'datastore:",noindex"'
    Author string
    Tags   string
    Posted time.Time
}
  • 0
    Я перепроверил свой журнал, и не вижу этой ошибки. Не уверен, почему ... это бы очень помогло. Обновился как предложено и все работает. Спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню