使用URLConnection提交请求
URL的openConnection()方法会返回一个URLConnection对象,该对象表示URL和应用程序之间的通信连接。应用程序可以通过URLConnection实例向该URL发送请求,读取URL所引用的资源。
通过创建一个和URL的连接、并发送请求、读取此URL引用的资源需要如下几个步骤:
- 通过调用URL对象的openConnection()方法创建一个URLConnection对象;
- 设置URLConnection对象的参数和普通请求属性
- 如果只是发送GET方式请求,使用connect()方法建立和远程资源之间的实际连接即可;如果需要发送POST方式的请求,需要获取URLConnection实例对应的输出流来发送请求参数
- 远程资源变为可用,程序可以访问远程资源的头字段,或通过输入流读取远程资源的数据
第一步:定义布局文件,上方是两个按钮,下方是一个TextView,显示效果如下 软件界面布局效果图 第二步:编写用户单击【发送GET请求】按钮的事件处理方法,代码如下
public String sendGet(String url, String params) {
// 向指定URL发送GET方法的请求,返回URL所代表远程资源的响应
// params请求参数的形式应是:name1=value1&name2=value2
String result = "";
BufferedReader in = null;
try {
String urlName = url + "?" + params;
URL realUrl = new URL(urlName);
URLConnection conn = realUrl.openConnection();// 打开和URL之间的连接
// 设置通用的请求属性
conn.setRequestProperty("accept", "*/*");
conn.setRequestProperty("connection", "Keep-Alive");
conn.setRequestProperty("user-agent",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
conn.connect();// 建立实际的连接
// 获取所有响应头字段
Map map = conn.getHeaderFields();
// 遍历所有的响应头字段
for (String key : map.keySet()) {
System.out.println(key + "--->" + map.get(key));
}
// 定义BufferedReader输入流来读取URL的响应
in = new BufferedReader(
new InputStreamReader(conn.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
result += "\n" + line;
}
} catch (Exception e) {
System.out.println("发送GET请求出现异常!" + e.getMessage());
} finally {// 使用finally块来关闭输入流
try {
if (in != null) {
in.close();
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
return result;
}
第三步:编写用户单击【发送POST请求】按钮的事件处理方法,代码如下
public String sendPost(String url, String params) {
// 向指定URL发送POST方法的请求,返回URL所代表远程资源的响应
// params请求参数的形式应是:name1=value1&name2=value2
PrintWriter out = null;
BufferedReader in = null;
String result = "";
try {
URL realUrl = new URL(url);
// 打开和URL之间的连接
URLConnection conn = realUrl.openConnection();
// 设置通用的请求属性
conn.setRequestProperty("accept", "*/*");
conn.setRequestProperty("connection", "Keep-Alive");
conn.setRequestProperty("user-agent",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)");
// 发送POST请求必须设置如下两行
conn.setDoOutput(true);
conn.setDoInput(true);
// 获取URLConnection对象对应的输出流
out = new PrintWriter(conn.getOutputStream());
out.print(params);// 发送请求参数
out.flush();// flush输出流的缓冲
// 定义BufferedReader输入流来读取URL的响应
in = new BufferedReader(
new InputStreamReader(conn.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
result += "\n" + line;
}
} catch (Exception e) {
System.out.println("发送POST请求出现异常!" + e);
e.printStackTrace();
} finally {// 使用finally块来关闭输出流、输入流
try {
if (out != null) {
out.close();
}
if (in != null) {
in.close();
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
return result;
}
第四步:在Activity类的onCreate()方法中添加如下代码:
get = (Button) findViewById(R.id.get);
post = (Button) findViewById(R.id.post);
show = (TextView) findViewById(R.id.show);
get.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
String response = sendGet(
"http://www.baidu.com/", null);
show.setText(response);
}
});
post.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
String response = sendPost(
"http://www.zzzy.org/login.jsp",
"name=hc&pass=hc");
show.setText(response);
}
});
第五步:程序运行效果: GET请求结果图
POST请求结果图