Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何为解析错误定制HTTP 400响应?_Http_Go_Error Handling_Bad Request_Media Type - Fatal编程技术网

如何为解析错误定制HTTP 400响应?

如何为解析错误定制HTTP 400响应?,http,go,error-handling,bad-request,media-type,Http,Go,Error Handling,Bad Request,Media Type,我已经编写了一个RESTAPI服务,它要求所有响应都是JSON。但是,当GoHTTP请求解析器遇到错误时,它会以纯文本响应的形式返回400,而不会调用我的处理程序。例如: > curl -i -H 'Authorization: Basic hi there' 'http://localhost:8080/test' -v * Trying ::1... * TCP_NODELAY set * Connected to localhost (::1) port 8080 (#0

我已经编写了一个RESTAPI服务,它要求所有响应都是JSON。但是,当GoHTTP请求解析器遇到错误时,它会以纯文本响应的形式返回400,而不会调用我的处理程序。例如:

> curl -i -H 'Authorization: Basic hi    
there' 'http://localhost:8080/test' -v
*   Trying ::1...
* TCP_NODELAY set
* Connected to localhost (::1) port 8080 (#0)
> GET /test HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.54.0
> Accept: */*
> Authorization: Basic hi
> there
> 
< HTTP/1.1 400 Bad Request
HTTP/1.1 400 Bad Request
< Content-Type: text/plain; charset=utf-8
Content-Type: text/plain; charset=utf-8
< Connection: close
Connection: close

< 
* Closing connection 0
>curl-i-H'授权:基本hi
有“http://localhost:8080/test“-v
*正在尝试::1。。。
*TCP_节点集
*已连接到本地主机(::1)端口8080(#0)
>获取/测试HTTP/1.1
>主机:本地主机:8080
>用户代理:curl/7.54.0
>接受:*/*
>授权:基本hi
>那里
> 

请注意无效的授权标头。当然400是正确的回答,但它是文本/普通的。是否有办法将Go http解析器配置为使用自定义错误响应媒体类型和正文?

如果您使用的是标准的net/http库,则可以使用以下代码。看看这个答案,我从中得到了这个例子

func homeHandler(w http.ResponseWriter, r *http.Request) {
    if r.URL.Path != "/" {
        errorHandler(w, r, http.StatusNotFound)
        return
    }
    fmt.Fprint(w, "welcome home")
}

func errorHandler(w http.ResponseWriter, r *http.Request, status int) {
    w.WriteHeader(status)
    if status == http.StatusNotFound {
        // JSON Out here
    }
}

你不能。您可以在net/http源代码中找到,只有在请求格式不正确时才会发生这种情况:

我想你的问题可能是你在卷曲中添加的标题中有一行新词

401403404500错误您可以使用json响应,但错误请求或错误头(太长、格式错误)在server.go中处理

目前还没有办法截获此类错误,尽管它正在运行中,所以您在go中的唯一解决方案将是修补stdlib源代码(我不建议这样做)。但是,由于此错误仅在客户端出错且请求格式不正确时出现,因此可能不是什么大问题。文本响应的原因是,浏览器或类似的客户端(比如不带-v的curl)不会只看到空响应。你可以在你的应用程序前面放一个像nginx这样的代理,但是你永远也看不到这个请求,因为它是一个错误的请求,你的代理会处理它

如果您为它设置一个特定的静态错误页面来处理400个错误,并处理一个您指定的400.json文件,那么您可能可以在前面使用一个类似nginx的代理来处理它?这是我能想到的唯一解决办法。类似这样的指令可能适用于nginx:

error_page 400 /400.json;

如果您希望能够自定义这些错误,可以在链接的问题上添加注释,让他们知道您遇到了这个特定问题

您是否在使用某种框架?我从未在stdlib http handler.Nope中见过这种行为。这是一个。400和404不是一回事。请阅读问题。我担心这会是答案。是的,换行是错误。不,这不是什么大问题,只是我必须将API记录为“总是返回JSON,除非Go https在我的代码看到请求之前返回错误”。我很感激希望在响应中包含一个主体(尽管这个主体缺少细节;我花了一段时间才找到错误),但理想情况下,我可以以某种方式控制所有响应的内容类型和内容。将对该问题发表评论,谢谢!