CORS:没有飞行前的GET,而是在飞行前的POST

时间:2017-08-08 21:47:44

标签: http post get cors preflight

我试图在我的应用程序中删除不必要的飞行前请求。为此我已经简化了请求的某些部分,删除了自定义标题等。但是遇到了问题 - GET请求现在可以在没有预先飞行的情况下正常工作,但POST请求仍然有它们。

我已遵循要求:

  1. 请求未设置自定义HTTP标头。
  2. 内容类型为" text / plain;字符集= UTF-8"
  3. 请求方法必须是GET,HEAD或POST之一。如果是POST,内容类型应该是application / x-www-form-urlencoded,multipart / form-data或text / plain。
  4. GET和POST请求都通过单个httpinvoke调用。

    作为一个例子 - GET请求不是在飞行前开始的:

      

    网址:http://mydomain/APIEndpoint/GETRequest?Id=346089&Token=f5h345

         

    请求方法:GET

         

    请求标题

         

    接受:*/*

         

    Accept-Encoding:gzip,deflate

         

    接受语言:UK-UA,UK; Q = 0.8,如; Q = 0.6,的en-US; Q = 0.4,连接; Q = 0.2

         

    缓存控制:无缓存

         

    连接:保持活力

         

    内容类型:文本/无格式; charset = utf-8

         

    主持人:正确的主人

         

    产地:http://localhost

         

    Pragma:no-cache

         

    Referer:正确的引用

         

    User-Agent:Mozilla / 5.0(Windows NT 10.0; Win64; x64)AppleWebKit / 537.36(KHTML,与Gecko一样)Chrome / 60.0.3112.90 Safari / 537.36

         

    查询字符串参数

         

    编号= 346089

         

    令牌= f5h345

    一个看起来非常相似的POST请求,但仍以飞行前开头:

      

    网址:http://mydomain/APIEndpoint/GETRequest?param=TEST

         

    请求方法:POST

         

    请求标题:

         

    接受:*/*

         

    Accept-Encoding:gzip,deflate

         

    接受语言:UK-UA,UK; Q = 0.8,如; Q = 0.6,的en-US; Q = 0.4,连接; Q = 0.2

         

    缓存控制:无缓存

         

    连接:保持活力

         

    的Content-Length:11

         

    内容类型:文本/无格式; charset = UTF-8

         

    主机:

         

    原产地:http://localhost

         

    Pragma:no-cache

         

    的Referer:   User-Agent:Mozilla / 5.0(Windows NT 10.0; Win64; x64)AppleWebKit / 537.36(KHTML,与Gecko一样)Chrome / 60.0.3112.90 Safari / 537.36

         

    查询字符串参数:

         

    PARAM:TEST

         

    请求有效负载

         

    {MyData:{}}

    任何建议将不胜感激!谢谢!

    ====更新===

    根据要求,发布POST请求的转机前请求:

      

    网址:http://mydomain/APIEndpoint/GETRequest?param=TEST

         

    请求方法:选项

         

    状态代码:200 OK

         

    响应标题

         

    访问控制允许来源:*

         

    缓存控制:无缓存

         

    的Content-Length:0

         

    日期:2017年8月9日星期三08:02:16 GMT

         

    过期:-1

         

    杂注:无缓存

         

    服务器:IIS / 8.5

         

    X-ASPNET-版本:4.0.30319

         

    X供电-通过:ASP.NET

         

    请求标题

         

    接受:*/*

         

    Accept-Encoding:gzip,deflate

         

    接受语言:UK-UA,UK; Q = 0.8,如; Q = 0.6,的en-US; Q = 0.4,连接; Q = 0.2

         

    访问控制请求-方法:POST

         

    缓存控制:无缓存

         

    连接:保活

         

    主持人:正确的主人

         

    产地:http://localhost

         

    杂注:无缓存

         

    Referer:正确的引用

         

    User-Agent:Mozilla / 5.0(Windows NT 10.0; Win64; x64)AppleWebKit / 537.36(KHTML,与Gecko一样)Chrome / 60.0.3112.90 Safari / 537.36

         

    查询字符串参数

         

    PARAM:TEST

    它是使用httpinvoke库的遗留代码。实际执行调用的代码段:

    _converters: {
        'text json': function (input, reviver) {},
        'json text': JSON.stringify
    };
    
    headers = {
        'Content-Type': 'text/plain; charset=utf-8'
    };
    
    data = {params: "test"};
    
    httpinvoke(url, method.toUpperCase(), {
        corsExposedHeaders: ['Content-Type'],
        headers: headers,
        input: data,
        converters: _converters,                
        inputType: 'json',
        outputType: 'json',
        timeout: self._getMessageTimeout()
    }).then(function (res) {}, function (error) {});
    

2 个答案:

答案 0 :(得分:3)

如果在XMLHttpRequestUpload对象上注册了事件侦听器(强制执行预检;请参阅the note on the use-CORS-preflight flag中的https://xhr.spec.whatwg.org/a related note中的https://fetch.spec.whatwg.org/和{{}在the updated documentation on CORS preflight requests中的3}}。

httpinvoke会这样做吗?

答案 1 :(得分:1)

@Anne提到了POST发送飞行前请求的原因,尽管请求本身符合“简单请求”的规则(因此不需要预先飞行)是在XMLHttpRequestUpload事件侦听器中。

代码中可能没有提到XMLHttpRequestUpload本身,但您总是可以在xhr.upload变量中找到它。这是http-invoke库的情况。

完全无辜的代码如:

xhr.upload.onprogress = onuploadprogress;

实际上会导致强制性的飞行前请求。

感谢所有帮助解决此问题的人。