*****
**HTTPURLConnection**
[TOC=6]
# 1. HttpURLConnection的简介:
Sun公司提供的库,也是Java的标准类库中的一员,但是过于原始,没有封装其他功能
# 2. HttpURLConnection实现网络数据请求:
以前我们使用到的数据都是固定的死数据,那么真正的App里面,所有数据都是灵活的,展示的时候需要在网络上获取最新的数据,这个时候我们就需要通过一定的操作去进行网络数据的请求。
常见的请求方式:
* GET
* POST
请求的内容:
* 数据
* 图片
# 3. 课堂案例
## 3.1 InputStream转字符串的方法
方法一:
~~~
public String inputStream2String() {
ByteArrayOutputStream result = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int length;
while ((length = inputStream.read(buffer)) != -1) {
result.write(buffer, 0, length);
}
String str = result.toString(StandardCharsets.UTF_8.name());
return str;
}
~~~
方法二:
~~~
public String inputStream2String() {
StringBuilder sb = new StringBuilder();
String line;
BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
while ((line = br.readLine()) != null) {
sb.append(line);
}
String str = sb.toString();
return str;
}
~~~
方法三 Google Guava提供:
~~~
public String inputStream2String() {
return CharStreams.toString(new InputStreamReader(inputStream, StandardCharsets.UTF_8));
}
~~~
方法四 Google Guava提供:
~~~
public String inputStream2String() {
return new String(ByteStreams.toByteArray(inputStream));
}
~~~
## 3.2 HTTPURLConnection请求网络文本
![](https://box.kancloud.cn/171edf087594e552c31353254b8b0c1c_1080x1920.png)
![](https://box.kancloud.cn/e3a81b393ffbb7e7973ff4a059d5451a_1080x1920.png)
![](https://box.kancloud.cn/fc843caf2dbcc0b6e86a50dd57717cbb_1080x1920.png)
核心代码:
`
~~~
package cn.zhaoliang5156.day02.ui;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import cn.zhaoliang5156.day02.R;
/**
* 网页源码 查看
*
* @author zhaoliang
* @version 1.0
* @date 2019-03-13
*/
public class SourceActivity extends AppCompatActivity {
// 声明控件
private EditText etInput;
private TextView tvResult;
private String result;
// 用来更新UI的Handler
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
tvResult.setText(result);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_source);
bindView();
}
/**
* 绑定控件
*/
private void bindView() {
etInput = findViewById(R.id.et_source_input);
tvResult = findViewById(R.id.tv_result);
}
/**
* 按钮点击事件,点击按钮请求网络数据
*
* @param view
*/
public void showSource(View view) {
new Thread() {
@Override
public void run() {
HttpURLConnection connection = null;
try {
// 创建寻址对象
URL url = new URL(etInput.getText().toString());
// 通过URL的openConnection方法打开连接
connection = (HttpURLConnection) url.openConnection();
// 设置请求方法
connection.setRequestMethod("GET");
// 设置连接超出
connection.setConnectTimeout(5000);
// 设置读取超时
connection.setReadTimeout(5000);
// 判断服务器是否响应成功 响应成功状态码为200
if (connection.getResponseCode() == 200) {
// 获取服务器返回的流对象
InputStream inputStream = connection.getInputStream();
// 把服务器的流对象转换成字符串
result = inputStream2String(inputStream);
// 发送消息 更新UI
mHandler.sendEmptyMessage(0x00);
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
}
/**
* 把流转换成字符串
*
* @param inputStream
* @return
* @throws IOException
*/
private String inputStream2String(InputStream inputStream) throws IOException {
// 创建ByteArrayOutputStream对象
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
// 创建一个变量用来存储读取的长度
int len = -1;
// 创建一个字节数组用来存储读取到的数据
byte[] b = new byte[1024];
// 使用循环读取流
while ((len = inputStream.read(b)) != -1) {
// 把读取的数据写入到输出流中
outputStream.write(b, 0, len);
}
// 把流转换成字符串
return new String(outputStream.toByteArray());
}
}
~~~
`
## 3.3 HTTPURLConnection请求网络图片
![](https://box.kancloud.cn/cc3c8a8354994b05797de4fe11df4122_1080x1920.png)
![](https://box.kancloud.cn/e3f314fc97fcdabe46f9181a9e7bf5ad_1080x1920.png)
## 3.4 HTTPURLConnection注册登录
## 3.5 HTTPURLConnection+Handler+ListView 综合应用
# 4. 扩展:
String/StringBuffer/StringBuilder的区别
String:不可变字符串
StringBuffer:可变字符串,效率低,线程安全
StringBuilder:可变字符序列,效率高,线程不安全
- 咨询项目实战
- 第一单元 HTTP协议
- 1.1 OSI七层模型
- 1.2 HTTP协议(重点)
- 1.3 HTTPS协议(了解)
- 1.4 TCP/IP协议扩展
- 1.5 WebService简介及实战(无接口)
- 1.6 课后练习
- 第二单元 HTTPURLConnection
- 2.1 ANR
- 2.2 网络判断
- 2.3 HTTPURLConnection
- 2.4 课后练习
- 第三单元 AsyncTask
- 3.1 AsyncTask概述
- 3.2 AsyncTask基本使用
- 3.3 课后练习
- 第四单元 图片异步加载
- 4.1 图片异步加载概述
- 4.2 LruCache
- 4.3 DiskLRUCache
- 4.4 图片三级缓存概述
- 4.5 封装图片加载缓存框架
- 第五单元 ListView多条目
- 5.1 ListView多条目概述
- 5.2 ListView多条目的使用
- 第六单元 ListView实现下拉刷新上拉加载
- 6.1 下拉刷新和上拉加载更多
- 6.2 XListView概述
- 6.3 XListView的使用
- 第七单元 封装网络框
- 7.1 封装网络框架概述
- 7.2 网络框架的封装
- 第八单元 项目介绍
- 8.1 公司项目团队架构简介
- 8.2 项目文档及项目流程介绍
- 8.3 项目管理
- 8.4 项目开发
- 第九单元 项目框架搭建
- 9.1 基类封装概述
- 9.2 Application中初始化配置
- 9.3 项目中的工具类
- 9.4 封装网络请求框架
- 9.5 封装图片异步缓存框架
- 第十单元 搭建UI框架1
- 10.1 侧滑菜单概述
- 10.2 主界面框架搭建
- 第十一单元 搭建UI框架2
- 11.1 TabLayout的概述
- 11.2 TabLayout的使用
- 第十二单元 图片上传
- 12.1 图片上传概述
- 12.2 图片上传的实现
- 第十三单元 PullToRefresh
- 13.1 PullToRefresh概述
- 13.2 PullToRefresh的使用
- 13.3 缓存业务实现思路
- 第十四单元 事件分发及滑动冲突
- 14.1 事件分发概述
- 14.2 事件分发流程
- 14.3 事件分发的使用
- 第十五单元 传感器的基本使用
- 15.1 传感器概述
- 15.2 传感器的使用
- 第十六单元 HTML与CSS复习
- 16.1 HTML
- 16.2 CSS
- 第十七单元 js复习
- 17.1 js基础语法
- 17.2 js数组和内置对象
- 17.3 js常用事件
- 17.4 js对象模型
- 17.5 js 正则表达式
- 第十八单元 WebView
- 18.1 WebView 概述
- 18.2 WebView的使用
- 18.3 WebView与js交互
- 第十九单元 项目案例
- 项目概述
- 第二十单元 项目答辩
- 周考
- 第一周周考
- 第二周周考
- 第三种周考
- 月考
- 接口文档