【问题标题】:Write the body of a request in datastore在数据存储中写入请求的正文
【发布时间】:2014-10-21 19:32:41
【问题描述】:

如何在数据存储区写入请求正文?

在我的 func init() 中,我使用 gorilla mux 声明了我的路由器,因此如果我向 /add 发出发布请求,我将需要向数据存储添加一些数据,但我只是从数据存储开始,所以我没有真的不知道怎么做。

我已经声明了一个结构项

type Item Struct {
  ID int64
  Type string `json:type`
}

路由器会重定向到函数CItem

func CItem(w http.ResponseWriter, r *http.Request) { 
  var item Item
  data := json.NewDecoder(r.Body).Decode(&item)
  defer r.Body.Close()
  fmt.Fprintln(w, data)
}

但是,例如,当我使用 paw 进行发布请求时,我得到: invalid character 'y' in literal true (expecting 'r')

或者使用 curl: curl -X POST -d "{\"type\": \"that\"}" http://localhost:8080/add

我该如何解决这个问题,接下来我需要做什么才能将我的数据存储在数据存储区中,一个小例子会很好。

【问题讨论】:

    标签: google-app-engine go


    【解决方案1】:

    到目前为止,这里有一些关于您的代码的 cmets 以及一个展示如何存储实体的快速示例:

    type Item Struct {
      ID int64
      Type string `json:"type"` // <-- quotes needed
    }
    
    func CItem(w http.ResponseWriter, r *http.Request) { 
       var item Item
       err := json.NewDecoder(r.Body).Decode(&item) // <-- decode returns an error, not data
       if err != nil {
            http.Error(w, err.Error(), 400)
            return
       }
       // defer r.Body.Close()  <-- no need to close request body
       fmt.Fprintln(w, item) // <-- print the decoded item
    
       c := appengine.NewContext(r)
       key, err := datastore.Put(c, datastore.NewIncompleteKey(c, "citem", nil), &item)
       if err != nil {
           http.Error(w, err.Error(), http.StatusInternalServerError)
           return
       }
       fmt.Fprintln(w, "key is", key)
    }
    

    【讨论】:

    • 唯一缺少的是c := appengine.NewContext(r)
    【解决方案2】:

    因此,您将拥有一个描述请求的类和另一个描述 NDB/DB 实体的类。您必须手动将请求中的数据点映射到数据存储对象,然后保存

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-13
      • 2015-12-13
      • 2014-08-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多