最近在弄一個sip網頁集成版軟電話,為了功能的完善,呼叫中心的工作人員為我們提供了一個http接口,我先在網頁中直接打開分析了一下他的返回值,然后又放到js中去訪問,結果一放到js中一訪問就發現瀏覽器會提示:
剛開始我百思不得其解,查詢過表頭中未找到源http://localhost:8080,原本我還以為是在發送的時候我的表頭有問題,但是用html5設置表頭嘗試了幾次,發現還是提示一樣的問題,於是我又在網上查詢了一下0x80070005這個錯誤代碼,網上提示說是屬於跨域了,於是我又跟着網上的方法試了一下:
方法一:get方式獲取
$.ajax({ dataType:'jsonp',
url:"http://10.0.0.230/asterccinterfaces?EVENT=GetCdr&orgidentity=dc&user=7501&password=7501&pwdtype=plaintext",
date:'get'
success: function(data){ alert(data) } ,
});
對於跨域的訪問,只能使用get,並且要設置dataType,有的朋友這個樣設置之后就可以成功運行了,但是很可惜也不知道是電腦的設置問題還是什么,反正這個方法在我這里無效,於是我又繼續嘗試,突然就想到了瀏覽器的安全權限設置,於是有了方法二
方法二:瀏覽器安全站點設置
1.將訪問地址加入受信任站點:http://10.0.0.230
2.點擊自定義,將通過域訪問數據源設置為啟用
這種方法如果是固定電腦使用的話,那還是蠻方便的,但是如果大面積的客戶端訪問服務器那就不行了,畢竟我們不可能讓每一個客戶都修改自己的瀏覽器吧,更何況有的人還不會,特別是一些商業網,這是更不允許的。因此這個方法建議大家視情況而用。
方法三:后台發送請求接收返回數據:參照http://blog.csdn.net/sd0902/article/details/10097457
public class HttpInvoker {
public static final String GET_URL = "http://10.0.0.230/asterccinterfaces";
public static final String POST_URL = "http://10.0.0.230/asterccinterfaces";
public static void readContentFromGet() throws IOException {
// 拼湊get請求的URL字串,使用URLEncoder.encode對特殊和不可見字符進行編碼
String getURL = GET_URL + "??EVENT=GetCdr&orgidentity=dc&user=7501&password=7501&pwdtype=plaintext&username=" + URLEncoder.encode("fat man", "utf-8");
URL getUrl = new URL(getURL);
// 根據拼湊的URL,打開連接,URL.openConnection函數會根據URL的類型,
// 返回不同的URLConnection子類的對象,這里URL是一個http,因此實際返回的是HttpURLConnection
HttpURLConnection connection = (HttpURLConnection) getUrl.openConnection();
// 進行連接,但是實際上get request要在下一句的connection.getInputStream()函數中才會真正發到
// 服務器
connection.connect();
// 取得輸入流,並使用Reader讀取
BufferedReader reader = new BufferedReader(new InputStreamReader(
connection.getInputStream()));
System.out.println("=============================");
System.out.println("Contents of get request");
System.out.println("=============================");
String lines;
while ((lines = reader.readLine()) != null) {
System.out.println(lines);
}
reader.close();
// 斷開連接
connection.disconnect();
System.out.println("=============================");
System.out.println("Contents of get request ends");
System.out.println("=============================");
}
public static void readContentFromPost() throws IOException {
// Post請求的url,與get不同的是不需要帶參數
URL postUrl = new URL(POST_URL);
// 打開連接
HttpURLConnection connection = (HttpURLConnection) postUrl.openConnection();
// Output to the connection. Default is
// false, set to true because post
// method must write something to the
// connection
// 設置是否向connection輸出,因為這個是post請求,參數要放在
// http正文內,因此需要設為true
connection.setDoOutput(true);
// Read from the connection. Default is true.
connection.setDoInput(true);
// Set the post method. Default is GET
connection.setRequestMethod("POST");
// Post cannot use caches
// Post 請求不能使用緩存
connection.setUseCaches(false);
// This method takes effects to
// every instances of this class.
// URLConnection.setFollowRedirects是static函數,作用於所有的URLConnection對象。
// connection.setFollowRedirects(true);
// This methods only
// takes effacts to this
// instance.
// URLConnection.setInstanceFollowRedirects是成員函數,僅作用於當前函數
connection.setInstanceFollowRedirects(true);
// Set the content type to urlencoded,
// because we will write
// some URL-encoded content to the
// connection. Settings above must be set before connect!
// 配置本次連接的Content-type,配置為application/x-www-form-urlencoded的
// 意思是正文是urlencoded編碼過的form參數,下面我們可以看到我們對正文內容使用URLEncoder.encode
// 進行編碼
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
// 連接,從postUrl.openConnection()至此的配置必須要在connect之前完成,
// 要注意的是connection.getOutputStream會隱含的進行connect。
connection.connect();
DataOutputStream out = new DataOutputStream(connection
.getOutputStream());
// The URL-encoded contend
// 正文,正文內容其實跟get的URL中'?'后的參數字符串一致
String content = "firstname="