如何在仆人中接收带有Reqbody的POST



下面的代码应该能够发送json主体。但我总是收到以下请求的错误:

curl -X POST -i http://localhost:8080/comtrade --data 'name=nut&age=12'

错误消息为:

Status Code: 405 Method Not Allowed
content-type: text/plain
date: Fri, 12 Mar 2021 18:49:04 GMT
server: Warp/3.3.14
transfer-encoding: chunked
人能告诉我如何让服务服务器接收POST消息吗?

Fyodor Soikin在评论中指出,OP中的cURL示例没有发布JSON,而是发布URL编码的数据。如果对cURL使用-v(verbose(选项而不是-i:,则可以看到这一点

$ curl -v http://localhost:8080/comtrade -d "{ "name": "nut", "age": 12 }"
*   Trying ::1:8080...
* TCP_NODELAY set
*   Trying 127.0.0.1:8080...
* TCP_NODELAY set
* Connected to localhost (127.0.0.1) port 8080 (#0)
> POST /comtrade HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.67.0
> Accept: */*
> Content-Length: 28
> Content-Type: application/x-www-form-urlencoded
>
* upload completely sent off: 28 out of 28 bytes
* Mark bundle as not supporting multiuse
< HTTP/1.1 405 Method Not Allowed
< Transfer-Encoding: chunked
< Date: Sat, 13 Mar 2021 12:52:59 GMT
< Server: Warp/3.2.28
< Content-Type: text/plain
<
Only GET or HEAD is supported

请注意,Content-Type就是application/x-www-form-urlencoded

ReqBody '[JSON] User类型声明API期望主体为JSON。那么,您需要做的第一件事就是发布JSON而不是URL编码的数据。

然而,这本身是不够的:

$ curl -v http://localhost:8080/comtrade -d "{ "name": "nut", "age": 12 }"
*   Trying ::1:8080...
* TCP_NODELAY set
*   Trying 127.0.0.1:8080...
* TCP_NODELAY set
* Connected to localhost (127.0.0.1) port 8080 (#0)
> POST /comtrade HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.67.0
> Accept: */*
> Content-Length: 28
> Content-Type: application/x-www-form-urlencoded
>
* upload completely sent off: 28 out of 28 bytes
* Mark bundle as not supporting multiuse
< HTTP/1.1 405 Method Not Allowed
< Transfer-Encoding: chunked
< Date: Sat, 13 Mar 2021 12:56:42 GMT
< Server: Warp/3.2.28
< Content-Type: text/plain
<
Only GET or HEAD is supported

请注意,cURL仍然默认Content-Typeapplication/x-www-form-urlencoded。由于API被声明为接收JSON,所以您必须明确地告诉它JSON:

$ curl -i http://localhost:8080/comtrade -H "Content-Type: application/json" -d "{ "name": "nut", "age": 12 }"
HTTP/1.1 200 OK
Transfer-Encoding: chunked
Date: Sat, 13 Mar 2021 12:58:09 GMT
Server: Warp/3.2.28
Content-Type: application/json;charset=utf-8
12

据我所知,Haskell代码没有任何问题。这是一个正确使用HTTP协议的问题。

最新更新