Android中Http接口调用
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Android中Http接口调用,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含8315字,纯文字阅读大概需要12分钟。
内容图文
![Android中Http接口调用](/upload/InfoBanner/zyjiaocheng/1013/9b1ba80020ba4e93b7085369bee06fe0.jpg)
今天我们要说的Http接口访问是使用HttpURLConnection对象实现的。有人会问了,为什么要说这个?咱们都用okhttp了,或者用Retrofit,再不济用的也是别人写好的二次封装的,咋就整这么原始的东西出来了,难道博主用的是这个。这......我也不用这个。但是本着总得会的原则,我在这里总结一下。
1.获取HttpURLConnection对象
URL url = new URL("");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
2.HttpURLConnection相关API
- setRequestMethod:设置请求类型。GET表示get请求,POST表示post请求。
- setConnectTimeout:设置连接的超时时间。
- setReadTimeout:设置读取的超时时间。
- setRequestProperty:设置请求包头的属性信息。
- setDoOutput:设置是否允许发送数据。如果用到getOutputStream方法,setDoOuput就必须设置为true。因为POST方式肯定会发送数据,所以POST调用时必须设置该方法。
- getOutputStream:获取HTTP输出流。调用该函数返回一个OutputStream对象,接着依次调用该对象的write和flush方法写入要发送的数据。
- connect:建立HTTP连接。
- setDoInput:设置是否允许接收数据。如果用到getInputStream方法,setDoInput就必须设置为true(其实也不必手动设置,因为默认就是true)。
- getInputStream:获取HTTP输入流。调用该函数返回一个InputStream对象,接着调用该对象的read方法读出接收的数据。
- getResponseCode:获取HTTP返回码。
- getHeaderField:获取应答数据包头的指定属性值。
- getHeaderFields:获取应答数据包头的所有属性列表。
- disconnect:断开HTTP连接。
3.HttpURLConnection请求示例--简单的get、post请求
public class HttpRequestUtil {
private static final String TAG = "HttpRequestUtil";
// 设置http连接的头部信息
private static void setConnHeader(HttpURLConnection conn, String method, HttpReqData req_data)
throws ProtocolException {
// 设置请求方式,常见的有GET和POST两种
conn.setRequestMethod(method);
// 设置连接超时时间
conn.setConnectTimeout(5000);
// 设置读写超时时间
conn.setReadTimeout(10000);
// 设置数据格式
conn.setRequestProperty("Accept", "*/*");
// IE使用
// conn.setRequestProperty("Accept-Language", "zh-CN");
// conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.2; .NET4.0C)");
// firefox使用
// 设置文本语言
conn.setRequestProperty("Accept-Language", "zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3");
// 设置用户代理
conn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:33.0) Gecko/20100101 Firefox/33.0");
// 设置编码格式
conn.setRequestProperty("Accept-Encoding", "gzip, deflate");
if (!req_data.content_type.equals("")) {
// 设置内容类型
conn.setRequestProperty("Content-Type", req_data.content_type);
}
if (!req_data.x_requested_with.equals("")) {
// 判断request来自Ajax请求还是传统请求
conn.setRequestProperty("X-Requested-With", req_data.x_requested_with);
}
if (!req_data.referer.equals("")) {
// 设置跳转来源
conn.setRequestProperty("Referer", req_data.referer);
}
if (!req_data.cookie.equals("")) {
// 设置秘密纸条
conn.setRequestProperty("Cookie", req_data.cookie);
Log.d(TAG, "setConnHeader cookie=" + req_data.cookie);
}
}
private static String getRespCookie(HttpURLConnection conn, HttpReqData req_data) {
String cookie = "";
Map<String, List<String>> headerFields = conn.getHeaderFields();
if (headerFields != null) {
List<String> cookies = headerFields.get("Set-Cookie");
if (cookies != null) {
for (String cookie_item : cookies) {
cookie = cookie + cookie_item + "; ";
}
} else {
cookie = req_data.cookie;
}
} else {
cookie = req_data.cookie;
}
Log.d(TAG, "cookie=" + cookie);
return cookie;
}
// get文本数据
public static HttpRespData getData(HttpReqData req_data) {
HttpRespData resp_data = new HttpRespData();
try {
URL url = new URL(req_data.url);
// 创建指定网络地址的HTTP连接
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
setConnHeader(conn, "GET", req_data);
conn.connect(); // 开始连接
// 对输入流中的数据进行解压,得到原始的应答字符串
resp_data.content = StreamTool.getUnzipStream(conn.getInputStream(),
conn.getHeaderField("Content-Encoding"), req_data.charset);
resp_data.cookie = conn.getHeaderField("Set-Cookie");
conn.disconnect(); // 断开连接
} catch (Exception e) {
e.printStackTrace();
resp_data.err_msg = e.getMessage();
}
return resp_data;
}
// get图片数据
public static HttpRespData getImage(HttpReqData req_data) {
HttpRespData resp_data = new HttpRespData();
try {
URL url = new URL(req_data.url);
// 创建指定网络地址的HTTP连接
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
setConnHeader(conn, "GET", req_data);
conn.connect(); // 开始连接
// 从HTTP连接获取输入流
InputStream is = conn.getInputStream();
// 对输入流中的数据进行解码,得到位图对象
resp_data.bitmap = BitmapFactory.decodeStream(is);
resp_data.cookie = conn.getHeaderField("Set-Cookie");
conn.disconnect(); // 断开连接
} catch (Exception e) {
e.printStackTrace();
resp_data.err_msg = e.getMessage();
}
return resp_data;
}
// post的内容放在url中
public static HttpRespData postUrl(HttpReqData req_data) {
HttpRespData resp_data = new HttpRespData();
String s_url = req_data.url;
if (req_data.params != null && !req_data.params.toString().isEmpty()) {
s_url += "?" + req_data.params.toString();
}
Log.d(TAG, "s_url=" + s_url);
try {
URL url = new URL(s_url);
// 创建指定网络地址的HTTP连接
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
setConnHeader(conn, "POST", req_data);
conn.setDoOutput(true);
conn.connect(); // 开始连接
resp_data.content = StreamTool.getUnzipStream(conn.getInputStream(),
conn.getHeaderField("Content-Encoding"), req_data.charset);
resp_data.cookie = conn.getHeaderField("Set-Cookie");
conn.disconnect(); // 断开连接
} catch (Exception e) {
e.printStackTrace();
resp_data.err_msg = e.getMessage();
}
return resp_data;
}
// post的内容放在输出流中
public static HttpRespData postData(HttpReqData req_data) {
req_data.content_type = "application/x-www-form-urlencoded";
HttpRespData resp_data = new HttpRespData();
String s_url = req_data.url;
Log.d(TAG, "s_url=" + s_url + ", params=" + req_data.params.toString());
try {
URL url = new URL(s_url);
// 创建指定网络地址的HTTP连接
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
setConnHeader(conn, "POST", req_data);
conn.setDoOutput(true);
conn.setDoInput(true);
conn.connect(); // 开始连接
PrintWriter out = new PrintWriter(conn.getOutputStream());
out.print(req_data.params.toString());
out.flush();
// 对输入流中的数据进行解压,得到原始的应答字符串
resp_data.content = StreamTool.getUnzipStream(conn.getInputStream(),
conn.getHeaderField("Content-Encoding"), req_data.charset);
resp_data.cookie = getRespCookie(conn, req_data);
conn.disconnect(); // 断开连接
} catch (Exception e) {
e.printStackTrace();
resp_data.err_msg = e.getMessage();
}
return resp_data;
}
// post的内容分段传输
public static HttpRespData postMultiData(HttpReqData req_data, Map<String, String> map) {
HttpRespData resp_data = new HttpRespData();
String s_url = req_data.url;
Log.d(TAG, "s_url=" + s_url);
String end = "\r\n";
String hyphens = "--";
try {
URL url = new URL(s_url);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
setConnHeader(conn, "POST", req_data);
conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + req_data.boundary);
conn.setRequestProperty("Cache-Control", "no-cache");
conn.setDoOutput(true);
conn.setDoInput(true);
StringBuilder buffer = new StringBuilder();
Log.d(TAG, "map.size()=" + map.size());
for (String str : map.keySet()) {
buffer.append(hyphens + req_data.boundary + end);
buffer.append("Content-Disposition: form-data; name=\"");
buffer.append(str);
buffer.append("\"" + end + end);
buffer.append(map.get(str));
buffer.append(end);
Log.d(TAG, "key=" + str + ", value=" + map.get(str));
}
if (map.size() > 0) {
buffer.append(hyphens + req_data.boundary + end);
byte[] param_data = buffer.toString().getBytes(req_data.charset);
OutputStream out = conn.getOutputStream();
out.write(param_data);
out.flush();
}
conn.connect(); // 开始连接
// 对输入流中的数据进行解压,得到原始的应答字符串
resp_data.content = StreamTool.getUnzipStream(conn.getInputStream(),
conn.getHeaderField("Content-Encoding"), req_data.charset);
resp_data.cookie = conn.getHeaderField("Set-Cookie");
conn.disconnect(); // 断开连接
} catch (Exception e) {
e.printStackTrace();
resp_data.err_msg = e.getMessage();
}
return resp_data;
}
}
4.注意事项
除此之外,Android9开始默认只能访问以https开头的安全地址,不能直接访问http打头的网络地址。如果应用仍想访问以http开头的普通地址,就得修改AndroidManifest.xml,给application节点添加如下属性,表示继续使用HTTP明文地址:
android:usesCleartextTraffic="true"
内容总结
以上是互联网集市为您收集整理的Android中Http接口调用全部内容,希望文章能够帮你解决Android中Http接口调用所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。