HTTP 请求体编码用 json 还是 x-www-form-urlencoded
application/x-www-form-urlencoded
application/json
axios 和 superagent 默认使用 JSON body
来自专家的建议
The Stripe API is organized around REST. Our API has predictable resource-oriented URLs, accepts form-encoded request bodies, returns JSON-encoded responses, and uses standard HTTP response codes, authentication, and verbs
-- Stripe Docs
Creating or updating a resource involves performing an HTTP PUT or HTTP POST to a resource URI. In the PUT or POST, you represent the properties of the object you wish to update as form urlencoded key/value pairs. Don't worry, this is already the way browsers encode POSTs by default. But be sure to set the HTTP Content-Type header to "application/x-www-form-urlencoded" for your requests if you are writing your own client.
-- Twilio Docs
一些重要的事项
URL 编码数组是一个麻烦事
URL 编码
application/x-www-form-urlencoded
对 Postman 友好
HTTP GET /partners[]=Apple&partners[]=Microsoft&partners[]=Activision
等同于下列 JSON 编码格式
JSON 编码
application/json
对初学者十分友好
HTTP GET /
{"partners":["Apple","Microsoft","Activision"]}
json 会造成预检请求问题(CORS)
这是使用 application/x-www-form-urlencoded
的一个理由,因为预检请求的顺序问题总是先发送 POST 请求的预检请求
Preflight OPTIONS requests are always sent with JSON
一名开发者的回复
Ali Sherief
•[20年7月5日 • Edited on 7月5日](https://dev.to/bcanseco/request-body-encoding-json-x-www-form-urlencoded-ad9#comment-11d5i)
My app was using application/json to make requests to my API but I found a downside to it. The preflighted OPTIONS request is sent in order, but the actual POST/GET/whatever request is sent arbitrarily later after the next requests have been made. So this wrecks a stateful API if you send a POST with application/json before navigating to another page and GETing the same application/json there because the OPTIONS request for the POST will be sent first, then the next GET, then the POST itself.
For this reason I try to use application/x-www-form-urlencoded as much as possible. Preflighted requests can make race conditions.
我的应用程序使用 application/json
向我的 API 发出请求,但我发现它有一个缺点。 预检请求 OPTIONS 按顺序发送,但实际的 POST/GET/whatever 请求是在发出下一个请求后任意发送的。 因此,如果您在导航到另一个页面并在其中获取相同的 application/json
之前发送带有 application/json
的 POST,则会破坏有状态 API,因为将首先发送 POST 的 OPTIONS 请求,然后发送下一个 GET,然后发送 POST 本身。
因此,我尝试尽可能使用 application/x-www-form-urlencoded
。 预检请求可能会产生竞争条件。