【问题标题】:Unmarshal body response from task queue从任务队列中解组正文响应
【发布时间】:2015-06-07 14:19:55
【问题描述】:

我正在使用 go 和 google 任务队列来创建一些同步作业。

我已成功将数据传递给 worker 方法,但我无法解组数据以使用它。

我尝试了不同的方法,我得到一个解组错误

 err um &json.SyntaxError{msg:"invalid character 'i' in literal false (expecting 'a')", Offset:2}

这就是我将数据发送到队列的方式

    keys := make(map[string][]string)
    keys["filenames"] = req.FileNames // []string

    t := taskqueue.NewPOSTTask("/deletetask", keys)
    _, err = taskqueue.Add(ctx, t, "delete")

这就是我试图解组它的方式

 type Files struct {
fileNames string `json:"filenames"`
 }


func worker(w http.ResponseWriter, r *http.Request) {
c := appengine.NewContext(r)

var objmap map[string]json.RawMessage
b, err := ioutil.ReadAll(r.Body)
if err != nil {
    c.Debugf("err io  %#v", err)
}
c.Debugf("b  %#v", string(b[:])) //Print: b  "filenames=1.txt&filenames=2.txt"

err = json.Unmarshal(b, &objmap)
if err != nil {
    c.Debugf("err um %#v", err)
}
 //this didn't work as well  same err
    f := []Files{}
    err = json.Unmarshal(b, &f)
 }

【问题讨论】:

标签: google-app-engine go


【解决方案1】:

任务的参数作为 POST 值发送,您将字符串切片分配为键 filenames 的 POST 值。

然后您尝试将完整的 POST 请求正文反序列化为 JSON。

一个简单的解决方案是将每个文件拆分为一个任务,然后将文件名作为字符串值发送,然后它会是这样的:

// Add tasks
for i := range req.FileNames {
    postValues := url.Values{}
    postValues.Set("fileName", req.FileNames[i])

    t := taskqueue.NewPOSTTask("/deletetask", postValues)
    if _, err := taskqueue.Add(ctx, t, "delete"); err != nil {
        c.Errorf("Failed add task, error: %v, fileName: %v", err, req.FileNames[i])
    }
}

// The actual delete worker
func worker(w http.ResponseWriter, r *http.Request) {
    ctx := appengine.NewContext(r)
    fileName := r.FormValue("fileName")

    ctx.Infof("Deleting: %v", fileName)
}

【讨论】:

    猜你喜欢
    • 2013-12-16
    • 1970-01-01
    • 1970-01-01
    • 2020-09-22
    • 1970-01-01
    • 1970-01-01
    • 2012-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多