js POST调用api接口时,由于OPTIONS请求导致服务器异常
1.学习心得
当你搜到这个问题时,就表示你已经知道了脚本POST请求接口时,会先执行一次OPTIONS类型的请求。至于为什么会这样,在此就不做描述了,想知道的小伙伴可以查一下;本文主要将我在现实中遇到的问题以及怎么解决的做一个描述;这是我第一次写,不合适的地方还请见谅。
虽然说OPTIONS请求时不太重要,但服务端还是会接收并处理的,当我们忽略这次操作去写代码的时候,很大可能会栽在这里。
2.问题描述
当时我在写一个webapi类型的项目,在对项目进行允许跨域访问设置后,就开始写接口了。
设置代码如下:
2.1 在全局应用函数Global.asax中加入
protected void Application_BeginRequest()
{
//OPTIONS请求方法的主要作用:
//1、获取服务器支持的HTTP请求方法;也是黑客经常使用的方法。
//2、用来检查服务器的性能。如:AJAX进行跨域请求时的预检,需要向另外一个域名的资源发送一个HTTP OPTIONS请求头,用以判断实际发送的请求是否安全。
if (Request.Headers.AllKeys.Contains("Origin") && Request.HttpMethod == "OPTIONS")
{
//表示对输出的内容进行缓冲,执行page.Response.Flush()时,会等所有内容缓冲完毕,将内容发送到客户端。
//这样就不会出错,造成页面卡死状态,让用户无限制的等下去
Response.Flush(); }
}
2.2 在配置文件中加入
<system.webServer>
<httpProtocol>
<!--新增加-->
<customHeaders>
<add name="Access-Control-Allow-Methods" value="OPTIONS,POST,GET" />
<add name="Access-Control-Allow-Headers" value="x-requested-with,content-type,clientKey,token" />
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Expose-Headers" value="servicekey"/>
</customHeaders>
</httpProtocol>
</system.webServer>
说到这里,顺便说一下,配置文件中的两处我自定义的参数值是什么意思

这个代表接口请求方,可以在头部添加“clientkey”,“token”这两个key;

这个代表接口返回时,调用方可以获取头部信息的哪些key。
调用的时候才发现,由于OPTIONS请求没有携带参数,导致我接口处理的时候,参数接收不到,而我也没有处理参数为空的情况;虽说犯这种错误我也有点不好意思,但我觉得并不是加个参数为空的处理就能完美解决的。
当然,这么解决貌似也可以。
3.解决方案
我的出发点是要让接口处理时,如果碰到OPTIONS请求,就不让接口进控制器了,直接结束此次执行。于是我就在全局应用函数Global.asax中多加了一行代码

这样一来,打断点是不走控制器了。那问题也解决了。
4.总结
虽然这样是可以解决问题,但并不是所有业务都需要这样写。解决问题应从实际出发,了解问题本质,在解决问题。有时间的小伙伴可以了解一下OPTIONS请求的原因,再结合自己的业务,多考虑一下,是否合适。
此文由博主精心撰写转载请保留此原文链接
版权声明:如有雷同纯属巧合,如有侵权请及时联系本人修改,谢谢!!!
js POST调用api接口时,由于OPTIONS请求导致服务器异常的更多相关文章
- php下api接口的并发http请求
php下api接口的并发http请求 ,提高app一个页面请求多个api接口,页面加载慢的问题: func_helper.php/** * 并发http请求 * * [ * 'url' //请求地址 ...
- 使用egg.js开发后端API接口系统
什么是Egg.js Egg.js 为企业级框架和应用而生,我们希望由 Egg.js 孕育出更多上层框架,帮助开发团队和开发人员降低开发和维护成本.详细的了解可以参考Egg.js的官网:https:// ...
- web api写api接口时返回
web api写api接口时默认返回的是把你的对象序列化后以XML形式返回,那么怎样才能让其返回为json呢,下面就介绍两种方法: 方法一:(改配置法) 找到Global.asax文件,在Applic ...
- C#使用windows服务定时调用api接口
使用VS创建windows服务项目: 创建好项目 会出现一个设计界面 右键弹出对话框 选择添加安装程序 名字什么的自己可以改: 项目目录: 打开项目中的ProjectInstaller.Design ...
- Python调用API接口的几种方式 数据库 脚本
Python调用API接口的几种方式 2018-01-08 gaoeb97nd... 转自 one_day_day... 修改 微信分享: 相信做过自动化运维的同学都用过API接口来完成某些动作.AP ...
- Python调用API接口的几种方式
Python调用API接口的几种方式 相信做过自动化运维的同学都用过API接口来完成某些动作.API是一套成熟系统所必需的接口,可以被其他系统或脚本来调用,这也是自动化运维的必修课. 本文主要介绍py ...
- 调用API接口,查询手机号码归属地(3)
从mysql数据库获取电话号码,查询归属地并插入到数据库 #!/usr/bin/python # -*- coding: utf-8 -*- import json, urllib, sys, pym ...
- 调用API接口,查询手机号码归属地(2)
使用pymysql pip install pymysql 创建mysql测试表 CREATE TABLE `userinfo` ( `id` int(20) NOT NULL AUTO_INCREM ...
- 调用API接口,查询手机号码归属地(1)
使用https://www.juhe.cn/提供的接口,查询归属地 在官网注册key即可使用. 代码如下 #!/usr/bin/python # -*- coding: utf-8 -*- impor ...
随机推荐
- mysql 主键自增设置,插入数据就不必再设置了。
(完)
- 设置overflow:hiden行内元素会发生偏移的现象
父级元素包含几个行内元素 <div id="box"> <p> <span>按钮</span> <span>测试文字文字 ...
- CSS通过text-transform实现大写、小写和首字母大写转换
再日常项目中可能会用到一些特殊的样式,比如大写字母转小写.小写字母转大写.首字母大写等. 可以通过 CSS 的 text-transform 属性来实现: text-transform 转换不同的文本 ...
- Git上传本地项目到远程仓库
一.在gitee或其他仓库上创建工程,名称需要和本地工程名称一致. 二.找到本地项目工程,进入工程目录,如下图,然后依次执行下列命令: 1.git init //初始化本地仓库 2. git add ...
- Layui文本框限制正整数
<input type="text" name="Number" lay-verify="required|integer" plac ...
- 三分钟了解 Python3 的异步 Web 框架 FastAPI
快速编码,功能完善.从启动到部署,实例详解异步 py3 框架选择 FastAPI 的原因. FastAPI 介绍 FastAPI 与其它 Python-Web 框架的区别 在 FastAPI 之前,P ...
- 数据可视化之powerBI入门 (一)认识PowerBI
来自 https://zhuanlan.zhihu.com/p/64144024 Power BI是什么? Power BI是微软推出的数据分析和可视化工具,我们先来看看微软官方是怎么介绍的: Po ...
- 数据可视化之powerBI技巧(十九)DAX作图技巧:使用度量值动态分组和配色
有了前两篇关于分组的铺垫,这篇文章就来学习一个分组的经典应用,图表的动态分组,并对分组动态配色. 假设有十几个产品,每个产品的销售额,是随着时间而变化的,想知道某个时间的每一个产品的销售额与平均销售额 ...
- Active Directory - Creating users via PowerShell
Method1: Create a user by executing the following PowerShell Script. New-ADUser -name 'Michael Jorda ...
- Python Ethical Hacking - VULNERABILITY SCANNER(6)
EXPLOITATION - XSS VULNS EXPLOITING XSS Run any javascript code. Beef framework can be used to hook ...