Java 网络请求两种方式
来源:互联网 发布:linux 修改防火墙 编辑:程序博客网 时间:2024/06/06 16:25
首先需要了解网络协议,HTTP协议是互联网上使用最广泛的协议,任何在网络上传输数据必须遵循某种协议。请求方式常用两种GET和POST请求,请求完成状态码很多,经常见到的是404找不到资源文件,200是请求成功。网络请求两种:第一种:原生HttpURLConnection,第二种:apache的.HttpClient。
大致提了一下需要用到的东西,接下来看一下详细的比较:
请求方式比较(GET POST)
GET 传输量小,速度快,明文显示URL不安全。
POST传输量接近无限制,速度慢,数据放在HTML HEADER内一起传送到服务端URL地址,对用户不可见,较GET安全。
网络请求比较:(HttpURLConnection HttpClient )
HttpURLConnection书写时比较繁琐,但运行效率较高
HttpClient书写变的容易,并且便于理解,运行效率不如HttpURLConnection
HttpURLConnection
GET请求:
抽象类 URLConnection
是所有类的超类,它代表应用程序和 URL 之间的通信链接。此类的实例可用于读取和写入此 URL 引用的资源。通常,创建一个到 URL 的连接需要几个步骤:
1.使用URL定位到网络资源(URL url = new URL(URL);)
2.使用ULR的openConnection与资源建立连接(HttpURLConnection conn = (HttpURLConnection) url.openConnection();)
3.设置请求的参数和请求方式(conn.setRequestMethod("GET"))
4.读取服务器资源的流(conn.getInputStream())
为了展示方便,建立了一个HttpUtil勉强算工具类
HttpUtil.java
public class HttpUtil {public static byte[] getImage(String URLpath) {ByteArrayOutputStream baos=null;InputStream is=null;try {// 1.创建URL对象(统一资源定位符) 定位到网络上了URL url = new URL(URLpath);// 2.创建连接对象HttpURLConnection conn = (HttpURLConnection) url.openConnection();// 3.设置参数conn.setDoInput(true);// 设置能不能读conn.setDoOutput(true);// 设置能不能写conn.setRequestMethod("GET");// 请求方式必须大写conn.setReadTimeout(5000);// 连接上了读取超时的时间conn.setConnectTimeout(5000);// 设置连接超时时间5s// 获取响应码int code = conn.getResponseCode();// 4.开始读取if(code==200){//5读取服务器资源的流is= conn.getInputStream();//准备内存输出流 临时存储的baos = new ByteArrayOutputStream();byte buff[] = new byte[1024];int len=0;while((len=is.read(buff))!=-1){baos.write(buff,0,len);baos.flush();}}return baos.toByteArray();} catch (Exception e) {e.printStackTrace();}finally{//关流if(is!=null&&baos!=null){try {is.close();baos.close();} catch (IOException e) {e.printStackTrace();}}}return null;}}test.java
public class URLRequestImage {public static void main(String[] args) throws Exception {String url = "https://www.baidu.com/img/bdlogo.png";//工具类请求完成的字节数组byte[] image = HttpUtil.getImage(url);//切割URL字符串得到名字和扩展名String fileName = url.substring(url.lastIndexOf("/")+1);File file = new File("c:/image/"+fileName+"");FileOutputStream fos = new FileOutputStream(file);fos.write(image);fos.close();}}至此java原生的HttpURLConnection结束。
POST请求:
URL url = new URL(path);// 2.创建连接对象HttpURLConnection conn = (HttpURLConnection) url.openConnection()conn.setRequestMethod("POST");//必须大写// 给服务器写信息 String param是封装了用户名和密码 格式是:user pwOutputStream os = conn.getOutputStream();os.write(param.getBytes());
HttpClient
GET请求:
它并不能想HttpURLConnection那样直接就可以使用,由于是第三方的,所以需要导入jar包,网上很多,这里就不给出了。下面的Demo使用了线程,接口回调方面的知识
HttpUtil.java
public class HttpUtil {public static void getImage(final String url, final CallBack callBack) {new Thread(new Runnable() {@Overridepublic void run() {// 打开一个浏览器HttpClient client = new DefaultHttpClient();//在地址栏上输入地址HttpGet get = new HttpGet(url);try {//敲击回车HttpResponse response = client.execute(get);if (response.getStatusLine().getStatusCode() == 200) {HttpEntity entity = response.getEntity();byte[] byteArray = EntityUtils.toByteArray(entity);//接口用于主函数回调callBack.getByteImage(byteArray);}} catch (Exception e) {// TODO: handle exception}}}).start();}interface CallBack {void getByteImage(byte[] b);}}
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">Test.java</span>
public class URLRequestImage {public static void main(String[] args) throws Exception {String url = "https://www.baidu.com/img/bdlogo.png";HttpUtil.getImage(url, new CallBack() {@Overridepublic void getByteImage(byte[] b){try {File file = new File("C:/img/a.png");FileOutputStream fos = new FileOutputStream(file);fos.write(b);fos.flush();System.out.println("图片下载成功");} catch (Exception e) {e.printStackTrace();}}});}}因为本人只有C盘一个盘符,这里曾经多次尝试写入C盘根目录,但每次都报FileNotFoundException拒绝访问,改成C盘下的一个文件夹即可。
POST请求:
HttpPost post = new HttpPost(url);//定义NameValuePair对象List<NameValuePair> list = new ArrayList<NameValuePair>();BasicNameValuePair pair1 = new BasicNameValuePair("userName", "张三");BasicNameValuePair pair2 = new BasicNameValuePair("userPassword", "123");//添加到List集合list.add(pair1);list.add(pair2);//UrlEncodedFormEntity entity = new UrlEncodedFormEntity(list);//设置Post请求entity entity可以理解为大箱子post.setEntity(entity);总结:无论那种网络请求GET都是很简单并且很常见的,而POST的请求却很繁琐,HttpURLconnection用流向服务器里写,HttpClient是给HttpPost引用setEntity。
- Java 网络请求两种方式
- volley两种网络请求方式
- 网络的两种请求方式
- httpclient 两种方式请求网络
- 两种方式综合请求网络数据
- iOS 网络请求数据两种请求方式GET,POST
- Java网络请求(get/post)工具类实现的两种方式
- 两种网络请求
- android的两种网络请求方式关键代码详解
- httpURLConnection-网络请求的两种方式-get请求和post请求
- httpURLConnection-网络请求的两种方式-get请求和post请求
- Java发起Post请求的两种方式
- Http请求两种方式
- Java发送Http请求的两种方式java.net.URLConnection(方式一)
- iOS- 网络请求的两种常用方式GET & POST的区别
- Java发送Http请求的两种方式HttpClient(方式二)
- Http协议网络请求java方式
- java网络请求GET和POST方式
- spring xml properties split with comma for list
- java框架技术之hibernate核心类和接口
- 设备\Device\Harddisk1\DR1 有一个不正确的区块
- PAT 1022. Digital Library (30)
- C++获取本地计算机主机名和IP
- Java 网络请求两种方式
- 使用netstat_-na查看网络连接_记录结果_并解释含义
- 如何将一个json中的json字符串转换成一个USER对象。
- spring mvc controller间跳转 重定向 传参
- Linux Futex的设计与实现
- Mybatis_mysql db_含str_to_date()时出现获取不到数据问题
- 输出n<=31的梅森素数
- 搜集常见的测试语句
- Linux Gparted创建NTFS分区,安装Windows系统时不识别的解决方案