Android Http协议笔记(使用HttpURLConnection)文件上传+参数
2015-07-12 13:41
941 查看
代码地址:http://download.csdn.net/detail/u013063185/8892951
1.Android网络请求数据是最常用,最近在研究Http网络请求,来记一下笔记
下面的博客是Http协议的解析,我就不重复了:
/article/1775657.html
2.下面是Http 请求的一个例子:
客户端:
GET http://www.hstc.edu.cn/turbosearch/search_new.htm HTTP/1.1
Host: www.hstc.edu.cn
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 UBrowser/5.1.2238.18 Safari/537.36
Referer: http://www.hstc.edu.cn/2013/
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.8
Cookie: _gscu_538514159=347153715akloz45; ASPSESSIONIDCQSDSSQS=LCEPCIJAFOEJOCKJPDPBNJME
服务器端
HTTP/1.1 200 OK
Content-Length: 397
Content-Type: text/html
Last-Modified: Wed, 09 Jan 2013 02:04:00 GMT
Accept-Ranges: bytes
ETag: "3655d97deecd1:83c0"
Server: YxlinkWAF
X-Powered-By: ASP.NET
Date: Sun, 12 Jul 2015 05:24:01 GMT
<html>
。。。
</html>
3.关于安卓HTTP请求用HttpUrlConnection还是HttpClient好/article/8432561.html
下面就进入主题,使用Android的HttpUrlConnection写网络请求,代码比较简单,直接上
Http协议的Content-Type有3种,经常使用的有multipart/form-data和application/x-www-form-urlencoded(默认),multipart/form-data方式可以上传文件,下面我增加了一个同时可以上传图片jpg和参数的方法:
代码地址:http://download.csdn.net/detail/u013063185/8892951
Fiddler.exe网络抓包工具,Android也可以使用,很强大
里面有web服务,加不多讲了,里面使用Handler进行异步封装,有兴趣可以学习交流一下。
1.Android网络请求数据是最常用,最近在研究Http网络请求,来记一下笔记
下面的博客是Http协议的解析,我就不重复了:
/article/1775657.html
2.下面是Http 请求的一个例子:
客户端:
GET http://www.hstc.edu.cn/turbosearch/search_new.htm HTTP/1.1
Host: www.hstc.edu.cn
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 UBrowser/5.1.2238.18 Safari/537.36
Referer: http://www.hstc.edu.cn/2013/
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.8
Cookie: _gscu_538514159=347153715akloz45; ASPSESSIONIDCQSDSSQS=LCEPCIJAFOEJOCKJPDPBNJME
服务器端
HTTP/1.1 200 OK
Content-Length: 397
Content-Type: text/html
Last-Modified: Wed, 09 Jan 2013 02:04:00 GMT
Accept-Ranges: bytes
ETag: "3655d97deecd1:83c0"
Server: YxlinkWAF
X-Powered-By: ASP.NET
Date: Sun, 12 Jul 2015 05:24:01 GMT
<html>
。。。
</html>
3.关于安卓HTTP请求用HttpUrlConnection还是HttpClient好/article/8432561.html
下面就进入主题,使用Android的HttpUrlConnection写网络请求,代码比较简单,直接上
package com.ptwyj.http; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.UnsupportedEncodingException; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.ProtocolException; import java.net.URL; import java.net.URLEncoder; import java.util.Map; import android.content.Context; import android.util.Log; import android.widget.Toast; public class HttpUtil { public final static String TAG = "HTTP"; private final static int CONNECT_TIME = 10000; private final static int READ_TIME = 10000; /** * 发送post请求 * * @param path * @param map * @param string * @return * @throws IOException */ public String doPost(String urlstr, Map<String, String> map, String encoding) throws IOException { StringBuilder data = new StringBuilder(); // 数据拼接 key=value&key=value if (map != null && !map.isEmpty()) { for (Map.Entry<String, String> entry : map.entrySet()) { data.append(entry.getKey()).append("="); data.append(URLEncoder.encode(entry.getValue(), encoding)); data.append("&"); } data.deleteCharAt(data.length() - 1); } Log.i(TAG, data.toString()); byte[] entity = data.toString().getBytes();// 生成实体数据 URL url = new URL(urlstr); HttpURLConnection connection = getHttpURLConnection(urlstr, "POST"); connection.setDoOutput(true);// 允许对外输出数据 connection.setRequestProperty("Content-Length", String.valueOf(entity.length)); OutputStream outStream = connection.getOutputStream(); outStream.write(entity); if (connection.getResponseCode() == 200) {// 成功返回处理数据 InputStream inStream = connection.getInputStream(); byte[] number = read(inStream); String json = new String(number); return json; } return null; } public String doPost(String urlstr) throws IOException { return doPost(urlstr, null, "UTF-8"); } public String doPost(String urlstr, Map<String, String> map) throws IOException { return doPost(urlstr, map, "UTF-8"); } /** * 发送GET请求 * * @param id * @return * @throws IOException * @throws Exception */ public String doGet(String urlstr) throws Exception { HttpURLConnection connection = getHttpURLConnection(urlstr, "GET"); if (connection.getResponseCode() == 200) { InputStream inStream = connection.getInputStream(); byte[] number = read(inStream); String json = new String(number); return json; } return null; } private HttpURLConnection getHttpURLConnection(String urlstr, String method) throws IOException { URL url = new URL(urlstr); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setConnectTimeout(CONNECT_TIME); connection.setReadTimeout(READ_TIME); connection.setRequestMethod(method); // 头字段 connection.setRequestProperty("Accept", "*/*"); connection.setRequestProperty("Accept-Charset", "UTF-8,*;q=0.5"); connection.setRequestProperty("Accept-Encoding", "gzip,deflate"); connection.setRequestProperty("Accept-Language", "zh-CN"); connection.setRequestProperty("User-Agent", "Android WYJ"); connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");// 头字段 return connection; } /** * 读取输入流数据 InputStream * * @param inStream * @return * @throws IOException */ public static byte[] read(InputStream inStream) throws IOException { ByteArrayOutputStream outStream = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int len = 0; while ((len = inStream.read(buffer)) != -1) { outStream.write(buffer, 0, len); } inStream.close(); return outStream.toByteArray(); } }
Http协议的Content-Type有3种,经常使用的有multipart/form-data和application/x-www-form-urlencoded(默认),multipart/form-data方式可以上传文件,下面我增加了一个同时可以上传图片jpg和参数的方法:
/** * 发送文件post请求 * * @param path * @param map * @param string * @return * @throws IOException */ public String doFilePost(String urlstr, Map<String, String> map, Map<String, File> files) throws IOException { String BOUNDARY = "----WebKitFormBoundaryDwvXSRMl0TBsL6kW"; // 定义数据分隔线 URL url = new URL(urlstr); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); // 发送POST请求必须设置如下两行 connection.setDoOutput(true); connection.setDoInput(true); connection.setUseCaches(false); connection.setRequestMethod("POST"); connection.setRequestProperty("Accept", "*/*"); connection.setRequestProperty("connection", "Keep-Alive"); connection.setRequestProperty("user-agent", "Android WYJ"); connection.setRequestProperty("Charsert", "UTF-8"); connection.setRequestProperty("Accept-Encoding", "gzip,deflate"); connection.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + BOUNDARY); OutputStream out = new DataOutputStream(connection.getOutputStream()); byte[] end_data = ("--" + BOUNDARY + "--\r\n").getBytes();// 定义最后数据分隔线 // 文件 if (files != null && !files.isEmpty()) { for (Map.Entry<String, File> entry : files.entrySet()) { File file = entry.getValue(); String fileName = entry.getKey(); StringBuilder sb = new StringBuilder(); sb.append("--"); sb.append(BOUNDARY); sb.append("\r\n"); sb.append("Content-Disposition: form-data;name=\"" + fileName + "\";filename=\"" + file.getName() + "\"\r\n"); sb.append("Content-Type: image/jpg\r\n\r\n"); byte[] data = sb.toString().getBytes(); out.write(data); DataInputStream in = new DataInputStream(new FileInputStream( file)); int bytes = 0; byte[] bufferOut = new byte[1024]; while ((bytes = in.read(bufferOut)) != -1) { out.write(bufferOut, 0, bytes); } out.write("\r\n".getBytes()); // 多个文件时,二个文件之间加入这个 in.close(); } } // 数据参数 if (map != null && !map.isEmpty()) { for (Map.Entry<String, String> entry : map.entrySet()) { StringBuilder sb = new StringBuilder(); sb.append("--"); sb.append(BOUNDARY); sb.append("\r\n"); sb.append("Content-Disposition: form-data; name=\"" + entry.getKey() + "\""); sb.append("\r\n"); sb.append("\r\n"); sb.append(entry.getValue()); sb.append("\r\n"); byte[] data = sb.toString().getBytes(); out.write(data); } } out.write(end_data); out.flush(); out.close(); // 定义BufferedReader输入流来读取URL的响应 // BufferedReader reader = new BufferedReader(new InputStreamReader( // connection.getInputStream())); // String line = null; // while ((line = reader.readLine()) != null) { // System.out.println(line); // } if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) { InputStream inStream = connection.getInputStream(); byte[] number = read(inStream); String json = new String(number); return json; } return null; }
代码地址:http://download.csdn.net/detail/u013063185/8892951
Fiddler.exe网络抓包工具,Android也可以使用,很强大
里面有web服务,加不多讲了,里面使用Handler进行异步封装,有兴趣可以学习交流一下。
相关文章推荐
- 网络流之最大流之破解迷惑
- 题注Oracle数据库的网络连接原理
- 常见网络编程面试题整理
- 关于“如何检测节点网络中是否存在闭环之java实现”的程序bug修复
- HTTP协议详解(真的很经典)
- TCP和http的keepalive
- 卷积神经网络(CNN)的训练及代码实现
- 网络设备之间连接的疑问???
- 学习笔记-HTTP通讯协议
- unix网络编程各种TCP客户-服务器程序设计实例附环境搭建和编译方法(一)
- linux网络基础-远程管理
- unix网络编程之基本套接口编程
- 网络-WinSocket-I/O模型
- Tomcat配置HTTPS方式(单向)
- 安装Oracle数据库时出现网络配置需求检查失败
- Java中网络编程基础11
- HDU 3046Pleasant sheep and big big wolf(切最小网络流)
- 一个简单的Tcp客户端
- HTTP 笔记与总结(4 )socket 编程:批量发帖
- htons和htonl引发的惨案