对于具有数据正文的任何方法,对于具有数据正文的任何方法,[[Spring boot 2.2,使用具有默认netty的curl --http2
作为服务器],即使正文只是{"A":"B"}
,服务器也会对大型实体响应413。虽然我没有身体尝试过,但效果很好。这是一个错误吗?
$ curl --http2 -X POST -v http://172.27.12.61:8889/a \
> -H 'content-type: application/json' \
> -d '{
> "A": "B"
> }
> '
Note: Unnecessary use of -X or --request, POST is already inferred.
* timeout on name lookup is not supported
* Trying 172.27.12.61...
* TCP_NODELAY set
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0* Connected to 172.27.12.61 (172.27.12.61) port 8889 (#0)
> POST /a HTTP/1.1
> Host: 172.27.12.61:8889
> User-Agent: curl/7.51.0
> Accept: */*
> Connection: Upgrade, HTTP2-Settings
> Upgrade: h2c
> HTTP2-Settings: AAMAAABkAAQAAP__
> content-type: application/json
> Content-Length: 15
>
} [15 bytes data]
* upload completely sent off: 15 out of 15 bytes
< HTTP/1.1 413 Request Entity Too Large
< content-length: 0
<
* Curl_http_done: called premature == 0
100 15 0 0 100 15 0 483 --:--:-- --:--:-- --:--:-- 483
* Connection #0 to host 172.27.12.61 left intact
由于您指定了http
方案(而不是https
),并要求curl
使用HTTP / 2,所以curl
将尝试执行从HTTP / 1.1升级到HTTP / 2的操作从日志中看到。
典型的HTTP / 1.1升级是使用GET
而不是POST
进行的,特别是HTTP / 1.1到WebSocket的升级。
服务器似乎不准备接受带有正文的POST
作为升级尝试,并由于不希望出现正文而回复413。
如果您尝试不带主体的GET
,则可能会成功。
或者,如果您知道端口8889接受先验知识的明文HTTP / 2(即,您可以直接向该端口发送HTTP / 2字节,而不必执行HTTP / 1.1升级),则可以尝试:
curl --http2-prior-knowledge -X POST http://172.27.12.61:8889/a ...
如果使用https
方案,则将通过ALPN协商HTTP / 2协议,并且不会进行HTTP / 1.1升级,可能是继POST
请求之后。