本來以為對跨域問題的處理已經比較熟練了。可以通過jsonp、document.domain+iframe、window.name、window.postMessage、服務器上設置代理頁面來解決。但還是遇到了難題dva封裝的request:
1.robe-ajax用它來調其他網站的api,會報跨域問題怎么設置也沒用。
2.fetch可以通過設置mode:no-cors來解決跨域,但到checkStatus時會報錯,network能看到response。
3.jq ajax設置dataType:jsonp,jsonp:callback解決跨域,但由於是異步,與yield沖突無法在success回調時調用yield put修改state。
最后還是決定在服務端調api,因為跨域的安全限制都是指瀏覽器端來說的,服務器端是不存在跨域安全限制的,所以通過服務器端httpclient方式完成“跨域訪問”,然后在瀏覽器端用dva的request來間接完成跨域訪問也是可以的。
越來越多的 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"); }
- Apache也有一個發送post請求的方法:
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());
- Apache Client的get post方法發送請求在java中其實已經有內置了,只不過代碼稍復雜了一些
比如發送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; }