1. 程式人生 > >JavaScript跨域呼叫基於JSON的RESTful API

JavaScript跨域呼叫基於JSON的RESTful API

本部落格歡迎轉載,轉載時請以超連結形式標明文章原始出處!謝謝!

1. 基本術語
  • AJAX(Asynchronous JavaScript And XML,非同步JavaScript和XML):AJAX是一種用於建立快速動態網頁的技術,通過在後臺與伺服器進行少量資料交換,AJAX可以使網頁實現非同步更新。這意味著可以在不重新載入整個網頁的情況下,對網頁的某部分進行更新。
  • JSON(JavaScript Object Notation):JSON是一種輕量級的資料交換格式,可以看成是由大括號包裹起來的多個"key/value"對,格式如下:{"firstName":"Brett", "lastName":"McLaughlin", "email":"
    [email protected]
    "}。
  • Cross Domain(跨域):跨域問題是由於JavaScript語言安全限制中的同源策略造成的,當在頁面上使用AJAX請求訪問其他伺服器的資料時,客戶端就會出現跨域問題。
  • Same Origin Policy(同源策略):同源策略是指一段指令碼只能讀取來自同一來源的視窗和文件的屬性,域名、協議、埠均相同,即是同源。

2. JavaScript跨域解決方案
目前主要有三種JavaScript跨域解決方案:
  • 基於iframe實現跨域:兩個頁面必須屬於一個基礎域(例如都是xxx.com,或是xxx.com.cn),使用同一協議(例如都是HTTP)和同一埠(例如都是80)。iframe方案對域名、協議、埠的限制太多,用處不大。
  • 基於Script標籤實現跨域(JSONP方案):JSONP(JSON with Padding)是JSON的一種“使用模式”,是一種非官方的跨域資料互動協議,可用於解決主流瀏覽器的跨域資料訪問的問題。JSONP方案的侷限性在於:JSONP只能實現GET請求。
  • 基於後臺代理實現跨域(CORS方案):CORS(Cross-Origin Resource Sharing,跨域資源共享)是一個W3C標準,它允許瀏覽器向跨源伺服器發出XMLHttpRequest請求,從而克服了AJAX只能同源使用的限制。

3. 基於後臺代理實現跨域(CORS方案)

具體解決方案如下:
① 伺服器端
伺服器端需要在正常的HTTP迴應中增加Access-Control-Allow-Origin、Access-Control-Allow-Methods、Access-Control-Allow-Headers等欄位。
我的伺服器端是用Python寫的,HTTP請求呼叫的webob.Request。
修改辦法是,在“res = req.get_response(self.app)”這行程式碼之後,需要增加如下幾行內容:
res.headerlist.append(('Access-Control-Allow-Origin', '*'))
res.headerlist.append(('Access-Control-Allow-Methods', 'GET, POST'))
res.headerlist.append(('Access-Control-Max-Age', '3600'))
res.headerlist.append(('Access-Control-Allow-Headers', 'Access-Control-Allow-Origin, Access-Control-Allow-Methods, Access-Control-Max-Age, X-Auth-Token, Content-Type, Accept'))
其中,Access-Control-Allow-Origin最好限制為前端的訪問地址,這樣才相對安全,例如:
res.headerlist.append(('Access-Control-Allow-Origin', 'http://10.111.121.26:8080'))

另外,Access-Control-Max-Age可以設定CORS相關配置的快取時間,這樣客戶端就不必每次都先進行一次預檢請求(Preflight Request)。

預檢請求會先向伺服器端發出一個OPTIONS方法、包含“Origin”頭的請求。只有該請求獲得允許以後,才會發起真實的跨域請求。

所以,伺服器端在對X-Auth-Token進行鑑權時還需要放過預檢請求,例如:

def process_request(self, req):
    if (req.headers.get('X-Auth-Token') != 'open-sesame') and (req.method != 'OPTIONS'):
        return exc.HTTPForbidden()

② 客戶端
HTTP請求需要注意到幾個地方:
data需要保證是JSON格式的字串;
contentType規定了編碼格式是UTF8;
dataType規定了返回內容是JSON格式。
具體的呼叫程式碼如下:
data_param = {"timeType":"LAST_7_DAYS", "hostType":"ALL_HOSTS"}
$.ajax({
    url:"http://172.16.17.11:41128/dpi/webApp/eventRetrieve",  
    type: "POST",
    data:JSON.stringify(data_param),
    headers:{
        "X-Auth-Token":"open-sesame",
        "Content-Type":"application/json"
    },
    contentType: 'text/html; charset=UTF-8',   	
    dataType: "json",
    success: function(data) {
        alert(data); // Object
    },
    error: function(XMLHttpRequest, textStatus, errorThrown) {
        alert(XMLHttpRequest.status);
        alert(XMLHttpRequest.readyState);
        alert(textStatus);
    },
    complete: function(XMLHttpRequest, textStatus) {
    }
});

相關推薦

JavaScript呼叫基於JSON的RESTful API

本部落格歡迎轉載,轉載時請以超連結形式標明文章原始出處!謝謝! 1. 基本術語AJAX(Asynchronous JavaScript And XML,非同步JavaScript和XML):AJAX是一種用於建立快速動態網頁的技術,通過在後臺與伺服器進行少量資料交換,A

AJAX 呼叫 快遞查詢API介面

javascript預設是允許跨域操作的,比如a.com下不能操作b.com下的DOM,ajax也一樣。但是javascript卻允許從a.com從b.com引用js檔案,JSONP正式跟據這個原理實現了跨域操作。下面這個例子是採用jQuery框架的getJSON方法,注意

[Express] 如何允許Ajax呼叫API

Express的api介面允許Ajax跨域呼叫API var express = require('express'); var router = express.Router(); router.

django做服務端 window.name javascript實現原理及實例

字符串 tex 並且 ble blog char src 兩個 splay 項目地址:https://github.com/blff122620/jsLibary/tree/master/crossDomainDemo 原理如下:window.name 傳輸技術,原本是 T

WebSocket 解決javascript問題一劑良藥

群發 通過 網上服務 script nss 項目 經驗 子頁面 時間 近日做項目中遇到javascript跨域問題,父頁面和子頁面要通信,並且父子頁面跨域,怎麽辦? 大家結合以前經驗,想到了Websocket,websocket客戶端編程比較簡單,服務端我們用

javascript

想要 如果 .cn https 直接 fun 獲取json 為什麽 cross 什麽是跨域? 為什麽瀏覽器要限制跨域? 以上的問題在相關博客介紹的更為詳盡,不做描述。 帶來了哪些問題? 我再8097端口想要訪問8090的靜態資源(字體或者css什麽的)是被

javascript訪問探索之旅

是否 list 好的 掌握 HR edi 性能 擁有 developer 需求: ??????? 近期工作負責一個互聯網應用A(我公司應用)與還有一個互聯網應用B進

webapi (MVC-Web API: 405 method not allowed問題 )

image all div sta alt release new enable attr 使用webapi cors 1.安裝包:Install-Package Microsoft.AspNet.WebApi.Cors –IncludePrerelease

[整理]JavaScript解決方法大全

跨域的定義:Javascript出於安全性考慮,同源策略機制對跨域訪問做了限制。域僅僅是通過“URL的首部”字串進行識別,“URL的首部”指window.location.protocol +window.location.host,也可以理解為“Domains, protocols and por

WebApi的ajax呼叫以及HttpClient的呼叫

前言 兩種網路服務: WebService:基於SOAP風格的網路服務,使用方法進行請求 WebAPI:基於REST風格的網路服務,使用資源進行請求 5個方法:查一個,查所有,增加,修改,刪除 使用 《1》js的非同步(缺點:不能跨域) 《2》HttpClient WebApi

楊老師課堂之Jquery的篩選,事件,效果,Ajax,javascript)

