一、Java訪問遠程url接口並獲取結果
1、原生JavaAPI獲取
package com.util; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.net.URLEncoder; import java.util.Map; /** * <pre> * 功能:httpUrlConnection訪問遠程接口工具 * 日期:2015年3月17日 上午11:19:21 * </pre> */ public class HttpUrlConnectionUtil { /** * <pre> * 方法體說明:向遠程接口發起請求,返回字符串類型結果 * @param url 接口地址 * @param requestMethod 請求方式 * @param params 傳遞參數 重點:參數值需要用Base64進行轉碼 * @return String 返回結果 * </pre> */ public static String httpRequestToString(String url, String requestMethod, Map<String, String> params){ String result = null; try { InputStream is = httpRequestToStream(url, requestMethod, params); byte[] b = new byte[is.available()]; is.read(b); result = new String(b); } catch (IOException e) { e.printStackTrace(); } return result; } /** * <pre> * 方法體說明:向遠程接口發起請求,返回字節流類型結果 * 作者:itar * 日期:2015年3月17日 上午11:20:25 * @param url 接口地址 * @param requestMethod 請求方式 * @param params 傳遞參數 重點:參數值需要用Base64進行轉碼 * @return InputStream 返回結果 * </pre> */ public static InputStream httpRequestToStream(String url, String requestMethod, Map<String, String> params){ InputStream is = null; try { String parameters = ""; boolean hasParams = false; //將參數集合拼接成特定格式,如name=zhangsan&age=24 for(String key : params.keySet()){ String value = URLEncoder.encode(params.get(key), "UTF-8"); parameters += key +"="+ value +"&"; hasParams = true; } if(hasParams){ parameters = parameters.substring(0, parameters.length()-1); } //請求方式是否為get boolean isGet = "get".equalsIgnoreCase(requestMethod); //請求方式是否為post boolean isPost = "post".equalsIgnoreCase(requestMethod); if(isGet){ url += "?"+ parameters; } URL u = new URL(url); HttpURLConnection conn = (HttpURLConnection) u.openConnection(); //請求的參數類型(使用restlet框架時,為了兼容框架,必須設置Content-Type為“”空) conn.setRequestProperty("Content-Type", "application/octet-stream"); //conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); //設置連接超時時間 conn.setConnectTimeout(50000); //設置讀取返回內容超時時間 conn.setReadTimeout(50000); //設置向HttpURLConnection對象中輸出,因為post方式將請求參數放在http正文內,因此需要設置為ture,默認false if(isPost){ conn.setDoOutput(true); } //設置從HttpURLConnection對象讀入,默認為true conn.setDoInput(true); //設置是否使用緩存,post方式不能使用緩存 if(isPost){ conn.setUseCaches(false); } //設置請求方式,默認為GET conn.setRequestMethod(requestMethod); //post方式需要將傳遞的參數輸出到conn對象中 if(isPost){ DataOutputStream dos = new DataOutputStream(conn.getOutputStream()); dos.writeBytes(parameters); dos.flush(); dos.close(); } //從HttpURLConnection對象中讀取響應的消息 //執行該語句時才正式發起請求 is = conn.getInputStream(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return is; } }
2、利用httpClient訪問獲取
package com.util; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.util.Map; import org.apache.http.HttpResponse; import org.apache.http.auth.AuthScope; import org.apache.http.auth.UsernamePasswordCredentials; import org.apache.http.client.CredentialsProvider; import org.apache.http.client.methods.HttpDelete; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.methods.HttpPut; import org.apache.http.client.methods.HttpRequestBase; import org.apache.http.client.protocol.HttpClientContext; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.BasicCredentialsProvider; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.params.CoreConnectionPNames; import org.apache.http.util.EntityUtils; /** * <pre> * 功能:httpClient訪問遠程接口工具類 * 日期:2015年3月17日 上午11:19:21 * </pre> */ @SuppressWarnings("deprecation") public class HttpClientUtil { /** * <pre> * 方法體說明:向遠程接口發起請求,返回字符串類型結果 * @param url 接口地址 * @param requestMethod 請求類型 * @param params 傳遞參數 * @return String 返回結果 * </pre> */ public static String httpRequestToString(String url, String requestMethod, Map<String, String> params, String ...auth){ //接口返回結果 String methodResult = null; try { String parameters = ""; boolean hasParams = false; //將參數集合拼接成特定格式,如name=zhangsan&age=24 for(String key : params.keySet()){ String value = URLEncoder.encode(params.get(key), "UTF-8"); parameters += key +"="+ value +"&"; hasParams = true; } if(hasParams){ parameters = parameters.substring(0, parameters.length()-1); } //是否為GET方式請求 boolean isGet = "get".equalsIgnoreCase(requestMethod); boolean isPost = "post".equalsIgnoreCase(requestMethod); boolean isPut = "put".equalsIgnoreCase(requestMethod); boolean isDelete = "delete".equalsIgnoreCase(requestMethod); //創建HttpClient連接對象 DefaultHttpClient client = new DefaultHttpClient(); HttpRequestBase method = null; if(isGet){ url += "?" + parameters; method = new HttpGet(url); }else if(isPost){ method = new HttpPost(url); HttpPost postMethod = (HttpPost) method; StringEntity entity = new StringEntity(parameters); postMethod.setEntity(entity); }else if(isPut){ method = new HttpPut(url); HttpPut putMethod = (HttpPut) method; StringEntity entity = new StringEntity(parameters); putMethod.setEntity(entity); }else if(isDelete){ url += "?" + parameters; method = new HttpDelete(url); } method.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 6000); //設置參數內容類型 method.addHeader("Content-Type","application/x-www-form-urlencoded"); //httpClient本地上下文 HttpClientContext context = null; if(!(auth==null || auth.length==0)){ String username = auth[0]; String password = auth[1]; UsernamePasswordCredentials credt = new UsernamePasswordCredentials(username,password); //憑據提供器 CredentialsProvider provider = new BasicCredentialsProvider(); //憑據的匹配范圍 provider.setCredentials(AuthScope.ANY, credt); context = HttpClientContext.create(); context.setCredentialsProvider(provider); } //訪問接口,返回狀態碼 HttpResponse response = client.execute(method, context); //返回狀態碼200,則訪問接口成功 if(response.getStatusLine().getStatusCode()==200){ methodResult = EntityUtils.toString(response.getEntity()); } client.close(); }catch (UnsupportedEncodingException e) { e.printStackTrace(); }catch (IOException e) { e.printStackTrace(); } return methodResult; } }