使用UrlConnection实现后台模拟http请求的简单实例
使用UrlConnection实现后台模拟http请求的简单实例
这两天在整理看httpclient,然后想自己用UrlConnection后台模拟实现Http请求,于是一个简单的小例子就新鲜出炉了(支持代理哦):
publicclassSimpleHttpTest{ publicstaticStringsend(StringurlStr,Map<String,String>map,Stringencoding){ Stringbody=""; StringBuffersbuf=newStringBuffer(); if(map!=null){ for(Entry<String,String>entry:map.entrySet()){ sbuf.append(entry.getKey()).append("=").append(entry.getValue()).append("&"); } if(sbuf.length()>0){ sbuf.deleteCharAt(sbuf.length()-1); } } //1、重新对请求报文进行GBK编码 byte[]postData=null; try{ postData=sbuf.toString().getBytes(encoding); }catch(UnsupportedEncodingExceptione){ e.printStackTrace(); } //2、发送HTTP(S)请求 OutputStreamreqStream=null; InputStreamresStream=null; URLConnectionrequest=null; try{ System.out.println("交易请求地址:"+urlStr); System.out.println("参数:"+sbuf.toString()); //A、与服务器建立HTTP(S)连接 URLurl=null; try{ Proxyproxy=newProxy(java.net.Proxy.Type.HTTP,newInetSocketAddress("127.0.0.1",8087)); url=newURL(urlStr); request=url.openConnection(proxy); request.setDoInput(true); request.setDoOutput(true); }catch(MalformedURLExceptione){ e.printStackTrace(); }catch(IOExceptione){ e.printStackTrace(); } //B、指定报文头【Content-type】、【Content-length】与【Keep-alive】 request.setRequestProperty("Content-type","application/x-www-form-urlencoded"); request.setRequestProperty("Content-length",String.valueOf(postData.length)); request.setRequestProperty("Keep-alive","false"); request.setRequestProperty("User-Agent","Mozilla/4.0(compatible;MSIE5.0;WindowsNT;DigExt)"); //C、发送报文至服务器 reqStream=request.getOutputStream(); reqStream.write(postData); reqStream.close(); //D、接收服务器返回结果 ByteArrayOutputStreamms=null; resStream=request.getInputStream(); ms=newByteArrayOutputStream(); byte[]buf=newbyte[4096]; intcount; while((count=resStream.read(buf,0,buf.length))>0){ ms.write(buf,0,count); } resStream.close(); body=newString(ms.toByteArray(),encoding); }catch(UnknownHostExceptione){ System.err.println("服务器不可达【"+e.getMessage()+"】"); }catch(IOExceptione){ e.printStackTrace(); }finally{ try{ if(reqStream!=null) reqStream.close(); if(resStream!=null) resStream.close(); }catch(Exceptionex){ } } System.out.println("交易响应结果:"); System.out.println(body); returnbody; } publicstaticvoidmain(String[]args){ Stringurl="http://php.weather.sina.com.cn/iframe/index/w_cl.php"; Map<String,String>map=newHashMap<String,String>(); map.put("code","js"); map.put("day","0"); map.put("city","上海"); map.put("dfc","1"); map.put("charset","utf-8"); send(url,map,"utf-8"); } }
结果如下:
交易请求地址:http://php.weather.sina.com.cn/iframe/index/w_cl.php 参数:dfc=1&charset=utf-8&day=0&code=js&city=上海 交易响应结果: (function(){varw=[];w['上海']=[{s1:'阴',s2:'阴',f1:'yin',f2:'yin',t1:'17',t2:'14',p1:'≤3',p2:'≤3', d1:'东北风',d2:'东北风'}];varadd={now:'2015-11-1119:04:33',time:'1447239873',update:' 北京时间11月11日17:10更新',error:'0',total:'1'};window.SWther={w:w,add:add};})();//0
代码中的步骤写的很明白了,如果你有心,还可以对该方法进行各种封装,方便使用。下篇我会分享一下httpclient是如何模拟后台来发送http请求的,还有配置ssl、代理、自定义header等等,敬请期待吧。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!