Java网络编程(三)HttpUrlConnection与HttpClient详解(雷惊风)
Java中常用的网络编程库和工具介绍
Java中常用的网络编程库和工具介绍在当今互联网时代,网络编程成为了软件开发中不可或缺的一部分。
Java作为一种广泛应用的编程语言,拥有丰富的网络编程库和工具,为开发者提供了便捷的网络编程解决方案。
本文将介绍一些常用的Java网络编程库和工具。
一、SocketSocket是Java中最基本、最底层的网络编程工具之一。
它提供了一种用于网络通信的机制,通过TCP或UDP协议实现数据的传输。
使用Socket可以方便地创建客户端和服务器端的网络连接,并进行数据的读写操作。
Socket的使用相对较底层,需要开发者自行处理数据的拆分和组装,适合对网络编程有一定了解的开发者使用。
二、NIO(New IO)NIO是Java提供的一种新的I/O模型,相对于传统的阻塞式I/O,NIO提供了更高效的I/O操作方式。
NIO中的核心概念是通道(Channel)和缓冲区(Buffer),通过使用Selector来实现非阻塞式的I/O操作。
NIO的优势在于可以同时处理多个连接,提高了系统的并发性能。
NIO适用于需要高并发处理的网络编程场景,如服务器开发。
三、NettyNetty是一个基于NIO的高性能网络编程框架,它提供了一系列的抽象和组件,简化了网络编程的复杂性。
Netty的设计目标是提供快速、简单、可靠的网络编程解决方案,广泛应用于服务器开发、分布式系统、游戏开发等领域。
Netty提供了事件驱动、异步的编程模型,使得开发者可以方便地处理大量的并发连接和高并发请求。
四、Apache HttpClientApache HttpClient是一个功能强大的HTTP客户端库,用于发送HTTP请求和接收HTTP响应。
它支持各种HTTP协议,包括HTTP/1.1、HTTP/2和WebSocket 等。
HttpClient提供了简洁的API,使得开发者可以轻松地进行HTTP通信。
它可以用于编写爬虫、访问Web服务、模拟用户行为等场景。
记录一下JAVA环境下如何在代理下使用HttpURLConnection
记录一下JAVA环境下如何在代理下使用HttpURLConnectionProperties prop = System.getProperties();// 设置http访问要使用的代理服务器的地址prop.setProperty("http.proxyHost", "代理服务器地址");// 设置http访问要使用的代理服务器的端口prop.setProperty("http.proxyPort", "代理服务器的端口");// 设置http访问要使用的代理服务器的用户名prop.setProperty("http.proxyUser", "用户名");// 设置http访问要使用的代理服务器的密码prop.setProperty("http.proxyPassword", "密码");用Java编写通过代理访问的应用程序本技巧将向您讲述如何编写可通过代理访问因特网上的Web服务器的Java应用程序。
在Java应用程序中加入代理支持只需额外编写几行代码,且不依赖任何安全性“漏洞”。
几乎所有的公司都十分关注保护自己的内部网络,以防黑客及入窃者。
一种常见的安全措施是完全断开与因特网的连接。
如果黑客们不能连接到您的任何一台机器,他们就不能非法进入您的系统。
这种策略产生的不利副作用是,内部用户无法访问外部的因特网服务器,如Yahoo或JavaWorld。
为了解决这一问题,网络管理员通常安装“代理服务器”。
实际上,代理是安装于因特网和内部网之间的一种服务,用来管理这两个领域之间的连接。
代理有助于减少安全性的外部威胁,同时还允许内部用户访问因特网服务。
尽管Java使得编写因特网客户机不再困难,但是如果客户机不能通过代理,则它们毫无用处。
幸运的是,Java使得使用代理支持不再困难--如果您知道密诀,这就是事实。
JavahttpClient介绍以及使用示例
JavahttpClient介绍以及使⽤⽰例Java 开发语⾔中实现HTTP请求的⽅法主要有两种:⼀种是JAVA的标准类HttpUrlConnection,⽐较原⽣的实现⽅法;另⼀种是第三⽅开源框架HTTPClient。
HttpClient相⽐传统JDK⾃带的URLConnection,增加了易⽤性和灵活性,它不仅是客户端发送Http请求变得容易,⽽且也⽅便了开发⼈员测试接⼝(基于Http协议的),即提⾼了开发的效率,也⽅便提⾼代码的健壮性。
⼀、HttpClient简单介绍HttpClient是Apache Jakarta Common下的⼦项⽬,⽤来提供⾼效的、最新的、功能丰富的⽀持HTTP协议的客户端编程⼯具包,并且它⽀持HTTP协议最新的版本和建议。
HttpClient已经应⽤在很多的项⽬中,⽐如Apache Jakarta上很著名的另外两个开源项⽬Cactus和HTMLUnit都使⽤了HttpClient。
HTTPClient对HTTP的封装性⽐较不错,通过它基本上能够满⾜我们⼤部分的需求。
HttpClient3.1 是mons.httpclient下操作远程 url的⼯具包,虽然已不再更新,但实现⼯作中使⽤httpClient3.1的代码还是很多。
HttpClient4.5 是org.apache.http.client下操作远程 url的⼯具包。
⼆、HttpClient特性基于标准、纯净的java语⾔。
实现了Http1.0和Http1.1。
以可扩展的⾯向对象的结构实现了Http全部的⽅法(GET, POST, PUT, DELETE, HEAD, OPTIONS, and TRACE)。
⽀持HTTPS协议。
通过Http代理建⽴透明的连接。
利⽤CONNECT⽅法通过Http代理建⽴隧道的https连接。
Basic, Digest, NTLMv1, NTLMv2, NTLM2 Session, SNPNEGO/Kerberos认证⽅案。
【推荐下载】Android网络访问之HttpURLConnection和HttpClient
Android 网络访问之HttpURLConnection 和HttpClient 2015/05/23 4 Android 上发送HTTP 请求的一般有两种方式,HttpURLConnection 和HttpClient。
下面分别简述两种方式的用法。
1. HttpURLConnection1, 获取HttpURLConnection 的实例。
一般只需new 出一个URL 对象,并传入目标的网络地址,然后调用openConnection()方法即可。
如下所示:URL url = new URL(“baidu”);HttpURLConnection connection = (HttpURLConnection) url.openConnection();2, 设置HTTP 请求方法。
常用的方法有两个:GET 和POST。
GET 表示希望从服务器那里获取数据,而POST 则表示希望提交数据给服务器。
写法如下:connection.setRequestMethod(“GET”);3,其他设置,如设置连接超时、读取超时的毫秒数等。
可根据实际情况来写,例如:connection.setConnectTimeout(5000);// 设置连接超时为5000 毫秒connection.setReadTimeout(5000);4, 用getInputStream() 方法获取服务器返回的输入流,然后读取输入流。
代码如下所示:InputStream in = connection.getInputStream();5, 关闭HTTP 连接connection.disconnect();MainActivity 代码实现:public class MainActivity extends Activity implements OnClickListener { public static final int SHOW_RESPONSE = 0; private Button sendRequest; private TextView responseText; private Handler handler = new Handler() { public void handleMessage(Message msg) { switch(msg.what) { case SHOW_RESPONSE: Stringresponse = (String) msg.obj; // 在这里进行UI 操作,将结果显示到界面上responseText.setText(response); } }; }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(yout.activity_main); sendRequest = (Button) findViewById(R.id.send_request); responseText = (TextView)。
Android网络连接之HttpURLConnection和HttpClient
Android网络连接之HttpURLConnection和HttpClient1.概念HTTP 协议可能是现在Internet 上使用得最多、最重要的协议了,越来越多的Java 应用程序需要直接通过HTTP 协议来访问网络资源。
在JDK 的 包中已经提供了访问HTTP协议的基本功能:HttpURLConnection。
但是对于大部分应用程序来说,JDK 库本身提供的功能还不够丰富和灵活。
除此之外,在Android中,androidSDK中集成了Apache的HttpClient模块,用来提供高效的、最新的、功能丰富的支持HTTP 协议工具包,并且它支持HTTP 协议最新的版本和建议。
使用HttpClient可以快速开发出功能强大的Http程序。
2.区别HttpClient是个很不错的开源框架,封装了访问http的请求头,参数,内容体,响应等等,HttpURLConnection是java的标准类,什么都没封装,用起来太原始,不方便,比如重访问的自定义,以及一些高级功能等。
URLConnectionProxies and SOCKS Full support in Netscape browser, appletviewer, and applicat additional limitations from security policies.Authorization Full support for Basic Authorization in Netscape (can use in accesses outside of the applet); no support in appletviewer orMethods Only has GET and POST.Headers Currently you can only set any request headers if you are doing and the JDK you can't set any headers.Under Netscape 3.0 you can read headers only if the resource w header; if no Content-length header was returned, or under using the JDK no headers can be read.Automatic Redirection Handling Yes.Persistent Connections No support currently in JDK; under Netscape uses HTTP/1.0 K Pipelining of Requests No.Can handle protocols other than HTTP Theoretically; however only http is currently implemented.Can do HTTP over SSL (https)Under Netscape, yes. Using Appletviewer or in an application, Source code available No.3.案例URLConnectionString urlAddress = "http://192.168.1.102:8080/AndroidServer/login.do";URL url;HttpURLConnection uRLConnection;public UrlConnectionToServer(){}//向服务器发送get请求public String doGet(String username,String password){String getUrl = urlAddress + "?username="+username+"&password="+password;try {url = new URL(getUrl);uRLConnection = (HttpURLConnection)url.openConnection();InputStream is = uRLConnection.getInputStream();BufferedReader br = new BufferedReader(new InputStreamReader(is));String response = "";String readLine = null;while((readLine =br.readLine()) != null){//response = br.readLine(); response = response +readLine;}is.close();br.close();uRLConnection.disconnect();return response;} catch (MalformedURLException e) {e.printStackTrace();return null;} catch (IOException e) {e.printStackTrace();return null;}}//向服务器发送post请求public String doPost(String username,String password){try {url = new URL(urlAddress);uRLConnection = (HttpURLConnection)url.openConnection();uRLConnection.setDoInput(true);uRLConnection.setDoOutput(true);uRLConnection.setRequestMethod("POST");uRLConnection.setUseCaches(false);uRLConnection.setInstanceFollowRedirects(false);uRLConnection.setRequestProperty("Content-Type","application/x-www-form-urlencoded");uRLConnection.connect();DataOutputStream out = new DataOutputStream(uRLConnection.getOutputStream());String content = "username="+username+"&password="+password;out.writeBytes(content);out.flush();out.close();InputStream is = uRLConnection.getInputStream();BufferedReader br = new BufferedReader(new InputStreamReader(is)); String response = "";String readLine = null;while((readLine =br.readLine()) != null){//response = br.readLine(); response = response + readLine;}is.close();br.close();uRLConnection.disconnect();return response;} catch (MalformedURLException e) {e.printStackTrace();return null;} catch (IOException e) {e.printStackTrace();return null;}}HTTPClientString urlAddress = "http://192.168.1.102:8080/qualityserver/login.do"; public HttpClientServer(){}public String doGet(String username,String password){String getUrl = urlAddress + "?username="+username+"&password="+password; HttpGet httpGet = new HttpGet(getUrl);HttpParams hp = httpGet.getParams();hp.getParameter("true");//hp. //httpGet.setp HttpClient hc = new DefaultHttpClient();try {HttpResponse ht = hc.execute(httpGet);if(ht.getStatusLine().getStatusCode() == HttpStatus.SC_OK){HttpEntity he = ht.getEntity();InputStream is = he.getContent();BufferedReader br = new BufferedReader(new InputStreamReader(is)); String response = "";String readLine = null;while((readLine =br.readLine()) != null){//response = br.readLine(); response = response + readLine;}is.close();br.close();//String str = EntityUtils.toString(he); System.out.println("========="+response);return response;}else{return "error";}} catch (ClientProtocolException e) {//TODO Auto-generated catch block e.printStackTrace();return "exception";} catch (IOException e) {//TODO Auto-generated catch block e.printStackTrace();return "exception";}}public String doPost(String username,String password){//String getUrl = urlAddress + "?username="+username+"&password="+password; HttpPost httpPost = new HttpPost(urlAddress);List params = new ArrayList();NameValuePair pair1 = new BasicNameValuePair("username", username);NameValuePair pair2 = new BasicNameValuePair("password", password);params.add(pair1);params.add(pair2);HttpEntity he;try {he = new UrlEncodedFormEntity(params, "gbk");httpPost.setEntity(he);} catch (UnsupportedEncodingException e1) {//TODO Auto-generated catch block e1.printStackTrace();}HttpClient hc = new DefaultHttpClient();try {HttpResponse ht = hc.execute(httpPost);//连接成功if(ht.getStatusLine().getStatusCode() == HttpStatus.SC_OK){HttpEntity het = ht.getEntity();InputStream is = het.getContent();BufferedReader br = new BufferedReader(new InputStreamReader(is)); String response = "";String readLine = null;while((readLine =br.readLine()) != null){//response = br.readLine(); response = response + readLine;}is.close();br.close();//String str = EntityUtils.toString(he); System.out.println("=========&&"+response);return response;}else{return "error";}} catch (ClientProtocolException e) {//TODO Auto-generated catch block e.printStackTrace();return "exception";} catch (IOException e) {//TODO Auto-generated catch block e.printStackTrace();return "exception";}}servlet端json转化:resp.setContentType("text/json");resp.setCharacterEncoding("UTF-8");toDo = new ToDo();List<UserBean> list = new ArrayList<UserBean>();list = toDo.queryUsers(mySession);String body;//设定JSON JSONArray array = new JSONArray();for(UserBean bean : list){JSONObject obj = new JSONObject();try{obj.put("username", bean.getUserName());obj.put("password", bean.getPassWord());}catch(Exception e){}array.add(obj);}pw.write(array.toString());System.out.println(array.toString());android端接收:String urlAddress = "http://192.168.1.102:8080/qualityserver/result.do";String body =getContent(urlAddress);JSONArray array = new JSONArray(body);for(int i=0;i<array.length();i++){obj = array.getJSONObject(i);sb.append("用户名:").append(obj.getString("username")).append("\t"); sb.append("密码:").append(obj.getString("password")).append("\n");HashMap<String, Object> map = new HashMap<String, Object>();try {userName = obj.getString("username");passWord = obj.getString("password");} catch (JSONException e) {e.printStackTrace();}map.put("username", userName);map.put("password", passWord);listItem.add(map);}} catch (Exception e) {//TODO Auto-generated catch block e.printStackTrace(); }if(sb!=null){showResult.setText("用户名和密码信息:");showResult.setTextSize(20);} elseextracted();//设置adapter SimpleAdapter simple = new SimpleAdapter(this,listItem,yout.simple_list_item_2,new String[]{"username","password"},new int[]{android.R.id.text1,android.R.id.text2});listResult.setAdapter(simple);listResult.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view,int position, long id) {int positionId = (int) (id+1);Toast.makeText(MainActivity.this, "ID:"+positionId, Toast.LENGTH_LONG).show();}});}private void extracted() {showResult.setText("没有有效的数据!");}//和服务器连接private String getContent(String url)throws Exception{ StringBuilder sb = new StringBuilder();HttpClient client =new DefaultHttpClient();HttpParams httpParams =client.getParams();HttpConnectionParams.setConnectionTimeout(httpParams, 3000);HttpConnectionParams.setSoTimeout(httpParams, 5000);HttpResponse response = client.execute(new HttpGet(url));HttpEntity entity =response.getEntity();if(entity !=null){BufferedReader reader = new BufferedReader(new InputStreamReader (entity.getContent(),"UTF-8"),8192);String line =null;while ((line= reader.readLine())!=null){sb.append(line +"\n");}reader.close();}return sb.toString();}分类: Android之网络编程。
使用HttpURLConnection访问网络
使用HttpURLConnection访问网络HttpURLConnection是Java提供的一种用于HTTP协议通信的类,可以用来进行网络请求和数据传输。
它是基于Java的URL类的扩展,提供了更多的功能和灵活性。
1.创建一个URL对象,用于指定要访问的URL地址。
2. 调用URL对象的openConnection(方法来创建一个HttpURLConnection对象。
3. 设置HttpURLConnection对象的请求方法、超时时间、请求头等属性。
4. 调用HttpURLConnection对象的connect(方法来建立与服务器的连接。
5.发送请求参数(如果有的话)。
6. 调用HttpURLConnection对象的getResponseCode(方法来获取服务器的响应码。
7.根据响应码进行相应的处理,如获取服务器返回的数据。
8.关闭连接。
下面是一个使用HttpURLConnection进行网络请求的示例代码:```javaimport java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;public class HttpURLConnectionExamplepublic static void main(String[] args)try//创建一个URL对象// 创建一个HttpURLConnection对象HttpURLConnection connection = (HttpURLConnection) url.openConnection(;//设置请求方法connection.setRequestMethod("GET");//设置超时时间connection.setConnectTimeout(5000);connection.setReadTimeout(5000);//发送请求connection.connect(;//获取响应码int responseCode = connection.getResponseCode(;System.out.println("Response Code: " + responseCode);if (responseCode == HttpURLConnection.HTTP_OK)//读取服务器返回的数据BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream());String line;StringBuilder response = new StringBuilder(;while ((line = reader.readLine() != null)response.append(line);}reader.close(;//打印服务器返回的数据System.out.println("Response: " + response.toString();} elseSystem.out.println("Error: " + responseCode);}//关闭连接connection.disconnect(;} catch (IOException e)e.printStackTrace(;}}```上述代码中,我们创建了一个URL对象来指定要访问的URL地址。
Java调用Http请求 -HttpURLConnection
Java调用Http请求-HttpURLConnectionJava中为我们的网络支持提供了包,能够使我们以编程的方式来访问Web服务功能, Java中的网络编程的知识,主要是学习下该包下的API。
URI——>URLURI:表示的是统一的资源标识,它是以某种统一的方式标识资源的简单字符串。
这种字符串以scheme开头。
URL:表示统一的资源定位器的任务,URL是一种URI。
URN:一般不能为资源提供持久不变的名称,这是统一的资源命名的任务。
URN也是一种URI,但它是全球唯一的、持久不变的,即使资源不再存在或不再使用。
URL类URL类代表一个统一资源定位符,资源可以是简单的目录,也可以是复杂的对象,例如对数据库或搜索引擎的查询。
URL类为我们提供了不同的构造方法1.根据地址构造URLPublicURL(Stringspec);URL url=new URL("")2.根据协议、主机名、端口和文件创造public URL(String protocol,Stringhost,intport,String file)URL封装对象信息URL对象封装了一些对象的信息,比如URL对象的端口号、头内容、主机名、协议名称等HTTP请求的细节——请求行请求行中的GET称之为请求方式,请求方式有:POST、GET、HEAD、OPTIONS、DELETE、TRACE、PUT,常用的有: GET、 POST用户如果没有设置,默认情况下浏览器向服务器发送的都是get请求,例如在浏览器直接输地址访问,点超链接访问等都是get,用户如想把请求方式改为post,可通过更改表单的提交方式实现。
不管POST或GET,都用于向服务器请求某个WEB资源,这两种方式的区别主要表现在数据传递上:如果请求方式为GET方式,则可以在请求的URL地址后以?的形式带上交给服务器的数据,多个数据之间以&进行分隔,例如:GET /mail/1.html?name=abc&password=xyz HTTP/1.1。
JavaHttpURLConnection抓取网页内容解析gzip格式输入流数据并转换为S。。。
JavaHttpURLConnection抓取⽹页内容解析gzip格式输⼊流数据并转换为S。
最近GFW为了刷存在感,搞得⼤家是头晕眼花,修改hosts ⼏乎成了每⽇必备⼯作。
索性写了⼀个⼩程序,给办公室的同事们分享,其中有个内容就是抓取⽹络上的hosts,废了⼀些周折。
我是在⼀个博客上抓取的。
但是这位朋友的博客应该是在做防盗链,但他的⽅式⽐较简单就是5位数的⼀个整形随机数。
这⾥折腾⼀下就ok了。
要命的是他这个链接的流类型居然是gzip。
这个郁闷好久,⼀直以为是编码格式导致解析不出来结果,后来发现是gzip搞的。
主要的⼀段代码做个记录吧。
1/**2 * ⽹络⼯具类⽤于抓取上的hosts数据3 *4 * @author tone5*/6public class NetUtil {78private final static String ENCODING = "UTF-8";9private final static String GZIPCODING = "gzip";10private final static String HOST = "/pub/hosts.php";11private final static String COOKIE = "hostspasscode=%s; Hm_lvt_e26a7cd6079c926259ded8f19369bf0b=1421846509,1421846927,1421847015,1421849633; Hm_lpvt_e26a7cd6079c926259ded8f19369bf0b=1421849633" 12private final static String OFF = "off";13private final static String ON = "on";14private final static int RANDOM = 100000;15private static String hostspasscode = null;16private static NetUtil instance;1718public static NetUtil getInstance() {19if (instance == null) {20 instance = new NetUtil();21 }22return instance;23 }2425private NetUtil() {26 hostspasscode = createRandomCookies();27 }2829/**30 * 获取html内容31 *32 * @param gs33 * @param wk34 * @param twttr35 * @param fb36 * @param flkr37 * @param dpbx38 * @param odrvB39 * @param yt40 * @param nohl41 * @return42*/43public String getHtmlInfo(boolean gs, boolean wk, boolean twttr, boolean fb,44boolean flkr, boolean dpbx, boolean odrv,45boolean yt, boolean nohl) throws Exception {46 HttpURLConnection conn = null;4748 String result = "";4950//String cookie = "hostspasscode="+hostspasscode+"; Hm_lvt_e26a7cd6079c926259ded8f19369bf0b=1421846509,1421846927,1421847015,1421849633; Hm_lpvt_e26a7cd6079c926259ded8f19369bf0b=1421849633";51 String cookie = String.format(COOKIE, hostspasscode);5253//URL url = new URL("/pub/hosts.php?passcode=13008&gs=on&wk=on&twttr=on&fb=on&flkr=on&dpbx=on&odrv=on&yt=on&nolh=on");54 URL url = new URL(createUrl(hostspasscode, gs, wk, twttr, fb, flkr, dpbx, odrv, yt, nohl));55//System.out.println(cookie);56// System.out.println(url.toString());5758 conn = (HttpURLConnection) url.openConnection();5960 conn.setConnectTimeout(5 * 1000);61 conn.setDoOutput(true);62//get⽅式提交63 conn.setRequestMethod("GET");64//凭借请求头⽂件65 conn.setRequestProperty("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");66 conn.setRequestProperty("Accept-Encoding", "gzip, deflate");67 conn.setRequestProperty("Accept-Language", "zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3");68 conn.setRequestProperty("Connection", "keep-alive");69 conn.setRequestProperty("Cookie", cookie);70 conn.setRequestProperty("Host", "");71 conn.setRequestProperty("User-Agent", "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:35.0) Gecko/20100101 Firefox/35.0");7273// conn.setRequestProperty("Referer", "/pub/gethosts.php");74// conn.setRequestProperty("X-Requested-With", "XMLHttpRequest");7576 conn.connect();7778 String encoding = conn.getContentEncoding();7980 result = readStream(conn.getInputStream(), encoding);81//测试进度条显⽰82// result = readStream(new FileInputStream(new File("/home/tone/Resident.Evil.Damnation.2012.1080p.BluRay.x264.DTS-WiKi.mkv")), "11");8384 conn.disconnect();85if (nohl) {86 result=getLocalHost()+result;87 }8889return result;90 }9192/**93 * 读取将InputStream中的字节读以字符的形式取到字符串中,如果encoding是gzip,那么需要先有GZIPInputStream进⾏封装95 * @param inputStream InputStream字节流96 * @param encoding 编码格式97 * @return String类型的形式98 * @throws IOException IO异常99*/100private String readStream(InputStream inputStream, String encoding) throws Exception {101 StringBuffer buffer = new StringBuffer();102 ProgressMonitorInputStream pmis = null;103104 InputStreamReader inputStreamReader = null;105 GZIPInputStream gZIPInputStream = null;106if (GZIPCODING.equals(encoding)) {107 gZIPInputStream = new GZIPInputStream(inputStream);108 inputStreamReader = new InputStreamReader(ProgressUtil.getMonitorInputStream(gZIPInputStream, "获取⽹络数据"), ENCODING); 109110 } else {111112 inputStreamReader = new InputStreamReader(ProgressUtil.getMonitorInputStream(inputStream, "获取⽹络数据"), ENCODING); 113 }114115116char[] c = new char[1024];117118int lenI;119while ((lenI = inputStreamReader.read(c)) != -1) {120121 buffer.append(new String(c, 0, lenI));122123 }124if (inputStream != null) {125 inputStream.close();126 }127if (gZIPInputStream != null) {128 gZIPInputStream.close();129 }130if (pmis!=null) {131 gZIPInputStream.close();132 }133134135return buffer.toString();136137138 }139140/**141 * ⽣成随机Cookies数组142 *143 * @return五位随机数字144*/145private String createRandomCookies() {146147return String.valueOf(Math.random() * RANDOM).substring(0, 5);148149 }150151/**152 * ⽣成链接字符串153 *154 * @param hostspasscode155 * @param gs156 * @param wk157 * @param twttr158 * @param fb159 * @param flkr160 * @param dpbx161 * @param odrvB162 * @param yt163 * @param nohl164 * @return165*/166private String createUrl(String hostspasscode, boolean gs, boolean wk, boolean twttr, boolean fb,167boolean flkr, boolean dpbx, boolean odrv,168boolean yt, boolean nohl) {169 StringBuffer buffer = new StringBuffer();170 buffer.append(HOST);171 buffer.append("?passcode=" + hostspasscode);172if (gs) {173 buffer.append("&gs=" + ON);174 } else {175 buffer.append("&gs=" + OFF);176 }177if (wk) {178 buffer.append("&wk=" + ON);179 } else {180 buffer.append("&wk=" + OFF);181 }182if (twttr) {183 buffer.append("&twttr=" + ON);184 } else {185 buffer.append("&twttr=" + OFF);186 }187if (fb) {188 buffer.append("&fb=" + ON);189 } else {190 buffer.append("&fb=" + OFF);191 }192if (flkr) {193 buffer.append("&flkr=" + ON);194 } else {195 buffer.append("&flkr=" + OFF);196 }197if (dpbx) {198 buffer.append("&dpbx=" + ON);199 } else {200 buffer.append("&dpbx=" + OFF);201 }202if (odrv) {203 buffer.append("&odrv=" + ON);204 } else {205 buffer.append("&odrv=" + OFF);207if (yt) {208 buffer.append("&yt=" + ON);209 } else {210 buffer.append("&yt=" + OFF);211 }212if (nohl) {213 buffer.append("&nohl=" + ON);214 } else {215 buffer.append("&nohl=" + OFF);216 }217return buffer.toString();218 }219220private String getLocalHost() throws Exception {221222 StringBuffer buffer=new StringBuffer();223 String hostName=OSUtil.getInstance().getLocalhostName(); 224 buffer.append("#LOCALHOST begin"+"\n");225 buffer.append("127.0.0.1\tlocalhost"+"\n");226if (hostName!=null&&!"".equals(hostName)) {227 buffer.append("127.0.1.1\t"+hostName+"\n");228 }229230 buffer.append("#LOCALHOST end"+"\n");231return buffer.toString();232233234235 }236237 }。
JAVA代码实现HTTP请求的常用方法
JAVA代码实现HTTP请求的常用方法在Java中,有多种方法可以实现HTTP请求。
下面将介绍几种常用的方法。
1. 使用Java内置的URL类和HttpURLConnection类:```javaimport java.io.BufferedReader;import java.io.InputStreamReader;public class HTTPRequestExamplepublic static void main(String[] args) throws ExceptionURL obj = new URL(url);HttpURLConnection con = (HttpURLConnection)obj.openConnection(;//设置请求方法con.setRequestMethod("GET");//添加请求头con.setRequestProperty("User-Agent", "Mozilla/5.0");//获取响应码int responseCode = con.getResponseCode(;System.out.println("Response Code: " + responseCode);BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream());String inputLine;StringBuffer response = new StringBuffer(;while ((inputLine = in.readLine() != null)response.append(inputLine);}in.close(;//打印响应内容System.out.println(response.toString();}```2. 使用第三方库HttpClient:```javapublic class HTTPRequestExamplepublic static void main(String[] args) throws Exception //创建GET请求//发送请求并获取响应//解析响应实体内容//打印响应内容System.out.println(response);// 关闭HttpClient连接}```3. 使用第三方库OkHttp:```javapublic class HTTPRequestExamplepublic static void main(String[] args) throws Exception// 创建OkHttpClient对象OkHttpClient okHttpClient = new OkHttpClient(;// 创建Request对象Request request = new Request.Builder.url(url).build(;//发送请求并获取响应Response response = okHttpClient.newCall(request).execute(;String responseBody = response.body(.string(;//打印响应内容System.out.println(responseBody);}```4. 使用第三方库RestTemplate(Spring框架的一部分):```javaimport org.springframework.web.client.RestTemplate;public class HTTPRequestExamplepublic static void main(String[] args)// 创建RestTemplate对象RestTemplate restTemplate = new RestTemplate(;//发送GET请求,并获取响应ResponseEntity<String> responseEntity = restTemplate.getForEntity(url, String.class);//获取响应内容String response = responseEntity.getBody(;//打印响应内容System.out.println(response);}```这些方法提供了不同的方式来实现HTTP请求,使用Java内置的URL 类和HttpURLConnection类相对简单,但是需要自己处理底层连接和数据读取。
Java通信类的使用
Java通信类的使用1. 概述在现代软件开发中,网络通信变得越来越重要。
Java作为一种强大的编程语言,提供了许多通信类以满足不同的网络通信需求。
本文将介绍Java通信类的使用,包括Socket、URL、URLConnection和HttpClient等。
2. Socket通信Socket是Java提供的最基本的通信类,用于实现传输层的网络通信。
通过Socket,可以建立客户端与服务器之间的连接,并进行数据的传输。
具体使用步骤如下:2.1 创建Socket使用Socket类的构造函数可以创建一个Socket对象,指定服务器的IP地址和端口号。
2.2 获取输入输出流通过Socket对象的getInputStream和getOutputStream方法,可以获取与服务器进行数据交换的输入输出流。
2.3 数据传输通过输入输出流的read和write方法,可以进行数据的读取和写入。
可以根据具体需求选择使用字符流或字节流。
2.4 关闭Socket使用Socket的close方法可以关闭Socket连接,释放资源。
3. URL通信URL类用于表示统一资源定位符,通过URL可以访问网络上的资源。
URL通信主要涉及两个类:URL和URLConnection。
3.1 创建URL对象使用URL类的构造函数可以创建一个URL对象,指定资源的URL地址。
3.2 打开连接通过URL对象的openConnection方法,可以返回一个URLConnection对象,表示与服务器的连接。
3.3 获取输入输出流通过URLConnection对象的getInputStream和getOutputStream方法,可以获取与服务器进行数据交换的输入输出流。
3.4 数据传输通过输入输出流的read和write方法,可以进行数据的读取和写入。
3.5 关闭连接使用URLConnection的disconnect方法可以关闭连接,释放资源。
HttpURLConnection用法详解
HttpURLConnection⽤法详解下边的总结对我帮助蛮⼤的~不仅⽤法了解,整个连接流程也要明⽩!原⽂链接地址:针对JDK中的URLConnection连接Servlet的问题,⽹上有虽然有所涉及,但是只是说明了某⼀个或⼏个问题,是以FAQ的⽅式来解决的,⽽且⽐较零散,现在对这个类的使⽤就本⼈在项⽬中的使⽤经验做如下总结:1:> URL请求的类别:分为⼆类,GET与POST请求。
⼆者的区别在于:a:) get请求可以获取静态页⾯,也可以把参数放在URL字串后⾯,传递给servlet,b:) post与get的不同之处在于post的参数不是放在URL字串⾥⾯,⽽是放在http请求的正⽂内。
2:> URLConnection的对象问题:URLConnection的对象,如下代码⽰例:// 下⾯的index.jsp由<servlet-mapping>映射到// ⼀个Servlet(com.quantanetwork.getClientDataServlet)// 该Servlet的注意点下边会提到1 URL url = new URL("http://localhost:8080/TestHttpURLConnectionPro/index.jsp");23 URLConnection rulConnection = url.openConnection();4// 此处的urlConnection对象实际上是根据URL的5 // 请求协议(此处是http)⽣成的URLConnection类6 // 的⼦类HttpURLConnection,故此处最好将其转化7 // 为HttpURLConnection类型的对象,以便⽤到8 // HttpURLConnection更多的API.如下:910 HttpURLConnection httpUrlConnection = (HttpURLConnection) rulConnection;3:> HttpURLConnection对象参数问题1// 设置是否向httpUrlConnection输出,因为这个是post请求,参数要放在2 // http正⽂内,因此需要设为true, 默认情况下是false;3httpUrlConnection.setDoOutput(true);45// 设置是否从httpUrlConnection读⼊,默认情况下是true;6httpUrlConnection.setDoInput(true);78// Post 请求不能使⽤缓存9httpUrlConnection.setUseCaches(false);1011// 设定传送的内容类型是可序列化的java对象12 // (如果不设此项,在传送序列化对象时,当WEB服务默认的不是这种类型时可能抛java.io.EOFException)13httpUrlConnection.setRequestProperty("Content-type", "application/x-java-serialized-object");1415// 设定请求的⽅法为"POST",默认是GET16httpUrlConnection.setRequestMethod("POST");1718// 连接,从上述第2条中url.openConnection()⾄此的配置必须要在connect之前完成,19 httpUrlConnection.connect();4:> HttpURLConnection连接问题:1// 此处getOutputStream会隐含的进⾏connect(即:如同调⽤上⾯的connect()⽅法,2 // 所以在开发中不调⽤上述的connect()也可以)。
Java-HttpURLConnection详细说明与实例
Java-HttpURLConnection详细说明与实例URLConnection 类是⼀个抽象类,代表应⽤程序和URL之间的通信连接,此类的实例可⽤于读取和写⼊此URL引⽤的资源。
URLConnection 允许使⽤GET,POST或者其他HTTP⽅法请求⽅式将请求数据发送到服务器。
使⽤URLConnection对象⼀般分为以下7步。
1:创建⼀个URL对象;2:通过URL对象的openConnection⽅法创建URLConnection对象;3:通过URLConnection对象提供的⽅法可以设置参数和⼀般请求属性。
常⽤的请求属性设置⽅式有以下⼏种:~public void setRequestProperty(String key,String value)设置指定的请求关键字对应的值~public void setDoInput(boolean doinput)设置是否使⽤URL连接进⾏输⼊,默认值为true~public void setDoOutput(boolean dooutput)设置是否使⽤URL连接进⾏输出,默认值为false,如果设置为true,就可以获取⼀个字节输出流,⽤于将数据发送到服务器~public void setUseCaches(boolean usecaches)设置此连接是否使⽤任何可⽤的缓存,默认值为true4:调⽤URLConnection对象的connect⽅法连接到该远程资源5:连接到服务器后,就可以查询头部信息了,查询头部信息常⽤⽅法有以下⼏种:~public String getHeaderField(String name)返回指定头字段的值~public Map<String,List<String>>getHeaderFields()返回头字段的不可修改的Map~public String getContentType()返回content-type头字段的值~public String getContentEncoding()返回content-encoding的值6:获取输⼊流访问资源数据。
Java中Http连接的两种方式(小结)
Java中Http连接的两种⽅式(⼩结)在java中连接http,介绍两种⽅法,⼀种是java的HttpUrlConnection,另⼀种是apacha公司的httpClient,后者是第三⽅的类库需要从外部,导⼊,同时这也是第⼀次使⽤外部的类库,以后还会有很多需要导⼊外部类库的需求。
http协议是基于tcp的⼀种协议。
tcp是⼀种保证可靠连接的传输协议,通过三次握⼿,和丢失重传的机制保证数据的传输。
⾸先来看HttpUrlConnection这个类是java⾃带的,直接import就⾏。
使⽤tcp连接的过程⼏乎都⼀样,http协议中有两种⽅式,⼀种是get⽅式,另⼀种是post提交,有些⽹页需要提交数据,所以要使⽤。
先看GET⾸先需要⼀个url,这个url使⽤String建⽴String path ="";//URL url = new URL(path);之后通过url对象打开连接HttpURLConnection conn = (HttpURLConnection) url.openConnection();这⾥需要注意打开连接之后,这个函数返回的是不是httpUrlconnection类型⽽是 URLConnection类型,可以直接强转。
之后开始通过对conn对象进⾏设置连接的参数conn.setRequestMethod("GET"); //设置本次请求的⽅式,默认是GET⽅式,参数要求都是⼤写字母conn.setConnectTimeout(5000);//设置连接超时conn.setDoInput(true);//是否打开输⼊流,此⽅法默认为trueconn.setDoOutput(true);//是否打开输出流,此⽅法默认为falseconn.connect();//表⽰连接之后就开始判断是否连接成功,服务器会返回⼀个响应码,最常见的⼤概就是我们的404,不过除此之外还有很多,⽽成功连接返回的是200,也有⼀个静态的名称来代替HTTP_OK。
关于JAVA发送Https请求(HttpsURLConnection和HttpURLCon。。。
关于JAVA发送Https请求(HttpsURLConnection和HttpURLCon。
关于JAVA发送Https请求(HttpsURLConnection和HttpURLConnection)【转】https协议对于开发者⽽⾔其实只是多了⼀步证书验证的过程。
这个证书正常情况下被jdk/jre/security/cacerts所管理。
⾥⾯证书包含两种情况:1、机构所颁发的被认证的证书,这种证书的⽹站在浏览器访问时https头显⽰为绿⾊如百度2、个⼈所设定的证书,这种证书的⽹站在浏览器⾥https头显⽰为红⾊×,且需要点击信任该⽹站才能继续访问。
⽽点击信任这⼀步的操作就是我们在java代码访问https⽹站时区别于http请求需要做的事情。
所以JAVA发送Https请求有两种情况,三种解决办法:第⼀种情况:Https⽹站的证书为机构所颁发的被认证的证书,这种情况下和http请求⼀模⼀样,⽆需做任何改变,⽤HttpsURLConnection 或者HttpURLConnection都可以[java]1. public static void main(String[] args) throws Exception{2. URL serverUrl = new URL("https://xxxx");3. HttpURLConnection conn = (HttpURLConnection) serverUrl.openConnection();4. conn.setRequestMethod("GET");5. conn.setRequestProperty("Content-type", "application/json");6. //必须设置false,否则会⾃动redirect到重定向后的地址7. conn.setInstanceFollowRedirects(false);8. conn.connect();9. String result = getReturn(conn);10. }11.12. /*请求url获取返回的内容*/13. public static String getReturn(HttpURLConnection connection) throws IOException{14. StringBuffer buffer = new StringBuffer();15. //将返回的输⼊流转换成字符串16. try(InputStream inputStream = connection.getInputStream();17. InputStreamReader inputStreamReader = new InputStreamReader(inputStream, ConstantInfo.CHARSET);18. BufferedReader bufferedReader = new BufferedReader(inputStreamReader);){19. String str = null;20. while ((str = bufferedReader.readLine()) != null) {21. buffer.append(str);22. }23. String result = buffer.toString();24. return result;25. }26. }第⼆种情况:个⼈所设定的证书,这种证书默认不被信任,需要我们⾃⼰选择信任,信任的办法有两种:A、将证书导⼊java的运⾏环境中从该⽹站下载或者从⽹站开发者出获取证书cacert.crt运⾏命令将证书导⼊java运⾏环境:keytool -import -keystore %JAVA_HOME%\jre\lib\security\cacerts -file cacert.crt -alias xxx 完成。
详解java实现HTTP请求的三种方式
详解java实现HTTP请求的三种⽅式⽬前JAVA实现HTTP请求的⽅法⽤的最多的有两种:⼀种是通过HTTPClient这种第三⽅的开源框架去实现。
HTTPClient对HTTP的封装性⽐较不错,通过它基本上能够满⾜我们⼤部分的需求,HttpClient3.1 是 mons.httpclient下操作远程 url的⼯具包,虽然已不再更新,但实现⼯作中使⽤httpClient3.1的代码还是很多,HttpClient4.5是org.apache.http.client 下操作远程 url的⼯具包,最新的;另⼀种则是通过HttpURLConnection去实现,HttpURLConnection是JAVA的标准类,是JAVA⽐较原⽣的⼀种实现⽅式。
⾃⼰在⼯作中三种⽅式都⽤到过,总结⼀下分享给⼤家,也⽅便⾃⼰以后使⽤,话不多说上代码。
第⼀种⽅式:java原⽣HttpURLConnectionpackage com.powerX.httpClient;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import .HttpURLConnection;import .MalformedURLException;import .URL;public class HttpClient {public static String doGet(String httpurl) {HttpURLConnection connection = null;InputStream is = null;BufferedReader br = null;String result = null;// 返回结果字符串try {// 创建远程url连接对象URL url = new URL(httpurl);// 通过远程url连接对象打开⼀个连接,强转成httpURLConnection类connection = (HttpURLConnection) url.openConnection();// 设置连接⽅式:getconnection.setRequestMethod("GET");// 设置连接主机服务器的超时时间:15000毫秒connection.setConnectTimeout(15000);// 设置读取远程返回的数据时间:60000毫秒connection.setReadTimeout(60000);// 发送请求connection.connect();// 通过connection连接,获取输⼊流if (connection.getResponseCode() == 200) {is = connection.getInputStream();// 封装输⼊流is,并指定字符集br = new BufferedReader(new InputStreamReader(is, "UTF-8"));// 存放数据StringBuffer sbf = new StringBuffer();String temp = null;while ((temp = br.readLine()) != null) {sbf.append(temp);sbf.append("\r\n");}result = sbf.toString();}} catch (MalformedURLException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {// 关闭资源if (null != br) {try {br.close();} catch (IOException e) {e.printStackTrace();}}if (null != is) {try {is.close();} catch (IOException e) {e.printStackTrace();}}connection.disconnect();// 关闭远程连接}return result;}public static String doPost(String httpUrl, String param) {HttpURLConnection connection = null;InputStream is = null;OutputStream os = null;BufferedReader br = null;String result = null;try {URL url = new URL(httpUrl);// 通过远程url连接对象打开连接connection = (HttpURLConnection) url.openConnection();// 设置连接请求⽅式connection.setRequestMethod("POST");// 设置连接主机服务器超时时间:15000毫秒connection.setConnectTimeout(15000);// 设置读取主机服务器返回数据超时时间:60000毫秒connection.setReadTimeout(60000);// 默认值为:false,当向远程服务器传送数据/写数据时,需要设置为trueconnection.setDoOutput(true);// 默认值为:true,当前向远程服务读取数据时,设置为true,该参数可有可⽆connection.setDoInput(true);// 设置传⼊参数的格式:请求参数应该是 name1=value1&name2=value2 的形式。
HttpURLConnection与HttpClient区别性能测试对比
HttpURLConnection与HttpClient区别性能测试对⽐ttpClient是个开源框架,封装了访问http的请求头,参数,内容体,响应等等,HttpURLConnection是java的标准类,什么都没封装,⽤起来太原始,不⽅便HttpClient实际上是对Java提供⽅法的⼀些封装,在HttpURLConnection中的输⼊输出流操作,在这个接⼝中被统⼀封装成了HttpPost(HttpGet)和HttpResponse,这样,就减少了操作的繁琐性。
性能⽅⾯这⾥做⼀个测试:HttpURLConnection VS HttpClient性能测试版本: HttpURLConnection jdk1.6;HttpClient 3.0.1在项⽬中有⼀个特别⼩的相关应⽤,在选择时做了⼀下测试,之前先对两个类进⾏下说明:HttpURLConnection java的标准类()HttpClient Jakarta Commons HttpClient,提供对HTTP协议访问的封装,包括http的请求头,参数,内容体,响应等及多线程的应⽤。
测试代码:import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import .HttpURLConnection;import .MalformedURLException;import .URL;import mons.httpclient.DefaultHttpMethodRetryHandler;import mons.httpclient.HttpClient;import mons.httpclient.HttpException;import mons.httpclient.HttpStatus;import mons.httpclient.methods.GetMethod;import mons.httpclient.params.HttpMethodParams;public class HttpClientTest {private static String link = "";public static void main(String[] args) {long a = System.currentTimeMillis();useHttpURlConnection();long b = System.currentTimeMillis();System.out.println("use httpurlconnection: "+(b-a));long c = System.currentTimeMillis();useHttpClient();long d = System.currentTimeMillis();System.out.println("use httpclient: "+(d-c));}public static void useHttpURlConnection(){HttpURLConnection conn = null;URL url = null;String result = "";try {url = new .URL(link);conn = (HttpURLConnection) url.openConnection();conn.setConnectTimeout(10000);conn.connect();InputStream urlStream = conn.getInputStream();BufferedReader reader = new BufferedReader(new InputStreamReader(urlStream));String s = "";while ((s = reader.readLine()) != null) {result += s;}System.out.println(result);reader.close();urlStream.close();conn.disconnect();} catch (MalformedURLException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} catch(Exception e){e.printStackTrace();}}public static void useHttpClient(){HttpClient client = new HttpClient();GetMethod method = new GetMethod(link);method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler(3, false));try {int statusCode = client.executeMethod(method);if (statusCode != HttpStatus.SC_OK) {System.err.println("Method failed: " + method.getStatusLine());}byte[] responseBody = method.getResponseBody();System.out.println(new String(responseBody));} catch (HttpException e) {System.err.println("Fatal protocol violation: " + e.getMessage());e.printStackTrace();} catch (IOException e) {System.err.println("Fatal transport error: " + e.getMessage());e.printStackTrace();} finally {method.releaseConnection();}}}测试结果:use httpurlconnection: 47use httpclient: 641结果很明显⽰,但是在实际应⽤中,还是应该根据实际的需求进⾏取舍。
HttpURLConnection与HttpClient比较和使用示例
HttpURLConnection与HttpClient⽐较和使⽤⽰例1. GET请求与POST请求HTTP协议是现在Internet上使⽤得最多、最重要的协议了,越来越多的Java应⽤程序需要直接通过HTTP协议来访问⽹络资源。
在介绍HttpURLConnection前,我们还是再来说⼀下URL请求最常⽤的两种⽅式:GET请求与POST请求。
GET请求发送的参数如果数据是英⽂字母或数字,则按原样发送,如果是空格,则转换为+,如果是中⽂或其他字符,则直接把字符串⽤BASE64加密,得出如%E4%BD%A0%E5%A5%BD这类似的字符串,其中%XX中的XX为该符号以16进制表⽰的ASCII。
POST请求的参数不是放在URL字符串⾥⾯,⽽是放在HTTP请求的正⽂内,请求的参数被封装起来以流的形式发送给服务端。
对于GET⽅式提交数据的⼤⼩,HTTP协议并没有硬性限制,但某些浏览器及服务器会对它进⾏限制,如IE对URL长度的限制是2083字节(2K+35)。
理论上POST也没有限制,可传较⼤量的数据。
POST的安全性要⽐GET的安全性⾼。
⽐如:通过GET提交数据,⽤户名和密码将明⽂出现在URL上,因为登录页⾯有可能被浏览器缓存,如果其他⼈查看浏览器的历史纪录,那么别⼈就可以拿到你的账号和密码了,除此之外,使⽤GET提交数据还可能会造成Cross-site request forgery(CSRF,跨站请求伪造)攻击。
⼀般来说,Get是向服务器索取数据的⼀种请求,⽽Post是向服务器提交数据的⼀种请求。
2. HttpURLConnection简介在JDK的包中已经提供了访问HTTP协议的基本功能的类:HttpURLConnection。
HttpURLConnection是Java的标准类,它继承⾃URLConnection,可⽤于向指定⽹站发送GET请求、POST请求。
它在URLConnection的基础上提供了如下便捷的⽅法:int getResponseCode(); // 获取服务器的响应代码。
Java#HttpClien详解
Java#HttpClien详解⽬录:(1)HttpClient简介(2)HttpClient功能介绍(3)HttpClient基本功能的使⽤(4)HttpClient使⽤过程中常见问题(5)HttpClient⽇志配置(6)HttpClient处理关闭问题(7)处理代理服务器1.HttpClient简介HttpClient 是 Apache Jakarta Common 下的⼦项⽬,可以⽤来提供⾼效的、最新的、功能丰富的⽀持 HTTP 协议的客户端编程⼯具包,并且它⽀持 HTTP 协议最新的版本和建议。
本⽂⾸先介绍 HTTPClient,然后根据作者实际⼯作经验给出了⼀些常见问题的解决⽅法。
HTTP 协议可能是现在 Internet 上使⽤得最多、最重要的协议了,越来越多的 Java 应⽤程序需要直接通过 HTTP 协议来访问⽹络资源。
虽然在 JDK 的 包中已经提供了访问 HTTP 协议的基本功能,但是对于⼤部分应⽤程序来说,JDK 库本⾝提供的功能还不够丰富和灵活。
HttpClient 是 Apache Jakarta Common 下的⼦项⽬,⽤来提供⾼效的、最新的、功能丰富的⽀持 HTTP 协议的客户端编程⼯具包,并且它⽀持 HTTP 协议最新的版本和建议。
HttpClient 已经应⽤在很多的项⽬中,⽐如 Apache Jakarta 上很著名的另外两个开源项⽬ Cactus 和 HTMLUnit 都使⽤了 HttpClient。
现在HttpClient最新版本为 HttpClient 4.0-beta22.HttpClient功能介绍以下列出的是 HttpClient 提供的主要的功能,要知道更多详细的功能可以参见 HttpClient 的主页。
(1)实现了所有 HTTP 的⽅法(GET,POST,PUT,HEAD 等) (2)⽀持⾃动转向 (3)⽀持 HTTPS 协议 (4)⽀持代理服务器等3.HttpClient基本功能的使⽤(1) GET⽅法 使⽤ HttpClient 需要以下 6 个步骤: 1. 创建 HttpClient 的实例 2. 创建某种连接⽅法的实例,在这⾥是 GetMethod。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
HttpUrlConnection与HttpClient详解一.概念。
在Android开发中,AndroidSDK中对HTTP提供了很好的支持,主要包括两种接口。
1.一个是Sun公司提供的库,基于标准Java接口的HttpURLConnection,这个类封装的很少,如果使用高级功能,如重访问/Cookie/Session等就相当不方便。
它可以实现简单的基于URL的请求与相应功能。
Google在AndroidApi23及以后的版本中推荐使用HttpURLConnention,在后续版本中逐渐对其进行优化完善。
在2.2版本以前,一直存在着一些bug。
比如对一个可读的InputStream调用close方法时,可能会导致连接池失效。
通常我们会禁用连接池功能。
2.另一个是Apache公司提供的的HttpClient,它提供了高效的,最新的功能丰富的api,支持Http协议工具包,支持HTTP最新版本和建议,是个很好的开源框架,封装了http的请求,参数,内容体,响应等,拥有众多API,但同时HttpClient的API数量太多,如果不破坏兼容性的情况下想对他进行扩展很麻烦。
在API 23 SDK将其去掉了。
建议使用HttpURLConnection。
以上两种联网方式都支持HTTPS协议、以流的形式进行传输、IPv6、配置超时时间、以及连接池等功能。
二.区别。
1.功能上,HttpClient库要丰富很多,提供了很多工具,封装了http的请求头,参数,内容体,响应,还有一些高级功能,代理、COOKIE、鉴权、压缩、连接池的处理。
2.H ttpClient高级功能代码写起来比较复杂,对开发人员的要求会高一些,而HttpURLConnection对大部分工作进行了包装,屏蔽了不需要的细节,适合开发人员直接调用。
3.HttpURLConnection在2.3版本增加了一些HTTPS方面的改进,4.0版本增加一些响应的缓存。
4.HttpUrlConnection直接支持GZIP压缩;HttpClient也支持,但要自己写代码处理。
5.HttpUrlConnection直接支持系统级连接池,即打开的连接不会直接关闭,在一段时间内所有程序可共用;HttpClient当然也能做到,但毕竟不如官方直接系统底层支持好。
6.HttpUrlConnection直接在系统层面做了缓存策略处理(4.0版本以上),加快了重复请求的速度。
7.HttpClient 适用于web browsers, 他们是可扩展的,并且拥有大量的稳定APIs。
但是,在不破坏其兼容性的前提下很难对如此多的APIs做修改。
因此,Android 团队对修改优化Apache HTTP Client表现的并不积极。
8.HttpURLConnect 是一个通用的、适合大多数应用的轻量级组件。
这个类起步比较晚,很容易在主要API上做稳步的改善。
但是HttpURLConnection在在Android 2.2及以下版本上存在一些令人厌烦的bug,尤其是在读取InputStream时调用close()方法,就有可能会导致连接池失效了。
9.Android团队未来的工作会将更多的时间放在优化HttpURLConnection上,它的API简单,体积较小,因而非常适用于Android项目。
压缩和缓存机制可以有效地减少网络访问的流量,在提升速度和省电方面也起到了较大的作用。
10.如果一个Android应用需要向指定页面发送请求,但该页面并不是一个简单的页面,只有当用户已经登录,而且登录用户的用户名有效时才可访问该页面。
如果使用HttpURLConnection来访问这个被保护的页面,那么需要处理的细节就太复杂了。
这种情况建议使用HttpClient。
11.Android2.3及以上版本建议选用HttpURLConnection,2.2及以下版本建议选用HttpClient。
新的应用都建议使用HttpURLConnection。
三.HttpClient访问网络流程。
由于在Android2.2以后版本中已经将HttpClient弃用,所以不在这里详细说明如何使用HttpClient进行网络通信了,下面说一下使用HttpClient发送请求及接收响应的大概步骤:1.创建HttpClient。
2.创建HttpGet或者HttpPost对象(分别对应get,post方式)。
3.调用HttpGet或者HttpPost的setParams()方法设置请求参数,如果是HttpPost,还可以通过setEntity()方式设置请求参数。
4.调用HttpCLient的excute(HttpUriRquest request)方法发送请求。
会返回一个HttpResponse对象。
5.HttpRespsonse的getHeaders(String name)与getAllHeaders()方法获取服务端返回的响应头,还可以调用HttpResponse的getEntity()方法获取相应对象,该对象包装了服务端的返回内容。
我们可以从中进行读取。
四.HttpURLConnetion类get与post实现1.get方式访问百度网站package com.lyl.demo;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.InputStream;import .HttpURLConnection;import .URL;public class Comparison {public static void main(String[] args) {String reString=urlConnectionGet("");System.out.println(reString);}public static String urlConnectionGet(String path){try {URL url = new URL(path.trim());//打开连接HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();if(200 == urlConnection.getResponseCode()){//得到输入流InputStream is =urlConnection.getInputStream(); ByteArrayOutputStream baos = new ByteArrayOutputStream();byte[] buffer = new byte[1024];int len = 0;while(-1 != (len = is.read(buffer))){baos.write(buffer,0,len);baos.flush();}return baos.toString("utf-8");}} catch (IOException e) {e.printStackTrace();}return null;}}2.post方式package com.lyl.demo;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import .HttpURLConnection;import .MalformedURLException;import .URL;public class PostMethod {public static void main(String[] args) {httpPost();}public static void httpPost() {try {URL url = new URL("");HttpURLConnection connection = (HttpURLConnection) url .openConnection();connection.setConnectTimeout(5 * 1000);connection.setReadTimeout(5 * 1000);connection.setDoOutput(true);connection.setDoInput(true);connection.setUseCaches(false);connection.setRequestMethod("POST");//connection.setRequestProperty("Connection","keep-Alive");connection.setRequestProperty("Charset", "utf-8");//connection.setRequestProperty("Content-type","application/x-www-");String params = "page = 1 & num = 10";OutputStream os = connection.getOutputStream();os.write(params.getBytes());os.flush();os.close();if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {InputStream is = connection.getInputStream();StringBuilder sb = new StringBuilder();byte[] bytes = new byte[1024];int i = 0;while ((i = is.read(bytes)) != -1) {sb.append(new String(bytes, 0, i, "utf-8"));}is.close();System.out.println("LYL_read:" + sb);}} catch (MalformedURLException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}}五.参考文献1./liushuibufu/p/4140913.html。