1、要了解一些概念性的东西,比如Http的协议以及协议头等一些东东

2、HttpURLConnection一般步骤:创建URL对象==》获取URL的HttpURLConnection对象实例==》设置HTTP请求使用的方法==》设置超时和消息头==》对服务器响应码判断==》获得服务器返回的输入流==》关掉HTTP连接

2.1、GET请求示例

//创建URL对象,xxx是服务器API
URL url = new URL("xxx");
//调用URL对象的openConnection( )来获取HttpURLConnection对象实例
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
//请求方法为GET
conn.setRequestMethod("GET");
//设置连接超时为5秒
conn.setConnectTimeout(5000);
//服务器返回东西了,先对响应码判断
if (conn.getResponseCode() == 200) {
//用getInputStream()方法获得服务器返回的输入流
InputStream in = conn.getInputStream();
byte[] data = read(in); //流转换为二进制数组,read()自己写的是转换方法
String html = new String(data, "UTF-8");
System.out.println(html);
in.close();
}

ps:上述步骤基于服务器接口正常的前提下,当然异常要另外处理,请求头按实际需要设置,得到服务器返回的输入流后按需要转换使用,另外有时候网络请求要开一条线程

2.2、POST请求:POST请求大体和GET一致,只是设置相关参数的时候要注意设置允许输入、输出,还有POST方法不能缓存,要手动设置为false

//创建URL对象,xxx是服务器API
URL url = new URL("xxx");
//调用URL对象的openConnection( )来获取HttpURLConnection对象实例
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
//请求方法为GET
conn.setRequestMethod("POST");
//设置连接超时为5秒
conn.setConnectTimeout(5000);
//允许输入输出
conn.setDoInput(true);
conn.setDoOutput(true);
//不能缓存
conn.setUseCaches(false);
//至少要设置的两个请求头
conn.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
//输出流包含要发送的数据,要注意数据格式编码
OutputStream op=conn.getOutputStream();
op.write(new String("name=zhylioooo").getBytes());
//服务器返回东西了,先对响应码判断
if (conn.getResponseCode() == 200) {
//用getInputStream()方法获得服务器返回的输入流
InputStream in = conn.getInputStream();
byte[] data = read(in); //流转换为二进制数组,read()是转换方法
String html = new String(data, "UTF-8");
System.out.println(html);
in.close();
}

3、HttpClient的使用步骤:创建HttpClient对象==》创建Http请求对象(GET、POST不同)==》设置请求参数==》执行请求==》获取响应对象==》对响应对象处理==》关闭相应对象==》关闭HttpClient

3.1、GET

      //创建httpclient对象
CloseableHttpClient httpclient = HttpClients.createDefault();
//创建GET对象
HttpGet httpget = new HttpGet("xxx");//xxx是服务器API
//执行请求
CloseableHttpResponse response = httpclient.execute(httpget);
if(response.getStatusLine().getStatusCode()==200) {
HttpEntity entity = response.getEntity();
//所需内容都在entity里面,这里可以对数据操作
String detail = EntityUtils.toString(entity,"UTF-8");
System.out.println(detail);
}
response.close();
httpclient.close();

如果需要参数,可以用URIBuilder工具类来简化

URI uri = new URIBuilder()
.setScheme("https")
.setHost("xxx")
.setPath("/xxx")
.setParameter("key1", "value1")
.setParameter("key2", "value2")
.build();
HttpGet httpget = new HttpGet(uri);

3.2、POST:POST一般用于提交一些特别的东西,内容多种多样,HttpClient针对不同内容提供了不同的数据容器,如最常见的字符串(StringEntity),字节数组(ByteArrayEntity),输入流(InputStreamEntity),和文件(FileEntity),请注意InputStreamEntity是不可重复的,因为它只能从底层数据流中读取一次。一般建议实现一个自定义HttpEntity类,而不是使用泛型InputStreamEntity。 FileEntity可以是一个很好的起点:

File file = new File("xxx.txt");
FileEntity entity = new FileEntity(file,
ContentType.create("text/plain", "UTF-8"));
HttpPost httppost = new HttpPost("xxx");
httppost.setEntity(entity);

POST最常见的提交表单数据:创建完HttpPost对象后,通过NameValuePair集合来存储等待提交的参数,并将参数传递到UrlEncodedFormEntity中,最后调用setEntity(entity)完成, HttpClient.execute(HttpPost)即可:

List<NameValuePair> formparams = new ArrayList<NameValuePair>();
formparams.add(new BasicNameValuePair("name", "zhylioooo"));
formparams.add(new BasicNameValuePair("pswd", "123456"));
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(formparams, Consts.UTF_8);
HttpPost httppost = new HttpPost("xxx");
httppost.setEntity(entity);

4、一般实际开发很少自己写HttpURLConnection和HttpClient,都是用别人封装 好的第三方网络请求框架,例如:Volley,android-async-http,loopj等,因为网络操作涉及到 异步以及多线程,自己动手写的话很麻烦,所以实际开发还是直接用第三方。

5、HttpClient用到的jar包:https://pan.baidu.com/s/1gfjHi2B

