原本覺得對跨域問題的處理已經比較熟練了。能夠經過jsonp、document.domain+iframe、window.name、window.postMessage、服務器上設置代理頁面來解決。但仍是遇到了難題dva封裝的request:java
1.robe-ajax用它來調其餘網站的api,會報跨域問題怎麼設置也沒用。ajax
2.fetch能夠經過設置mode:no-cors來解決跨域,但到checkStatus時會報錯,network能看到response。編程
3.jq ajax設置dataType:jsonp,jsonp:callback解決跨域,但因爲是異步,與yield衝突沒法在success回調時調用yield put修改state。json
最後仍是決定在服務端調api,由於跨域的安全限制都是指瀏覽器端來講的,服務器端是不存在跨域安全限制的,因此經過服務器端httpclient方式完成「跨域訪問」,而後在瀏覽器端用dva的request來間接完成跨域訪問也是能夠的。api
愈來愈多的 Java 應用程序須要直接經過 HTTP 協議來訪問網絡資源。雖然在 JDK 的 java.net 包中已經提供了訪問 HTTP 協議的基本功能,可是對於大部分應用程序來講,JDK 庫自己提供的功能還不夠豐富和靈活。HttpClient 是 Apache Jakarta Common 下的子項目,用來提供高效的、最新的、功能豐富的支持 HTTP 協議的客戶端編程工具包,而且它支持 HTTP 協議最新的版本和建議。跨域
// 根據地址獲取請求數組
HttpGet request = new HttpGet(url);// get請求瀏覽器
// 獲取當前客戶端對象安全
HttpClient httpClient = new DefaultHttpClient();服務器
// 經過請求對象獲取響應對象
HttpResponse response = httpClient.execute(request);
// 判斷網絡鏈接狀態碼是否正常(0--200都數正常)
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
result=EntityUtils.toString(response.getEntity(),"utf-8"); }
String url="http://XXX.."; //POST的URL HttpPost httppost=new HttpPost(url); //創建HttpPost對象 List<NameValuePair> params=new ArrayList<NameValuePair>(); //創建一個NameValuePair數組,用於存儲欲傳送的參數 params.add(new BasicNameValuePair("pwd","2544")); //添加參數 httppost.setEntity(new UrlEncodedFormEntity(params,HTTP.UTF_8)); //設置編碼 HttpResponse response=new DefaultHttpClient().execute(httppost); //發送Post,並返回一個HttpResponse對象 if(response.getStatusLine().getStatusCode()==200){//若是狀態碼爲200,就是正常返回 String result=EntityUtils.toString(response.getEntity());
好比發送get請求:
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.URL; import java.net.URLConnection; import java.util.List; import java.util.Map; public class HttpRequest { /** * 向指定URL發送GET方法的請求 * * @param url * 發送請求的URL * @param param * 請求參數,請求參數應該是 name1=value1&name2=value2 的形式。 * @return URL 所表明遠程資源的響應結果 */ public static String sendGet(String url, String param) { String result = ""; BufferedReader in = null; try { String urlNameString = url + "?" + param; URL realUrl = new URL(urlNameString); // 打開和URL之間的鏈接 URLConnection connection = realUrl.openConnection(); // 設置通用的請求屬性 connection.setRequestProperty("accept", "*/*"); connection.setRequestProperty("connection", "Keep-Alive"); connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); // 創建實際的鏈接 connection.connect(); // 獲取全部響應頭字段 Map<String, List<String>> map = connection.getHeaderFields(); // 遍歷全部的響應頭字段 for (String key : map.keySet()) { System.out.println(key + "--->" + map.get(key)); } // 定義 BufferedReader輸入流來讀取URL的響應 in = new BufferedReader(new InputStreamReader( connection.getInputStream(),"utf-8"));//防止亂碼 String line; while ((line = in.readLine()) != null) { result += line; } } catch (Exception e) { System.out.println("發送GET請求出現異常!" + e); e.printStackTrace(); } // 使用finally塊來關閉輸入流 finally { try { if (in != null) { in.close(); } } catch (Exception e2) { e2.printStackTrace(); } } return result; }