【转】Android HTTP协议
前言
说到HTTP协议,那必须要说说WWW了,WWW是环球信息网(World Wide Web )的缩写,也可以简称为Web,中文名字为“万维网”。简单来说,WWW是以Internet作为传输媒介的一个应用系统,WWW网上基本的传输单位是Web网页。WWW的工作是基于B/S模型,由Web浏览器和Web服务器构成,两者之间采用超文本传输协议HTTP协议进行通信。
HTTP协议是基于TCP/IP协议之上的协议,是Web浏览器和Web服务器之间的应用层的协议,是通用的、无状态的面向对象的协议。关于HTTP协议的详细讲解,请参见博客:http://blog.csdn.net/gueter/article/details/1524447,里面讲解的很清楚,这里主要是说明HTTP在Java中的应用,为从其他技术下转向Android开发打好基础。
首先普及一下网络协议的知识,数据在Internet上传输,一般通过三种协议来实现发送信息和实现:
- HTTP协议,也是在工作中最常用的,是建立在TCP/IP基础上实现的。
- FTP协议。
- TCP/IP协议,它也是最低层的协议,其它的方式必须要通过它,但是想要实现这种协议必须要实现socket编程,这种方法是用来上传一些比较大的文件,视频,进行断电续传的操作。
HTTP协议
下面详细讲解一下HTTP协议,因为HTTP是无状态的协议,所以服务端并不记录客户端之前发送信息,一码归一码,所以HTTP协议使用报文头的形式记录状态,一般分为请求报文和响应报文。一般用户使用浏览器访问网页,是无需关心HTTP请求的报文头的,因为开发人员已经浏览器已经帮忙处理了,但是当进行开发工作的时候,这些是必须要了解的。
对于报文,一般关心请求方式,是GET或者是POST;请求数据类型,是文本还是音频;数据的编码格式,一般用utf-8;发送的数据长度;响应返回码,一般200为成功,其他响应码都是有问题。具体了解还是看看上面推荐的博客。
HTTP/1.1协议中一共定义了八种方法(有时也叫“动作”)来表明Request-URI指定的资源的不同操作方式,但是一般常用的就是GET和POST方式。
这里简单说一下GET方式和POST方式的差别:
- GET是从服务器上获取数据,POST是向服务器传送数据。
- 在客户端,GET方式在通过URL提交数据,数据在URL中可以看到;POST方式,数据放在HTML HEADER内提交。
- 对于GET方式,服务器端用Request.QueryString获取变量的值,对于POST方式,服务器用Request.Form获取提交的数据。
- GET方式提交的数据不能大于2KB(主要是URL长度限制),而POST则没有此限制。
- 安全性问题。正如2中提到,使用GET的时候,参数会显示在地址栏上,而POST不会。所以,如果这些数据是中文数据而且是非敏感数据,那么使用GET;如果用户输入的数据不是中文字符而且包含敏感数据,那么还是使用POST为好。
Java中使用HTTP
下面通过两个例子来分别讲解一下GET和POST在Java中的使用,如果在Java中需要使用HTTP协议进行访问,一般通过HttpURLConnection类来实现。
HttpURLConnection继承了URLConnection,所以在URLConnection的基础上进一步改进,增加了一些用于操作HTTP资源的便捷方法。Java中HttpURLConnection对象通过URL.openConnection()方法来获得,需要进行强制转换。先来介绍几个HttpURLConnection的常用方法:
- void setConnectTimeout(int timeout):设置连接超时市场,如果超过timeout市场,则放弃连接,单位以毫秒计算。
- void setDoInput(boolean newValue) :标志是否允许输入。
- void setDoOutput(boolean newValue):标志是否允许输出。String getRequestMethod():获取发送请求的方法。
- int getResponseCode():获取服务器的响应码。
- void setRequestMethod(String method):设置发送请求的方法。
- void setRequestProperty(String field,String newValue):设置请求报文头,并且只对当前HttpURLConnection有效。
GET方式
这个例子通过GET方式从服务端获取一张图片的信息,并把其保存在本地磁盘中。服务器为本机上的IIS,一张静态图片,直接通过URL访问。
直接上Java代码,注释已经解释的很清楚了。
package com.http.get; import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL; public class HttpUtils {
private static String URL_PATH = "http://192.168.1.106:8080/green.jpg";
/**
* @param args
*/
public static void main(String[] args) {
// 调用方法获取图片并保存
saveImageToDisk();
}
/**
* 通过URL_PATH的地址访问图片并保存到本地
*/
public static void saveImageToDisk()
{
InputStream inputStream= getInputStream();
byte[] data=new byte[1024];
int len=0;
FileOutputStream fileOutputStream=null;
try {
//把图片文件保存在本地F盘下
fileOutputStream=new FileOutputStream("F:\\test.png");
while((len=inputStream.read(data))!=-1)
{
//向本地文件中写入图片流
fileOutputStream.write(data,0,len);
}
} catch (IOException e) {
e.printStackTrace();
}
finally
{
//最后关闭流
if(inputStream!=null)
{
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(fileOutputStream!=null)
{
try {
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* 通过URL获取图片
* @return URL地址图片的输入流。
*/
public static InputStream getInputStream() {
InputStream inputStream = null;
HttpURLConnection httpURLConnection = null; try {
//根据URL地址实例化一个URL对象,用于创建HttpURLConnection对象。
URL url = new URL(URL_PATH); if (url != null) {
//openConnection获得当前URL的连接
httpURLConnection = (HttpURLConnection) url.openConnection();
//设置3秒的响应超时
httpURLConnection.setConnectTimeout(3000);
//设置允许输入
httpURLConnection.setDoInput(true);
//设置为GET方式请求数据
httpURLConnection.setRequestMethod("GET");
//获取连接响应码,200为成功,如果为其他,均表示有问题
int responseCode=httpURLConnection.getResponseCode();
if(responseCode==200)
{
//getInputStream获取服务端返回的数据流。
inputStream=httpURLConnection.getInputStream();
}
} } catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return inputStream;
} }
POST方式
这个例子通过POST方式访问一个登陆页面,需要输入用户名(username)和密码(password)。虽然这里使用的Java在讲解问题,但是服务端是使用.Net的框架,一个很简单的HTML页面加一个表单传送的一般处理程序,输入为admin+123为登陆成功,这里不累述了。
Java代码:
package com.http.post; 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.URL;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map; public class postUtils { private static String PATH = "http://192.168.222.1:1231/loginas.ashx";
private static URL url; public postUtils() {
}
static {
try {
url = new URL(PATH);
} catch (Exception e) {
e.printStackTrace();
}
} /**
* 通过给定的请求参数和编码格式,获取服务器返回的数据
* @param params 请求参数
* @param encode 编码格式
* @return 获得的字符串
*/
public static String sendPostMessage(Map<String, String> params,
String encode) {
StringBuffer buffer = new StringBuffer();
if (params != null && !params.isEmpty()) {
for (Map.Entry<String, String> entry : params.entrySet()) {
try {
buffer.append(entry.getKey())
.append("=")
.append(URLEncoder.encode(entry.getValue(), encode))
.append("&");//请求的参数之间使用&分割。
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} }
buffer.deleteCharAt(buffer.length() - 1);
System.out.println(buffer.toString());
try {
HttpURLConnection urlConnection = (HttpURLConnection) url
.openConnection();
urlConnection.setConnectTimeout(3000);
//设置允许输入输出
urlConnection.setDoInput(true);
urlConnection.setDoOutput(true);
byte[] mydata = buffer.toString().getBytes();
//设置请求报文头,设定请求数据类型
urlConnection.setRequestProperty("Content-Type",
"application/x-www-form-urlencoded");
//设置请求数据长度
urlConnection.setRequestProperty("Content-Length",
String.valueOf(mydata.length));
//设置POST方式请求数据
urlConnection.setRequestMethod("POST");
OutputStream outputStream = urlConnection.getOutputStream();
outputStream.write(mydata);
int responseCode = urlConnection.getResponseCode();
if (responseCode == 200) {
return changeInputStream(urlConnection.getInputStream(),
encode);
}
} catch (IOException e) {
e.printStackTrace();
}
}
return "";
} /**
* 把服务端返回的输入流转换成字符串格式
* @param inputStream 服务器返回的输入流
* @param encode 编码格式
* @return 解析后的字符串
*/
private static String changeInputStream(InputStream inputStream,
String encode) {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
byte[] data = new byte[1024];
int len = 0;
String result="";
if (inputStream != null) {
try {
while ((len = inputStream.read(data)) != -1) {
outputStream.write(data,0,len);
}
result=new String(outputStream.toByteArray(),encode); } catch (IOException e) {
e.printStackTrace();
}
}
return result;
} /**
* @param args
*/
public static void main(String[] args) {
//通过Map设置请求字符串。
Map<String, String> params = new HashMap<String, String>();
params.put("username", "admin");
params.put("password", "123");
String result=sendPostMessage(params, "utf-8");
System.out.println(result);
} }
代码下载:http://download.csdn.net/detail/plokmju88/5621307
本文转自:http://www.cnblogs.com/plokmju/p/java-HTTP.html
【转】Android HTTP协议的更多相关文章
- Android Scheme协议与应用全解析
URL Scheme 的作用 客户端应用可以向操作系统注册一个 URL Scheme,该 Scheme 用于从浏览器或其他应用中启动本应用. 通过指定的 URL 字段,可以让应用在被调起后直接打开某些 ...
- Android 面向协议编程 体会优雅编程之旅
Android中面向协议编程的深入浅出 http://blog.csdn.net/sk719887916/article/details skay编写 说起协议,现实生活中大家第一感觉会想到规则或者约 ...
- android http协议post请求方式
方式一:HttpPost(import org.apache.http.client.methods.HttpPost 代码如下: private Button button1,button2,but ...
- Android TCP协议的Socket通信
1.介绍 2.使用方法 3.java后台代码 服务器server package com.lucky.servertest; import java.io.BufferedReader; import ...
- android蓝牙协议名词解释 OPP HFP HDP A2DP PAN
各种蓝牙协议的全称: OPP:对象存储规范(Object Push Profile),最为常见的,文件的传输都是使用此协议. HFP:(Hands-free Profile),让蓝牙设备能够控制电话, ...
- android tcp协议主要函数
1 tcp_timers: 处理各种timer超时信息,关键函数tcp_xmit_timer 2 tcp_iutput: 3 tcp_output:接收方的接收窗口struct tcpcb.snd_w ...
- Android http协议实现文件下载
用http协议下载文件,主要用到的是httpURLConnection对象,主要的步骤如下: 1. 创建HttpURLConnection对象 2.获得一个InputStream对象 3.修改权限:访 ...
- 转: Android基于HLS和RTMP协议的第三方SDK选择
转自: http://isunxu.xyz/android/between-rtmp-and-hls-third-party-choice/ 协议的详解网上资料都太多了,我就不赘述了.Android上 ...
- 【NFC】Android NFC API Reference中英文
0 Near Field Communication Near Field Communication (NFC) is a set of short-range wireless technol ...
随机推荐
- •当对自己的技术足够自信的时候,拼的就是RP和面试技巧了(转)
前言 三月真是一个忙碌的季节,刚刚开学就需要准备各种面试和笔试(鄙视).幸运的是,在长达一个月的面试内推季之后,终于同时拿到了阿里和腾讯的offer,还是挺开心的.突而想起久未更新的博客,就冒昧学一学 ...
- Maven插件之buildnumber-maven-plugin
某些情况下(这种情况一般很少见),使用maven构建项目时,需要一个不重复的序列号,比如说,打包时,包名称以当前构建时间结尾,或者每次生成的jar包中包含唯一的序列号,等等; 这个时候,就用到了bui ...
- 原声JS瀑布流加延迟载入
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- poj Budget
Budget 建图好题.不知道为什么提交一直TLE. 然后.该了几次,看了别人的普通网络流都过了. 我觉得可能是卡DINIC的某些部分吧.这题就是一道普通的上下界最小流. 建图麻烦,所以说一下建图吧. ...
- 《深入浅出 Java Concurrency》—锁紧机构(一)Lock与ReentrantLock
转会:http://www.blogjava.net/xylz/archive/2010/07/05/325274.html 前面的章节主要谈谈原子操作,至于与原子操作一些相关的问题或者说陷阱就放到最 ...
- xml publisher根据条件显示或隐藏列
xml publisher根据条件显示或隐藏列 <?if@column:condition? > -- <?end if?> 样例: 依据PROJECT_FLAG标签显示 ...
- 黄聪:Microsoft Enterprise Library 5.0 系列教程(十) Configuration Application Block
原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(十) Configuration Application Block 到目前为止,我们使用的模块都是在同一个配置 ...
- Codeforces Round #198 (Div. 2) C. Tourist Problem (数学+dp)
C. Tourist Problem time limit per test 1 second memory limit per test 256 megabytes input standard i ...
- (step7.2.2)hdu 2161(Primes——判断是否是素数)
题目大意:输入一个n,判断您是否是素数.. 解题思路:简单数论 代码如下: /* * 2161_1.cpp * * Created on: 2013年8月31日 * Author: Administr ...
- C#遍历FTP文件夹/下载
原文链接:http://blog.csdn.net/ou8811/article/details/5295780 整个程序大致可以分为2个部分,第一部分是实现单个文件下载的方法 [c-sharp] v ...