java 的http请求方式:HttpURLConnection和HttpClient的更多相关文章

  1. Http请求的 HttpURLConnection 和 HttpClient

    HTTP 请求方式: GET和POST的比较 请求包.png 例子.png 响应包.png 例子.png 请求头描述了客户端向服务器发送请求时使用的http协议类型,所使用的编码,以及发送内容的长度, ...

  2. Android之Http通信——3.Android HTTP请求方式:HttpURLConnection

    3.Android HTTP请求方式之HttpURLConnection 引言: 好了,前两节我们已经对HTTP协议进行了学习.相信看完前两节的朋友对HTTP协议相比之前 应该更加熟悉吧.好吧.学了要 ...

  3. 关于安卓HTTP请求用HttpUrlConnection还是HttpClient好

    安卓和JAVA应用开发少不了要提交HTTP请求,而基本上目前有两个实现方式:HttpUrlConnection(即URL.openConnection)和HttpClient. 网上不少人都认为Htt ...

  4. Android HTTP请求用HttpUrlConnection与HttpClient比较

    在安卓和JAVA应用开发中需要访问网络,少不了要提交HTTP请求,而基本上目前有两个实现方式:HttpUrlConnection(即URL.openConnection)和HttpClient. 网上 ...

  5. HTTP访问的两种方式:HttpURLConnection和HTTPClient的比较

    http://blog.sina.com.cn/s/blog_87216a0001014sm7.html http://www.2cto.com/kf/201305/208770.html ----- ...

  6. android 中的Http请求类HttpUrlConnection和HttpClient类

    Android系统提供了两种HTTP通信类,HttpURLConnection和HttpClient. 如何选择这两个类的使用:android-developers.blogspot.com/2011 ...

  7. 两种请求方式URLHttpconnection 和Httpclient提交表单 网络篇(二)

    安卓有两种发送请求的方式:URLHttpconnection 和Httpclient 下面就来讲下这两种方式,这篇是最基础的使用 进阶请看第二篇  先占位 打扫卫生去了T T 快过年了 框架就放网络篇 ...

  8. JAVA模拟各种请求方式访问RESTFUL

    //打开restful链接 HttpURLConnection conn = (HttpURLConnection) url.openConnection(); // 提交模式 conn.setReq ...

  9. android 网络编程之HttpURLConnection与HttpClient使用与封装

    1.写在前面     大部分andriod应用需要与服务器进行数据交互,HTTP.FTP.SMTP或者是直接基于SOCKET编程都可以进行数据交互,但是HTTP必然是使用最广泛的协议.     本文并 ...

随机推荐

  1. 【Java】NIO中Selector的创建源码分析

    在使用Selector时首先需要通过静态方法open创建Selector对象 public static Selector open() throws IOException { return Sel ...

  2. Protocol Buffers官方文档(proto3语言指南)

    本文是对官方文档的翻译,大部分内容都是引用其他一些作者的优质翻译使文章内容更加通俗易懂(自己是直译,读起来有点绕口难理解,本人英文水平有限),参考的文章链接在文章末尾 这篇指南描述如何使用protoc ...

  3. 反射实现数据库增删改查DAO及DAOImpl源代码(一)

    这是DAO层,第一次尝试,如有bug希望能即使反馈,我们共同进步.具体的用法和实现原理我会在前面几篇博客中补充更新.配置文件及项目目录结构会在下一篇中贴出! package com.javasm.su ...

  4. Zabbix监控系统配置之-自动发现规则入门

    假设你已经知道[模板-监控项-监控项原型-自动发现规则]之间的关系.(此处应有关系图,待填坑) 1. 添加模板 我新建了一个名叫Dapianzi SNMP Linux的模板,里面添加了已经启动了SNM ...

  5. Fiddler-抓Android和IOS包

    知识:Fiddler能捕获IOS设备发出的请求,比如IPhone, IPad, MacBook. 等等苹果的设备.  同理,也可以截获Andriod,Windows Phone的等设备发出的HTTP/ ...

  6. Boost多线程

    一.概述     线程是在同一程序同一时间内允许执行不同函数的离散处理队列,这使得在一个长时间进行某种特殊运算的函数在执行时不阻碍其他的函数时变得十分重要.线程实际上允许同时执行两种函数,而这两者不必 ...

  7. 手写的select 下拉菜单

    我们在进行表单设计时,可能要用到select下拉选项控件,遗憾的是,IE浏览器默认的select控件外观非常丑陋,而且不能用样式来控制,不能在选项中添加图片等信息.今天我将通过实例来讲解如何用CSS和 ...

  8. 前端 HTML-CSS 规范

    黄金定律 一个项目应该永远遵循同一套编码规范! 不管有多少人共同参与同一项目,一定要确保每一行代码都像是同一个人编写的. HTML 语法 用两个空格来代替制表符(tab) – 这是唯一能保证在所有环境 ...

  9. .gitkeep--git提交空目录的解决方法

    前言 git和 svn不同,仅仅跟踪文件的变动,不跟踪目录.所以,一个空目录,如果里面没有文件,即便 git add 这个目录,另外在别处 check out 的时候,是没有这个空目录的. 只跟踪文件 ...

  10. 关于JSON可能出现的错误,待更/todo

    今天写到webAppService.js的时候,用fs模块调用json,发现单引号的json被警告了. json就是一段有格式的字符串,如果数据的封装与解析都是我们自己做的时候,单引号和双引号是没啥关 ...