Android使用URLConnection提交请求的实现
url的openconnection()方法将返回一个urlconnection对象,该对象表示应用程序和url之间的通信连接。程序可以通过urlconnection实例向该url发送请求,读取url引用的资源。
通常创建一个和url的连接,并发送请求、读取此url引用的资源需要如下几个步骤:
step1: 通过调用url对象的openconnection()方法来创建urlconnection对象;
step2:设置urlconnection的参数和普通请求属性;
step3:如果只是发送get方式的请求,那么使用connect方法建立和远程资源之间的实际连接即可;如果需要发送post方式的请求,则需要获取urlconnection实例对应的输出流来发送请求参数;
step4:远程资源变为可用,程序可以访问远程资源的头字段,或通过流入流读取远程资源的数据。
下面的程序demo示范了如何向web站点发送get请求、post请求,并从web站点取得响应。该程序中用到一个get、post请求的工具类,该类代码如下:
getpostutil.java逻辑代码如下:
package com.fukaimei.getposttest; import android.util.log; import java.io.bufferedreader; import java.io.ioexception; import java.io.inputstreamreader; import java.io.printwriter; import java.net.url; import java.net.urlconnection; import java.util.list; import java.util.map; /** * created by fukaimei on 2017/10/2. */ public class getpostutil { private static final string tag = "getpostutil"; /** * 向指定url发送get方式的请求 * * @param url 发送请求的url * @param params 请求参数,请求参数应该是name1=value1 & name2=value2的形式 * @return url所代表远程资源的响应 */ public static string sendget(string url, string params) { string result = ""; bufferedreader in = null; try { string urlname = url + "?" + params; url realurl = new url(urlname); // 打开和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)"); // 建立实际的连接 conn.connect(); // 获取所有的响应头字段 map<string, list<string>> map = conn.getheaderfields(); // 遍历所有的响应头字段 for (string key : map.keyset()) { log.d(tag, 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) { log.d(tag, "发送get请求出现异常!" + e); e.printstacktrace(); } finally { // 使用finally块来关闭输入流 try { if (in != null) { in.close(); } } catch (ioexception e) { e.printstacktrace(); } } return result; } /** * 向指定url发送post方式的请求 * * @param url 发送请求的url * @param params 请求参数,请求参数应该是name1=value1 & name2=value2的形式 * @return 所代表远程资源的响应 */ public static string sendpost(string url, string params) { 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); // flush输出流的缓存 out.flush(); // 定义bufferedreader输入流来读取url的响应 in = new bufferedreader(new inputstreamreader(conn.getinputstream())); string line; while ((line = in.readline()) != null) { result += "\n" + line; } } catch (exception e) { log.d(tag, "发送post请求出现异常!" + e); e.printstacktrace(); } finally { // 使用finally块来关闭输出流、输入流 try { if (out != null) { out.close(); } if (in != null) { in.close(); } } catch (ioexception e) { e.printstacktrace(); } } return result; } }
从上面的程序demo可以看出,如果需要发送get请求,只要调用urlconnection的connect()方法去建立实际的连接即可。如果需要发送post请求,则需要获取urlconnection的outputstream,然后再向网络中输出请求参数。
提供了上面发送get请求、post请求的工具类之后,接下来就可以在activity类中通过该工具类发送请求了。该程序的界面中包含两个按钮,一个按钮用于发送get请求,一个按钮用于发送post请求。程序还提供了一个edittext来显示服务器的响应。
layout/activity_main.xml界面布局代码如下:
<?xml version="1.0" encoding="utf-8"?> <linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <linearlayout android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:orientation="horizontal"> <button android:id="@+id/get" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="发送get请求" /> <button android:id="@+id/post" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="发送post请求" /> </linearlayout> <textview android:id="@+id/show" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#ffff" android:gravity="top" android:textcolor="#f000" android:textsize="16sp" /> </linearlayout>
mainactivity.java逻辑代码如下:
package com.fukaimei.getposttest; 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.button; import android.widget.textview; public class mainactivity extends appcompatactivity { button get, post; textview show; // 代表服务器响应的字符串 string response; handler handler = new handler() { @override public void handlemessage(message msg) { if (msg.what == 0x123) { // 设置show控件服务器响应 show.settext(response); } } }; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); get = (button) findviewbyid(r.id.get); post = (button) findviewbyid(r.id.post); show = (textview) findviewbyid(r.id.show); get.setonclicklistener(new view.onclicklistener() { @override public void onclick(view v) { new thread() { @override public void run() { response = getpostutil.sendget("https://www.mi.com/", null); // 发送消息通知ui线程更新ui组件 handler.sendemptymessage(0x123); } }.start(); } }); post.setonclicklistener(new view.onclicklistener() { @override public void onclick(view v) { new thread() { @override public void run() { response = getpostutil.sendpost("http://172.xx.xx.xxx:8080/fukaimei/login.jsp", "name=android&pass=123"); } }.start(); // 发送消息通知ui线程更新ui组件 handler.sendemptymessage(0x123); } }); } }
上面程序demo中用于发送get请求、post请求。从上面的代码可以发现,借助于urlconnection类的帮助,应用程序可以非常方便地与指定站点交换信息,包括发送get请求、post请求,并获取网站的响应等。
注意:由于该程序需要访问互联网,因此还需要在清单文件androidmanifest.xml文件中授权访问互联网的权限:
<!-- 授权访问互联网--> <uses-permission android:name="android.permission.internet" />
demo程序运行效果界面截图如下:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
推荐阅读
-
Android使用URLConnection提交请求的实现
-
Android中使用 AutoCompleteTextView 实现手机号格式化附带清空历史的操作
-
Android 使用CoordinatorLayout实现滚动标题栏效果的实例
-
Android编程实现全局获取Context及使用Intent传递对象的方法详解
-
Android编程实现获取系统内存、CPU使用率及状态栏高度的方法示例
-
Android编程使用自定义shape实现shadow阴影效果的方法
-
android使用Messenger绑定Service的多种实现方法
-
Android中使用Handler及Countdowntimer实现包含倒计时的闪屏页面
-
Android开发使用自定义view实现ListView下拉的视差特效功能
-
使用android隐藏api实现亮度调节的方法