.Net Core Web Api_笔记07_HTTP资源操作模式OPTIONS

[HttpOptions] 用於获得自URI的资源在Request/Response过程可使用的功能选项。
,跟HTTP Head有点类似但差异在於会回传Body内文,属於HTTP请求中的Preflight Request (预检请求)类型。

主要使用情境跟时机在於client端再进行请求资源之前可先做提前检查来判定要做何种措施,
可对ajax跨域请求Cross-Origin Resource Sharing (CORS)做一些提前检查。

由於Preflight Request (预检请求)再请求发送时候符合的语法格式如下

Access-Control-Allow-Methods: <method>, <method>, ...

Access-Control-Allow-Methods: *

举例:

Access-Control-Allow-Methods: POST, GET, OPTIONS 

需要先至Startup.cs做一些程序调整,来启用Api Server-Side的Options功能。

首先需要引入Microsoft.AspNetCore.Http 命名空间

using Microsoft.AspNetCore.Http;

接着至Startup.cs中的Configure() method去对UseStaticFiles()做程序微调

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    //启用静态资源可存取性
    app.UseStaticFiles(new StaticFileOptions()
    {
        OnPrepareResponse = _context =>
        {
            _context.Context.Response.Headers.Append("Access-Control-Allow-Methods", "GET,POST");
        }
    });
    app.UseRouting();
    

    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
    });
}

我们在Response Header增加自定义的Key-Value Pair
允许HTTP透过GET、POST来请求

在TeacherController.cs中去增加option 的action method

[HttpOptions("check")]
public string CheckServer()
{
    return "from Server message";
}

接着一样新增一html页面来模拟client-side 呼叫
OptionsTeacher.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>Options测试</title>
    <script src="jquery/jquery.min.js"></script>
</head>
<body>
    <div>
        <input type="button" id="btnOptions" value="options call" />
        <span id="msg"></span>
    </div>

    <script type="text/javascript">
        $("#btnOptions").click(function () {
            $.ajax({
                //请求模式
                type: "options",
                //请求的URL
                url: "api/Teacher/check",
                success: function (result, status, xhr) {
                    $("#msg").html(result);
                }
            });
        });
    </script>
</body>
</html>

这里在执行第一次页面GET请求时会发现
Network这增加一些额外Header资讯

之前的其他页
https://ithelp.ithome.com.tw/upload/images/20210907/201074521bxWftcqrB.png

options这一页
https://ithelp.ithome.com.tw/upload/images/20210907/20107452mRsM7gcXVY.png

可以发现Request跟Response Header都有增加一些额外资讯

送出请求後
https://ithelp.ithome.com.tw/upload/images/20210907/20107452Ht9TcpdSmG.png

Ref:
Preflight request
https://developer.mozilla.org/en-US/docs/Glossary/Preflight_request

Access-Control-Allow-Headers
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Headers

Access-Control-Allow-Methods
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Methods

HTTP headers | Access-Control-Allow-Methods
https://www.geeksforgeeks.org/http-headers-access-control-allow-methods/

本文同步发表至个人部落格
https://coolmandiary.blogspot.com/2021/09/net-core-web-api07httpoptions.html


<<:  Node套件运用测试

>>:  Day-6 老玩家在新电视的怀旧神器、FrameMeister XRGB-mini

Day 27 - 资料视觉化与API - 将资料转化成艺术

前言 觉得这个文章,花了太多时间在写但有些设定好像应该 更把他分的更清楚而不是一直只丢范例出来解释。...

30天学会C语言: Day 10-你的字串不是字串

字元 电脑中的字元其实是由整数数字表示,就像是每一个字元都有一个属於自己的编号, 用 printf(...

Day03 - 个体、对象以及状态

小回顾 Day01 - 缘起:怎麽了?为什麽?如何掌握过於自由的程序码? 以订单、RPG 角色的移动...

Day28 资安小结 - 红队与蓝队 ( 内附名字由来 )

打了这麽多的技术文,突然发现我好像都没有介绍到资安的基础,所以最後的这 3 篇文章可能就是做个资安的...

Day 12. 生命周期 - Lifecycle Hooks

Instance Lifecycle 生命周期 介绍完怎麽建立Vue instance 後,接着来谈...