无法从本地主机使用JavaScript使基本的HTTP POST函数正常工作。
无法从本地主机使用Javascript的基本HTTP POST功能,请参考实际需要预先发送OPTIONS请求的答案:CORS - What is the motivation behind introducing preflight requests? 要禁用OPTIONS请求,必须满足以下条件:
1. 请求未设置自定义的HTTP头,如'application/xml'或'application/json'等。
2. 请求方法必须是GET、HEAD或POST之一。如果是POST,则内容类型应为application/x-www-form-urlencoded、multipart/form-data或text/plain之一。
参考资料:https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS
对于"custom HTTP headers"给予了+1!在我的情况下,它们导致预检请求被触发。我重构了请求,将我在头部发送的任何内容都作为请求体发送,然后OPTIONS请求停止发送。
application/xml或application/json不是"Custom HTTP headers"。头本身应该是Content-Type,将该头称为"custom"是具有误导性的。
删除自定义HTTP头,问题迎刃而解!但是,当我删除了这些头部时,对我来说,并没有发送OPTIONS请求。因此,"custom"在某种程度上是直观的,因为它的意思是"用户提供的",而不是"浏览器生成的"。
我一直在使用Axios + Elasticsearch调试CORS。删除所有头部,只需将请求发送到URL,问题迎刃而解。
我有一个使用C#服务器处理HTTP请求的项目。当我尝试使用ajax进行POST时,遇到了问题。我只是删除了'application/json'...哇,它工作了。
问题:无法在本地使用Javascript的基本HTTP POST函数工作。
原因:
根据CORS策略,浏览器在认为有必要时无法强制停止发送OPTIONS请求。要解决这个问题,有两种方法:
1. 确保你的请求是一个“简单请求”。
2. 为OPTIONS请求设置Access-Control-Max-Age。
解决方法:
1. “简单请求”的条件:
- 允许的方法只能是GET、HEAD和POST。
- 除了用户代理自动设置的头部(如Connection、User-Agent等),只能手动设置以下头部:
- Accept
- Accept-Language
- Content-Language
- Content-Type
- Content-Type头部的允许值只能是:
- application/x-www-form-urlencoded
- multipart/form-data
- text/plain
- 简单请求不会触发预检的OPTIONS请求。
2. 为OPTIONS请求设置缓存:
可以为OPTIONS请求设置Access-Control-Max-Age,以便在过期之前无需再次检查权限。
限制:
- 对于Chrome,Access-Control-Max-Age的最大值是600秒(即10分钟)。
- Access-Control-Max-Age每次只对一个资源有效。例如,相同URL路径但不同查询的GET请求将被视为不同的资源,因此对第二个资源的请求仍然会触发预检的OPTIONS请求。
以上是关于解决无法在本地使用Javascript的基本HTTP POST函数工作的问题的原因和解决方法。