HttpURLConnection解析
请求响应流程
设置连接参数的方法
- setAllowUserInteraction
- setDoInput
- setDoOutput
- setIfModifiedSince
- setUseCaches
- setDefaultAllowUserInteraction
- setDefaultUseCaches
设置请求头或响应头
HTTP请求允许一个key带多个用逗号分开的values,但是HttpURLConnection只提供了单个操作的方法:
- setRequestProperty(key,value)
- addRequestProperty(key,value)
setRequestProperty和addRequestProperty的区别就是,setRequestProperty会覆盖已经存在的key的所有values,有清零重新赋值的作用。而addRequestProperty则是在原来key的基础上继续添加其他value。
发送URL请求
建立实际连接之后,就是发送请求,把请求参数传到服务器,这就需要使用outputStream把请求参数传给服务器:
- getOutputStream
获取响应
请求发送成功之后,即可获取响应的状态码,如果成功既可以读取响应中的数据,获取这些数据的方法包括:
- getContent
- getHeaderField
- getInputStream
对于大部分请求来说,getInputStream和getContent是用的最多的。
相应的信息头用以下方法获取:
- getContentEncoding
- getContentLength
- getContentType
- getDate
- getExpiration
- getLastModifed
HttpURLConnection
任何网络连接都需要经过socket才能连接,HttpURLConnection不需要设置socket,所以,HttpURLConnection并不是底层的连接,而是在底层连接上的一个请求。这就是为什么HttpURLConneciton只是一个抽象类,自身不能被实例化的原因。HttpURLConnection只能通过URL.openConnection()方法创建具体的实例。
虽然底层的网络连接可以被多个HttpURLConnection实例共享,但每一个HttpURLConnection实例只能发送一个请求。请求结束之后,应该调用HttpURLConnection实例的InputStream或OutputStream的close()方法以释放请求的网络资源,不过这种方式对于持久化连接没用。对于持久化连接,得用disconnect()方法关闭底层连接的socket。
创建HttpURLConnection
URL url = new URL("http://localhost:8080/xxx.do"); URLConnection rulConnection = url.openConnection();// 此处的urlConnection对象实际上是根据URL的 // 请求协议(此处是http)生成的URLConnection类 // 的子类HttpURLConnection,故此处最好将其转化 // 为HttpURLConnection类型的对象,以便用到 // HttpURLConnection更多的API.如下: HttpURLConnection httpUrlConnection = (HttpURLConnection) rulConnection;
设置HttpURLConnection参数
// 设定请求的方法为"POST",默认是GET httpUrlConnection.setRequestMethod("POST"); // 设置是否向httpUrlConnection输出,因为这个是post请求,参数要放在 // http正文内,因此需要设为true, 默认情况下是false; httpUrlConnection.setDoOutput(true); // 设置是否从httpUrlConnection读入,默认情况下是true; httpUrlConnection.setDoInput(true); // Post 请求不能使用缓存 httpUrlConnection.setUseCaches(false); // 设定传送的内容类型是可序列化的java对象 // (如果不设此项,在传送序列化对象时,当WEB服务默认的不是这种类型时可能抛java.io.EOFException) httpUrlConnection.setRequestProperty("Content-type", "application/x-java-serialized-object"); // 连接,从上述url.openConnection()至此的配置必须要在connect之前完成, httpUrlConnection.connect();
URLConnection建立连接
// 此处getOutputStream会隐含的进行connect(即:如同调用上面的connect()方法, // 所以在开发中不调用上述的connect()也可以)。 OutputStream outStrm = httpUrlConnection.getOutputStream();
<p>getInputStream()也是同理。</p>
HttpURLConnection发送请求
// 现在通过输出流对象构建对象输出流对象,以实现输出可序列化的对象。 ObjectOutputStream objOutputStrm = new ObjectOutputStream(outStrm); // 向对象输出流写出数据,这些数据将存到内存缓冲区中 objOutputStrm.writeObject(new String("我是测试数据")); // 刷新对象输出流,将任何字节都写入潜在的流中(些处为ObjectOutputStream) objOutputStm.flush(); // 关闭流对象。此时,不能再向对象输出流写入任何数据,先前写入的数据存在于内存缓冲区中, // 在调用下边的getInputStream()函数时才把准备好的http请求正式发送到服务器 objOutputStm.close();
HttpURLConnection: Post 发送给服务器后台 订单信息, 后台返回 能够支付的真实订单信息
1 public class getChannelResult implements Callable<String>{ 2 // private String urlServer = "https://pay.openspeech.cn/api/order_submit"; 3 private String urlServer = "http://test.xfinfr.com/drippay/api/order_submit"; 4 private String payChannel; 5 6 public getChannelResult(String channel){ 7 payChannel = channel; 8 } 9 10 @Override 11 public String call() throws Exception { 12 13 //初始化订单信息,获得和后台交互的 json串 14 OrderSubmit.Builder builder = new OrderSubmit.Builder(); 15 builder.setAmount(1); 16 builder.setChannel(payChannel); 17 OrderSubmit orderSubmit = null; 18 try { 19 orderSubmit = builder.build(); 20 } catch (Exception e) { 21 e.printStackTrace(); 22 } 23 JSONObject json = orderSubmit.toJson(); 24 25 //建立网络连接,得到后台响应的订单信息 26 HttpURLConnection urlConnection = null; 27 StringBuilder response = new StringBuilder(); 28 BufferedReader reader = null; 29 try { 30 URL url = new URL(urlServer); 31 urlConnection = (HttpURLConnection) url.openConnection(); 32 urlConnection.setRequestProperty("Content-Type", "application/json; charset=UTF-8"); 33 urlConnection.setRequestProperty("Accept", "application/json"); 34 urlConnection.setConnectTimeout(15000); 35 urlConnection.setRequestMethod("POST"); 36 urlConnection.setDoInput(true); 37 urlConnection.setDoOutput(true); 38 urlConnection.setUseCaches(false); 39 urlConnection.connect(); 40 41 DataOutputStream dataJson = new DataOutputStream(urlConnection.getOutputStream()); 42 dataJson.write(json.toString().getBytes()); 43 dataJson.flush(); 44 dataJson.close(); 45 46 int responseCode = urlConnection.getResponseCode(); 47 Log.d(TAG, "call: "+responseCode); 48 // if (200 == responseCode) {49 InputStream in = urlConnection.getInputStream(); 50 reader = new BufferedReader(new InputStreamReader(in)); 51 String line; 52 while ((line = reader.readLine()) != null) { 53 response.append(line); 54 } 55 // } 56 57 } catch (Exception e) { 58 e.printStackTrace(); 59 } finally { 60 if (null != reader) { 61 try { 62 reader.close(); 63 } catch (IOException e) { 64 e.printStackTrace(); 65 } 66 } 67 if (urlConnection != null) { 68 urlConnection.disconnect(); 69 } 70 } 71 return response.toString(); 72 } 73 }
View Code
参考:
http://blog.csdn.net/woxueliuyun/article/details/43267365
转载于:https://www.cnblogs.com/NeilZhang/p/7018107.html
HttpURLConnection解析相关推荐
- Android之三种网络请求解析数据(最佳案例)
小武:相信大家都用过网络请求解析数据,只是方法不一样而已,但是,逻辑都是差不多的: 一:AsyncTask解析数据 AsyncTask主要用来更新UI线程,比较耗时的操作可以在AsyncTask中使用 ...
- Android官方文档系列(翻译)
下面一些内容是我翻译Android官方文档相关文章,以及整理的其它内容. 菜鸟上路,一边学习一边整理,若您发现有错误的地方还请不吝赐教. Activity 解读Android之Activity基础知识 ...
- 解析HttpURLConnection与代理服务器
前网络上最流行的协议就是HTTP协议.HTTP协议有许多优点,例如它能够穿越防火墙.同时HTTP也是很多其他协议的基础,例如SOAP协议就是建立在HTTP协议之上的. Java通过两种API对HTTP ...
- Android手机应用开发(十) | HttpURLConnection的使用以及解析JSON数据
实验目的 学会使用HttpURLConnection请求访问Web服务 学习Android线程机制,学会线程更新UI 学会解析JSON数据 学习CardView布局技术 效果 添加依赖 //json解 ...
- Android使用HttpURLConnection返回并解析JSON数据,以聚合数据API之星座配对为例
目录 一.实现效果 二.注册聚合网并申请key 三.Android Studio具体实现 3.1 导入json解析所需依赖包 3.2 构造显示界面layout 3.3 核心代码 3.3.1 使用Htt ...
- Android复习06【网络编程提高篇-安装GsonFormat、HttpUrlConnection封装、线程池、GsonFormat解析Json、自动加载下一页、自定义组件、页头页尾刷新、侧滑删除】
2020-04-07 星期二 [第8周] [考试不考...] 目 录 思维导图 安装GsonFormat插件 添加网络访问权限 GitHub---HttpUrlConnection封装 线程池 G ...
- HttpUrlConnection底层实现和关于java host绑定ip即时生效的设置及分析
最近有个需求需要对于获取URL页面进行host绑定并且立即生效,在java里面实现可以用代理服务器来实现:因为在测试环境下可能需要通过绑定来访问测试环境的应用 实现代码如下: public stati ...
- android 网络编程实现,Android开发使用HttpURLConnection进行网络编程详解【附源码下载】...
本文实例讲述了Android开发使用HttpURLConnection进行网络编程.分享给大家供大家参考,具体如下: --HttpURLConnection URLConnection已经可以非常方便 ...
- 解析腾讯行政区划API接口数据
个人网站:http://xiaocaoshare.com/ 接口地址:https://lbs.qq.com/service/webService/webServiceGuide/webServiceD ...
最新文章
- 在Heroku上创建node.js应用程序时,我应该将node_modules检入git吗?
- MyISAM和InnoDB执行引擎的区别,为什么MyISAM查询效率高,B树和B+树的区别
- 文件 在线压缩 技术
- cocos2d-x android 环境搭配,cocos2d-x Android环境配置问题和解决方法
- potainer 日志_日志系统落地:制定日志规范
- 云小课|DGC数据开发之基础入门篇
- ffdshow 源代码分析 6: 对解码器的dll的封装(libavcodec)
- c++初学,计算立方体的体积和面积,并比较两个立方体是否相同:
- RPA机器人自动调用U盾方案
- 梁宁增长思维30讲笔记 - 模式
- iOS开发-常用第三方开源框架介绍
- shell常见的语句结构_wuli大世界_新浪博客
- 远程桌面服务器打开任务管理器并运行Windows资源管理器
- LeetCode-183. 从不订购的客户( Customers Who Never Order)。
- 比较两条曲线的相似程度
- javascript11位手机号码正则表达式
- 模板的选择和结合部位可塑性处理对GPCRs虚拟筛选性能影响
- Unity游戏快速制作特效
- 树莓派 USB麦克风 录音
- Python获取excel数据
热门文章
- https://blog.csdn.net/nameofcsdn/article/details/53164652
- Nginx的启动、停止和重启
- 创建第一个Django项目
- JS中定时器setTimeout,setInterval,clearTimeout,clearInterval用法
- 随机数生成器,完成后打开文件。
- 影响u盘传输速度和使用寿命的几大因素
- DateDiff 函数的用法
- .net core 微服务之API网关 开源中间件 Ocelot 笔记
- Bootstrap 3 Typeahead
- Python和Flask真强大:不能错过的15篇技术热文(转载)