HttpClient服務端發送http請求

原本覺得對跨域問題的處理已經比較熟練了。能夠經過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"); }

  • 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;
    }
相關文章
相關標籤/搜索