登录
首页 >  Golang >  Go问答

超出范围的响应:WriteHeader 指定了 StatusOK

来源:stackoverflow

时间:2024-03-24 17:09:49 119浏览 收藏

在处理文件集合的代码中,作者遇到一个错误:http:多余的响应。writeheader call。原因是 w.WriteHeader(http.StatusOK) 不能多次使用。作者需要找到一种方法在处理每个文件时将数据直接返回给客户端,同时确保响应仍然是有效的 JSON。

问题内容

在我的代码中,我有一个循环处理文件集(基于预先指定的文件夹中可用的文件),并根据每个处理文件的输出,将一些信息发送到客户端,所以我写了以下:

    for i, file := range files {
        uniqueSlice := unique(matches)
        output = Output{MSG: "ok", File: file, Skills: uniqueSlice}
        data, err := json.Marshal(output)
        if err != nil {
            panic(err)
        }
        w.Header().Set("Content-Type", "application/json")
        w.WriteHeader(http.StatusOK) // -< Error from here
        w.Write(data)
    }

如果文件夹有一个文件,上面的工作正常,但如果有多个文件,我收到错误:http:多余的响应。writeheader call 我知道该错误是由于使用 w.writeheader(http.statusok) 造成的,它不能多次使用来设置,但我需要为客户端设置它来处理返回的数据。

如何修复此代码,以便在处理每个文件时可以将数据直接返回给客户端。

更新 如果我按照下面评论中的建议删除 http.statusok ,那么我会得到返回的纯文本而不是 json!


正确答案


您不能只是将 json 文档连接在一起并期望结果是有效的 json 编码。您必须将 output 对象放入一个数组中,然后在最后输出该数组一次,否则响应将不是有效的 json。

如果像代码一样单独输出对象,最终数据将如下所示

{"msg": "ok", "file": "...", "skills": [...]}{"msg": "ok", "file": "...", "skills": [...]}{"msg": "ok", "file": "...", "skills": [...]}

这些输出中的每一个本身都是有效的,但是包含刚刚连接在一起的对象的整个输出不是

理想情况下,当将 json 输出到像 http 响应这样的流时,不要将其存储在中间缓冲区 (data) 中,而是使用 json.newencoder(w),其中 w 是 http 响应编写器。流式传输几乎总是比渲染到变量更好。

var outputs = make([]Output,0,len(files)
    for i, file := range files {
        uniqueSlice := unique(matches)
        outputs = append(outputs, Output{MSG: "ok", File: file, Skills: uniqueSlice})
    }
    w.Header().Set("Content-Type", "application/json")
    w.WriteHeader(http.StatusOK)
    if err := json.NewEncoder(w).Encode(outputs); err != nil {
       panic(err)
    }

理论要掌握,实操不能落!以上关于《超出范围的响应:WriteHeader 指定了 StatusOK》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>