1. 实例化URL对象

首先第一步实例化一个URL对象,传入参数为请求的数据的网址。

URL url = new URL("http://www.imooc.com/api/teacher?type=3&cid=1");

2. 获取HttpURLConnection对象

调用URL对象的openConnection方法将返回一个URLConnection对象,而URLConnection类为HttpURLConnection类的父类,可强制转换为我们需要的HttpURLConnection对象。

HttpURLConnection conn = (HttpURLConnection) url.openConnection();

3. 设置请求连接属性

可通过第二步获取的HttpURLConnection对象设置连接的属性,例如setRequestMethod设置连接类型“GET”或“POST”、setReadTimeout设置读取超时时限等等。

conn.setRequestMethod("GET");
conn.setReadTimeout(6000);

4. 获取响应码

响应码用于确认是否连接结果,若返回值为HttpURLConnection.HTTP_OK(200)则连接成功。

conn.getResponesCode();

5. 读取并解析输入流

通过HttpURLConnection对象可以获取到一个输入流,选取适当的方式将输入流的内容读取到本地,再进行解析。

可以直接用JSONObject进行解析,也可以用第三方框架,推荐使用gson。

if (conn.getResponesCode() == 200) {
InputStream in = conn.getInputStream();
byte[] b = new byte[1024 * 512];
int len = 0; //建立缓存流,保存所读取的字节数组
ByteArrayOutputStream baos = new ByteArrayOutputStream();
while ((len = in.read(b)) > -1) {
baos.write(b, 0, len);
}
String msg = baos.toString(); //解析数据
JSONObject obj = new JSONObject(msg);
JSONObject data = obj.getJSONObject("data");
String title = data.getString("title");
String author = data.getString("author");
String content = data.getString("content");
}

gson解析数据简单介绍:

(1)gson解析普通json对象:gson的使用依赖于JSONObject,通过JSONObject对象的getString方法,以字符串形式获取相应数据,而后将其解析为指定类。

String data = obj.getString("data");//obj为JSONObject对象
Gson gson = new Gson();
Essay e = gson.fromJson(data, Essay.class);//第一个参数为json对象形式的字符串,第二个参数为自定义的类,需要将json对象解析成什么类型,就传入相应的类

(2)gson解析数组形式数据:

解析数组形式的数据,步骤与普通json对象基本一致,不同的是,这里fromJson方法的第一个参数为满足json数组形式的字符串,第二个参数则为一个Type对象,而Type对象需通过TypeToken对象的getType方法获取。

获取Type对象:new TypeToken<ArrayList>(){}.getType(),TypeToken的泛型决定数据解析为什么类型,数组形式的数据一般解析为List,而List的泛型为每一个数组元素对应的类,要注意类的属性名需要与json数组中每一项里面的key值保持一致

String data = new JSONObject(result).getString("data");//result为未解析的json字符串
Gson gson = new Gson();
Type listType = new TypeToken<ArrayList<Essay>>(){}.getType();
ArrayList<Essay> e = gson.fromJson(data, listType);

6. 将数据传递回主线程

由于网络操作不能在主线程中进行,而子线程又不允许对UI进行操作,因此需要将解析的数据传递回主线程。

通过使用Handler和Message进行线程之间的通信,代码请看下方完整例子。

7. 完整案例

布局xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.studying.network.DetailActivity"> <TextView
android:id="@+id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="15dp"
android:gravity="center"
android:textSize="24sp" /> <TextView
android:id="@+id/author"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="15dp"
android:gravity="right"
android:paddingRight="10dp"
android:textSize="20sp" /> <TextView
android:id="@+id/content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="8dp"
android:layout_marginTop="15dp"
android:layout_weight="1"
android:lineSpacingMultiplier="1.5"
android:textSize="20sp" /> </LinearLayout>

Activity:

public class DetailActivity extends Activity {

    private TextView titleView, authorView, contentView;
private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg); Essay essay = (Essay) msg.obj;
titleView.setText(essay.getTitle());
authorView.setText(essay.getAuthor());
contentView.setText(essay.getContent());
}
}; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_detail); initView();
initData();
} public void initView() {
titleView = (TextView) findViewById(R.id.title);
authorView = (TextView) findViewById(R.id.author);
contentView = (TextView) findViewById(R.id.content);
} public void initData() {
//网络操作不能在主线程中进行
new Thread(){
@Override
public void run() {
try {
URL url = new URL("http://www.imooc.com/api/teacher?type=3&cid=1");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setReadTimeout(6000); //获取响应码的同时会连接网络
if (conn.getResponseCode() == 200) {
InputStream in = conn.getInputStream();
byte[] b = new byte[512 * 1024];
int len = 0; //将输入流的内容转存到字节数组流中
ByteArrayOutputStream baos = new ByteArrayOutputStream();
while ((len = in.read(b)) > -1){
baos.write(b, 0, len);
}
String result = baos.toString(); //解析数据
JSONObject obj = new JSONObject(result);
JSONObject data = obj.getJSONObject("data");
String title = data.getString("title");
String author = data.getString("author");
String content = data.getString("content"); //通过Message将数据传递回主线程
Message message = handler.obtainMessage();
Essay essay = new Essay(title, author, content);//Essay为自定义类,用于传递多个值
message.obj = essay;
handler.sendMessage(message);//调用这个方法,会触发主线程中Handler对象里的handleMessage方法 conn.disconnect();
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
}
}
}.start();
}
}

Essay:

public class Essay {

    private String title, author, content;

    public Essay(String title, String author, String content) {
this.title = title;
this.author = author;
this.content = content;
} public String getTitle() {
return title;
} public void setTitle(String title) {
this.title = title;
} public String getAuthor() {
return author;
} public void setAuthor(String author) {
this.author = author;
} public String getContent() {
return content;
} public void setContent(String content) {
this.content = content;
}
}