1 篩選[掌握]  篩選與之前“選擇器”雷同,篩選提供函式 1.1 過濾 eq(index|-index),獲取第N個元素 •index:一個整數,指示元素基於0的位置,這個元素的位置是從0算起。 •-index:一個整數,指示元素的位置,從集合中的最後一個元素開

用postMessage解決通訊和呼叫js問題

本文轉自:https://bbs.implug.cn/?thread-3.htm 平時做web開發的時候關於訊息傳遞,除了客戶端與伺服器傳值,還有幾個經常會遇到的問題: 多視窗之間訊息傳遞(newWin = window.open(…)); 頁面與巢狀的iframe訊息傳遞

javascript 請求

post 方法一 服務端 header('Access-Control-Allow-Origin:*'); $data = json_encode(array("id" => "1", "name" => "tom")); echo $data; 前端 $

javascript:什麼是,如何(轉載自小鬍子哥)

---恢復內容開始---   無數次看到:Origin null is not allowed by Access-Control-Allow-Origin , 網路沒有讓你絕望,但是或許會讓你蛋疼,因為你找了半天沒看到一個比較實用的解決方案,亦或者水平不夠,別人寫的東西累贅沒看懂,抑或是。。。

angular2jsonp如何請求百度API進行定位

前提,百度api的申請,不會的可以百度一下,下面是連線 1.appMoudle裡引入 import {JsonpModule} from "@angular/http"; 2.要匯入的檔案.ts檔案 import {Jsonp, URLSearchParams} from "@angular/http"

jquery中的jsonp呼叫(介面)

                                            &

JavaScript問題之CORS方法與JSONP的對比

什麼是跨域? 只要協議、域名、埠有任何一個不同,都會被當成不同的域。而JavaScript同源政策的限制,無法進行跨域呼叫 解決方法: 1.跨域資源共享(CORS): 定義了在訪問跨域資源時,瀏覽器與伺服器應該如何溝通。背後的基本思想就

Spring MVC jsonp呼叫 中文亂碼問題處理

一、問題描述 最近專案中使用了Spring MVC開發了一個api介面伺服器,介面呼叫要求需支援jsonp跨域形式呼叫。在自己開發和測試過程中未發現有中文亂碼問題,因為是在瀏覽器中直接輸入url方式進行呼叫,應答回來的都是正常的中文;但當前端呼叫介面使用時,就出現中文亂碼

java呼叫介面(呼叫函式)

一個工程中的主要方法: public Map ky(Map map){ String url = "http://localhost:8080/api/json/ky.action"; Map reMap = new HashMap(); try{ if(map.siz

Ajax呼叫後臺Restful介面時的JSON轉換方法

類:AjaxExchange 作用:將後臺取到的資料以JSON或HTML的形式返回 package org.sun.com; import java.io.OutputStreamWriter; import java.io.PrintWriter; import jav