㈠ js调用跨域get请求调用webApi 多出个options请求是为什么
我尝试用我的语言描述一下吧:
先说跨域请求的原理,浏览器的安全机制是不允许出现跨域请求的,否则会有很严重的安全问题,解决跨域问题有几种不同的方法,你题目中提到的方法就是通过在Response header中添加Access-Control-Allow-Origin 来让浏览器知道服务器所在的域,对用于访问的域进行了授权。
但是因为这个Header要服务器提供,所以无论如何,请求是要先发出去才能指导是不是允许跨域请求,所以在报跨域错误的时候,虽然报错了,但是请求实际上依然发送到服务器了,只是浏览器看了一眼服务器的返回,然后发觉不行,这个请求返回的header里没有授权,所以浏览器不能用。
这样就带来一个问题,请求会对服务器造成影响,试想一下,要使用XHR跨域提交一个表单,无论返回头里面是否添加了跨域的header,都会提交一个请求到服务器,服务器要进行相应的操作。这种情况其实在一定条件下也是可以接受的,但是如果有更大的安全隐患,就不可以了,所以就需要OPTIONS请求了。
OPTIONS请求就是在符合一定条件下的跨域请求发送之前,浏览器会先发一个OPTIONS请求,问一下服务器,是不是能跨域,如果能,就发真正的请求,如果不能,就不发了。这个的作用就很好理解了。
如上面所说,不是所有的跨域请求都要先发OPTIONS请求的,规范里面规定,以下情况不需要先发一个 OPTIONS请求:
请求类型必须是GET、HEAD、POST中的一种。
请求的Header里面只能包涵一些规范重点Header,以及规范的值,包括:Accept、Accept-Language、Content-Language、Content-Type、DPR、Downlink、Save、Data、Viewport-Width、Width
Content-Type的类型必须是以下几种:application/x-www-form-urlencoded、multipart/form-data、text/plain
所以,如果你不希望浏览器多余的发一个OPTIONS请求,只要遵循这个规范就可以了。
但是有时候因为需求原因,也难避免要自定义一些Header。比如,很多JS的AJAX库,都会自定义一个Header,让服务器可以识别出这是否是一个异步请求,这样OPTIONS请求就一定要被先发送了。
顺便说,服务器端也要判断OPTIONS类型的请求,进行一系列操作,不要让OPTIONS请求影响到数据。
更多内容,可以看相关资料和文档:
https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS
https://developer.mozilla.org/en-US/docs/Web/HTTP/Server-Side_Access_Control
https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html
㈡ JAVA调用WEBAPI查看客户信息失败,怎么办
设置的内容如下
Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.View.common.kdsvc
BD_Customer
{"CreateOrgId":100040,"Number":"001.001.0001"}
返回的错误信息如下
{"Result":{"ResponseStatus":{"ErrorCode":500,"IsSuccess":false,"Errors":[{"FieldName":"给定关键字不在字典中。","Message":" 在 System.Collections.Generic.Dictionary`2.get_Item(TKey key)\r\n 在 Kingdee.BOS.WebApi.FormService.View.Execute()\r\n 在 Kingdee.BOS.WebApi.FormService.BillOperationService.ExecuteOperation(FormOperation op, String data)"}],"SuccessEntitys":[]}}}
修改传入参数,把Id补上(不知道Id值),如下
{"CreateOrgId":100040,"Number":"001.001.0001","Id":"String"}
此时返回的错误信息如下
{"Result":{"ResponseStatus":{"ErrorCode":500,"IsSuccess":false,"Errors":[{"FieldName":"输入字符串的格式不正确。","Message":" 在 System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)\r\n 在 System.Number.ParseInt64(String value, NumberStyles options, NumberFormatInfo numfmt)\r\n 在 Kingdee.BOS.WebApi.FormService.View.Execute()\r\n 在 Kingdee.BOS.WebApi.FormService.BillOperationService.ExecuteOperation(FormOperation op, String data)"}],"SuccessEntitys":[]}}}
㈢ 请问html的js调用webapi接口
引用jquery,有很方便的GET调用方法:
<!DOCTYPEhtml>
<html>
<head>
<metahttp-equiv="content-type"content="text/html;charset=UTF-8">
<metaname="viewport"content="width=device-width,initial-scale=1">
<!--src值为文件位置路径-->
<scripttype="text/javascript"charset="UTF-8"src="javascript/jquery-1.12.1.js"></script>
<title>测试案例</title>
<!--语法:jQuery.getJSON(url,data,success(data,status,xhr))-->
<scripttype="text/javascript"charset="UTF-8">
functiongetToken(){
$.getJSON("http://localhost/kdapi/api/access_token",{"id":111,"secret":2352532},function(result){
alert(result.access_token);
});
}
</script>
</head>
<body>
<buttononclick="getToken()"style="width:120px;height:60px;">获取Token</button>
</body>
</html>
㈣ 如何使用程序调用webApi接口
functiongetAPI(url){
returnnewPromise((resolve,reject)=>{
$.ajax({
url:url,
type:'GET',
dataType:'json',
data:{param1:'value1'},
})
.done(function(data){
resolve({data:data})
})
});
}
let_api=awaitthis.getAPI(url);
这是我用ES6与异步方式写的url就是调用的API地址