APP请求服务器数据-HttpUrlConnection的更多相关文章

  1. app请求服务器数据方法1-HttpUrlConnection

    1. 实例化URL对象 首先第一步实例化一个URL对象,传入参数为请求的数据的网址. URL url = new URL("http://www.imooc.com/api/teacher? ...

  2. Ajax在jQuery中的应用(加载异步数据、请求服务器数据)

    加载异步数据 jQuery中的load()方法 load(url,[data],[callback]) url:被加载的页面地址 [data]:可选项表示发送到服务器的数据,其格式为 key/valu ...

  3. 关于纯xmlhttprequest请求服务器数据

    今天我们的web技术已经相当的完善, 各种前端框架如jquery或者再深一点的工具APIcloud 的使用极大的方便了我们的开发工作. 今天我要分享一个纯javascript的方式来解决请求服务器数据 ...

  4. iOS请求服务器数据去空NSNull

    我们在处理数据库接口的过程中,如果数据中出现null,我们是没法处理的.我在使用NSUserDaults保存后,出现崩溃. null产生原因 null是后台在处理数据的时候,如果没有设置value值, ...

  5. java ajax长连接请求服务器数据

    Servlet 3.0笔记之异步请求Comet推送长轮询(long polling)篇 Comet另一种形式为长轮询(long polling),客户端会与服务器建立一个持久的连接,直到服务器端有数据 ...

  6. 使用ajax()方法加载服务器数据

    使用ajax()方法加载服务器数据 使用ajax()方法是最底层.功能最强大的请求服务器数据的方法,它不仅可以获取服务器返回的数据,还能向服务器发送请求并传递数值,它的调用格式如下: jQuery.a ...

  7. Android使用HttpUrlConnection请求服务器发送数据详解

    HttpUrlConnection是java内置的api,在java.net包下,那么,它请求网络同样也有get请求和post请求两种方式.最常用的Http请求无非是get和post,get请求可以获 ...

  8. Android(java)学习笔记210:采用post请求提交数据到服务器(qq登录案例)

    1.POST请求:  数据是以流的方式写给服务器 优点:(1)比较安全 (2)长度不限制 缺点:编写代码比较麻烦   2.我们首先在电脑模拟下POST请求访问服务器的场景: 我们修改之前编写的logi ...

  9. Android(java)学习笔记153:采用post请求提交数据到服务器(qq登录案例)

    1.POST请求:  数据是以流的方式写给服务器 优点:(1)比较安全 (2)长度不限制 缺点:编写代码比较麻烦   2.我们首先在电脑模拟下POST请求访问服务器的场景: 我们修改之前编写的logi ...

随机推荐

  1. HashMap?面试?我是谁?我在哪

    现在是晚上11点了,学校屠猪馆的自习室因为太晚要关闭了,勤奋且疲惫的小鲁班也从屠猪馆出来了,正准备回宿舍洗洗睡,由于自习室位置比较偏僻所以是接收不到手机网络信号的,因此小鲁班从兜里掏出手机的时候,信息 ...

  2. 『OGG 01』Win7 配置 Oracle GoldenGate 踩坑指南

    安装 Oracle 安装 Oracle11g 32位[Oracle 32位的话,OGG 也必须是 32位,否则会有0xc000007b无法正常启动 错误] 安装目录为 D:\oracle\produc ...

  3. Python中最好用的命令行解析工具:argparse

    Python 做为一个脚本语言,可以很方便地写各种工具.当你在服务端要运行一个工具或服务时,输入参数似乎是一种硬需(当然你也可以通过配置文件来实现). 如果要以命令行执行,那你需要解析一个命令行参数解 ...

  4. 【开发记录】如何在B/S项目中使用中国天气的实时天气功能

    好久没有更新我的博客了,正好手头有一个比较合适的项目经验可以分享出来,就是这个如何使用中国天气的天气预报功能,也正好做个项目经验记录. 功能需求 这个功能需求比较简单,就是想在网页端显示实时天气数据. ...

  5. 程序员如何巧用Excel提高工作效率 第二篇

    之前写了一篇博客程序员如何巧用Excel提高工作效率,讲解了程序员在日常工作中如何利用Excel来提高工作效率,没想到收到很好的反馈,点赞量,评论量以及阅读量一度飙升为我的博客中Top 1,看来大家平 ...

  6. 高淇java300集异常机制作业

    1.以下关于异常的代码的执行结果是(C ).(选择一项) 1 2 3 4 5 6 7 8 9 10 11 12 public class Test {     public static void m ...

  7. HTML 练习清除浮动 :after

    为 clearfix 类所在的 div 内部最后处添加一个 div 标签,内容为 . ,高度为0, 隐藏 <!DOCTYPE html> <html lang="en&qu ...

  8. 阿里云对象存储OSS访问控制

    阿里云对象存储OSS的Android SDK提供了STS鉴权模式和自签名模式来保障移动终端的安全性. OSS可以通过阿里云STS (Security Token Service) 进行临时授权访问.交 ...

  9. 剑指Spring源码(二)

    这是春节后的第一篇博客,我在构思这篇博客的时候,一度想放弃,想想要不要换个东西写,因为毕竟个人水平有限,Spring源码实在博大精深,不是我这个菜的抠脚的菜鸡可以驾驭的,怕误人子弟,还有就是源码分析类 ...

  10. Docker & ASP.NET Core (3):发布镜像

    第一篇:把代码连接到容器 第二篇:定制Docker镜像 上一篇文章最后有个问题,定制的镜像无法正常运行: 这可能是由于无法找到要运行的dll引起的问题. 之前的Dockerfile的文档我是按照微软的 ...