Ajax跨域訪問(從入手到解決)

第一步:開發環境 .net 

第二步:通過webService返回的數據集,經過Json處理後,返回的是json數據格式,而不是datatable;

第三步:在aspx中或mvc中,用jQuery 的ajax調用這個接口的方法。

此時,就會報出很多的錯誤,理想情況下,會出現“Uncaught SyntaxError: Unexpected token : ”,首先感謝幻夢的https://blog.csdn.net/huanmeng122/article/details/81508724?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task這篇文章,由淺入深,由原理講到實踐,讓我徹底明白跨域是個怎麼回事了。首先呢,我先記下同源策略(域名,協議,端口三個都要相同)

然後,就要解決這個問題,雖然研究完畢後,覺得很簡單,但是對我剛上手來講,還是查閱了大量資料纔得到這些解決方法的。

那麼,此時有兩種方法解決:

第一種:JSONP方式;第二種:CORS方式;

根據接口的出處,開發者可自己選擇合適的方式;

比如,接口是自己公司寫的,可以進行重寫,那麼,就用JSONP方式,當然,不想費事,也可選擇CORS方式;接口如果是第三方公司所寫,此時,必須使用CORS方式。

廢話不多說,下面就詳細講講這兩種方式吧。

JSONP方式:

第一步:修改webService返回結果集(只寫關鍵代碼)。

string msg = JsonString.ToString();//JsonString:結果集的json串
string callback = Context.Request.Params["callback"];//定義Jsonp的名稱,默認callback
Context.Response.Write(callback + "(" + msg + ")");
            Context.Response.End();

第二步:修改ajax的調用方式

 $('#lr_test2').on('click', function () {
                console.log('11')
                $.ajax({
                    type: "get",
                    async: false,
                    url: webServiceUrl+"/DTJC_Data?callback=?",
                    dataType: "jsonp",//返回數據類型:Jsonp方式
                    jsonp: "callback", //這裏和接口服務端的參數名稱對應
                    //jsonp: "callbackparam",//服務端用於接收callback調用的function名的參數
                    //jsonpCallback: "success_jsonpCallback",//callback的function名稱
                    data: { "strP_WellID": "CQ98aSmc6Z", "strP_Table": "Q_CJ_JTFSJC" },//測試數據

                    success: function (json) {
                        console.log(json);
                    },
                    error: function () {
                        alert('fail');
                    }
                });
            });

測試後,訪問成功,感興趣的可在F12,network下看到網頁會自動生成一個callback的參數名稱,並將數據包裹起來。

CORS方式:

這個就更簡單了,

第一步,找到接口發佈的iis上的web.config文檔,在configuration節點下輸入:

<system.webServer>
<httpProtocol>
    <customHeaders>
      <add name="Access-Control-Allow-Origin" value="*" />
      <add name="Access-Control-Allow-Headers" value="X-Requested-With,Content-Type,Accept,Origin" />
      <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE,OPTIONS" />
    </customHeaders>
</httpProtocol>
    </system.webServer>

如果位置輸入錯誤,會報配置節點錯誤的。

第二步,ajax調用

 $('#lr_test3').on('click', function () {
                $.ajax({
                    type: "get",
                    async: true,
                    url: webServiceUrl+"/DTJC_Data,
                    dataType: "json",//此時依然是json
                   data: { "strP_WellID": "CQ98aSmc6Z", "strP_Table": "Q_CJ_JTFSJC" },//測試數據

                    success: function (json) {
                        console.log(json);
                    },
                    error: function () {
                        alert('fail');
                    }
                });
            });

測試後,訪問成功。

————————————————————————————————————————

下面是我找到的所有資料,雖然解決了覺得很簡單,但是從瞭解到解決還是看了大量資料的,隨筆記下來

jsonp的解決方案:
1.用底層ajax方法
2.用jquery 自帶的setJson方法
https://www.jianshu.com/p/2f0c8c026531

https://www.cnblogs.com/Chavezcn/p/7783234.html


https://blog.csdn.net/wqmain/article/details/8905287

https://www.cnblogs.com/JerryTian/p/4194900.html

https://www.cnblogs.com/freeweb/p/4908832.html

返回jsonp格式的字符串:
https://blog.csdn.net/qq_41999617/article/details/83962123?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

Cors方式 的解決方案:
http://www.ruanyifeng.com/blog/2016/04/cors.html
https://blog.csdn.net/lilin0800/article/details/79726922?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
https://blog.csdn.net/huanmeng122/article/details/81508724?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

Jsonp原始方法:
https://www.cnblogs.com/PengL-Net/p/5694877.html

https://www.liaoxuefeng.com/wiki/1022910821149312/1023022332902400

JSON規則:
JSON只有兩種數據類型描述符,大括號{}和方括號[],其餘英文冒號:是映射符,英文逗號,是分隔符,英文雙引號""是定義符。

  2、大括號{}用來描述一組“不同類型的無序鍵值對集合”(每個鍵值對可以理解爲OOP的屬性描述),方括號[]用來描述一組“相同類型的有序數據集合”(可對應OOP的數組)。

  3、上述兩種集合中若有多個子項,則通過英文逗號,進行分隔。

  4、鍵值對以英文冒號:進行分隔,並且建議鍵名都加上英文雙引號”",以便於不同語言的解析。

通俗易懂:
https://kb.cnblogs.com/page/139725/
https://www.liaoxuefeng.com/wiki/1022910821149312/1023022332902400
 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章