Android中通过HttpRequest与服务器端进行JSON格式数据交互
JSON(JavaScript Object Notation)定义
一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性。
JSON的结构
(1) Name/Value Pairs(无序的):类似所熟知的Keyed list,Hash table,Distionary和Associative array。在Android平台中同时存在另外一个类"Bundle",某种程度上具有相似的行为。
(2)Array(有序的):一组有序的数据列表
对象
对象是一个无序的Name/Value Pairs集合。{name:value, name:value, ...}
Array
Array是值(value)的有序集合。[value, value, value ...]
值(value)可以是双引号括起来的字符串(string)、数值(number)、true、false、null、对象(object)或者数组(array)。这些结构可以嵌套。
字符串(string)是由双引号包围的任意数量Unicode字符的集合,使用反斜线转义。一个字符(character)即一个单独的字符串(character string)。 例如:/ + " / / b f n r t u 进行转义。
例子1:
Array里面包含对象(object)[ {"id":1,"name":"小猪" ,"age”:22} , {"id":2,"name":"小猫","age”:23} , .......]
例子2:
同样对象(object)中可以包含Array
(1)一个对象包含1个数组,2个子对象{"root":[{"id":"001","name":"小猪"},{"id":"002","name":"小猫"},{"id":"003","name":"小狗"}], "total":3, "success":true}
(2)也可以对象嵌套子对象,子对象再嵌套数组{"calendar": {"calendarlist": [ {"id":"001","name":"小猪"}, {"id":"002","name":"小猫"} ] } }
总之,格式多种多样,可以互相嵌套
在Android中包含四个与JSON相关的类和一个Exceptions:
JSONArray
JSONObject
JSONStringer
JSONTokener
JSONException
(1) JSONObject
这是系统中有关JSON定义的基本单元,其包含一对(Key/Value)数值。
它对外部(External:应用toString()方法输出的数值)调用的响应体现为一个标准的字符串
(2)JSONArray:
(3)JSONStringer
(4)JSONTokener
一个详细的例子
public class JSON{
public static List getJSONArray(String path)throws Exception{
}
public static List getJSONObject(String path) throws Exception{
}
public static List getJSON(String path) throws Exception{
}
用HttpClient以Post方式提交数据并添加http头信息
private void HttpPostData() {
try
{
HttpClient httpclient = new DefaultHttpClient();
String uri = "http://www.yourweb.com";
HttpPost httppost = new HttpPost(uri);
//添加http头信息
httppost.addHeader("Authorization", "your token"); //认证token
httppost.addHeader("Content-Type", "application/json");
httppost.addHeader("User-Agent", "imgfornote");
//http post的json数据格式: {"name": "your name","parentId": "id_of_parent"}
JSONObject obj = new JSONObject();
obj.put("name", "your name");
obj.put("parentId", "your parentid");
httppost.setEntity(new StringEntity(obj.toString()));
HttpResponse response;
response = httpclient.execute(httppost);
//检验
Android-Async-Http:
快速Android开发系列网络篇之Android-Async-Http
android中进行网络连接一般是使用socket或者http,http是最多的情况。
android是采用java语言开发的,android中包含java的URLConnection和Apache的httpclient,因此我们可以使用这两个工具进行网络连接和操作。
同时,为了控制是否允许程序联网,开发时,需要在Manifest文件中配置申请网络连接的权限。
<uses-permission android:name = "android.permission.INTERNET"></uses-permission>
使用URLConnection连接网络
URLConnection为java.net包中提供的网络访问,支持http,https,ftp等,进行http连接时,使用HttpURLConnection即可,示例代码如下:
URL url = new URL("http://www.baidu.com");
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
try{
InputStream in = new BufferedInputStream(urlConnection.getInputStream());
readStream(in); //该方法为自定义方法,从流中读取数据保存到本地,实现从网络获取数据。
finally{
urlConnection.disconnect();
}
HttpURLConnection
HttpURLConnection、URL(import java.net.HttpURLConnection;import java.net.URL;import java.net.URLEncoder;)
URL url = new URL(<String>)
HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
//设置连接属性
httpConn.setDoOutput(true);//使用URL连接进行输出
httpConn.setDoInput(true);//使用URL连接进行输入
httpConn.setUseCaches(false);//忽略缓存
httpConn.setRequestMethod("POST");//设置URL请求方法
String requestString = “客户端要以流方式发送到服务端的数据”;
//设置请求属性
//获得数据字节数据,请求数据流的编码,必须和下面服务器端处理请求流的编码一致。
byte[] requestStringBytes = requestString.getBytes(ENCODING_UTF_8);
httpConn.setRequestProperty("Content-length",“”+requestStringBytes.length);
- HttpURLConnection连接URL
创建URL对象
URL url = new URL(http://baidu.com);
利用HttpURLConnection对象从网络获取网页数据
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
设置连接超时
conn.setConnectTimeout(6*1000);
对响应码进行判断
if (conn.getResponseCode() != 200) //从Internet获取网页,发送请求,将网页以流的形式读回来
throw new RuntimeException("请求url失败");
得到网络返回的输入流
InputStream is = conn.getInputStream();
String result = readData(is, "GBK"); //文件流输入出文件用outStream.write
conn.disconnect();
总结--
记得设置连接超时,如果网络不好,Android系统在超过默认时间会收回资源中断操作.
返回的响应码200,是成功.
在Android中对文件流的操作和JAVA SE上面是一样的.
在对大文件的操作时,要将文件写到SDCard上面,不要直接写到手机内存上.
操作大文件是,要一边从网络上读,一边要往SDCard上面写,减少手机内存的使用.这点很重要,面试经常会被问到.
对文件流操作完,要记得及时关闭.
- 向Internet发送请求参数
步骤:
创建URL对象
通过HttpURLConnection对象,向网络地址发送请求
设置容许输出:
conn.setDoOutput(true);
设置不使用缓存:
conn.setUseCache(false);
设置使用POST方式发送:
conn.setRequestMethod("POST");
设置维持长连接:
conn.setRequestProperty("Connection","Keep-Alive");
设置文件字符集:
conn.setRequestProperty("Charset","UTF-8");
设置文件长度
conn.setRequestProperty("Content-Length",String.valueOf(data.length));
设置文件类型:
conn.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
总结
发送POST请求必须设置允许输出
不要使用缓存,容易出现问题.
在开始用HttpURLConnection对象的setRequestProperty()设置,就是生成HTML文件头.
- 向Internet发送xml数据
11)设置文件类型:conn.setRequestProperty("Content-Type", "text/xml; charset=UTF-8");
12)以文件流的方式发送xml数据:outStream.write(xmlbyte);
总结:
--我们使用的是用HTML的方式传输文件,这个方式只能传输一般在5M一下的文件.
--传输大文件不适合用HTML的方式,传输大文件我们要面向Socket编程.确保程序的稳定性
--将地址和参数存到byte数组中:byte[] data = params.toString().getBytes();
Http学习之使用HttpURLConnection发送post和get请求 android
最常用的Http请求无非是get和post,get请求可以获取静态页面,也可以把参数放在URL字串后面,传递给servlet,post与get的不同之处在于post的参数不是放在URL字串里面,而是放在http请求的正文内。在Java中可以使用HttpURLConnection发起这两种请求
HttpURLConnection.connect函数,实际上只是建立了一个与服务器的tcp连接,并没有实际发送http请求。无论是post还是get,http请求实际上直到HttpURLConnection.getInputStream()这个函数里面才正式发送出去。对connection对象的一切配置(那一堆set函数)都必须在connect()函数执行之前完成。而对OutputStream的写操作,又必须在inputStream的读操作之前。这些顺序实际上是由http请求的格式决定的。
http请求实际上由两部分组成,一个是http头,所有关于此次http请求的配置都在http头里面定义,一个是正文content,在connect()函数里面,会根据HttpURLConnection对象的配置值生成http头,因此在调用connect函数之前,就必须把所有的配置准备好。
紧接着http头的是http请求的正文,正文的内容通过outputStream写入,实际上outputStream不是一个网络流,充其量是个字符串流,往里面写入的东西不会立即发送到网络,而是在流关闭后,根据输入的内容生成http正文
至此,http请求的东西已经准备就绪。在getInputStream()函数调用的时候,就会把准备好的http请求正式发送到服务器了,然后返回一个输入流,用于读取服务器对于此次http请求的返回信息。由于http请求在getInputStream的时候已经发送出去了(包括http头和正文),因此在getInputStream()函数之后对connection对象进行设置(对http头的信息进行修改)或者写入outputStream(对正文进行修改)都是没有意义的了,执行这些操作会导致异常的发生。
HttpClient、HttpGet、HttpResponse、HttpPost
Android Http操作介绍
无论是使用HttpGet,还是使用HttpPost,都必须通过如下3步来访问HTTP资源。
1.创建HttpGet或HttpPost对象,将要请求的URL通过构造方法传入HttpGet或HttpPost对象。
2.使用DefaultHttpClient类的execute方法发送HTTP GET或HTTP POST请求,并返回HttpResponse对象。
3.通过HttpResponse接口的getEntity方法返回响应信息,并进行相应的处理。
如果使用HttpPost方法提交HTTP POST请求,还需要使用HttpPost类的setEntity方法设置请求参数。
注意,在用Post时,传递变量必须用NameValuePais[]数组存储,通过HttpRequest.setEntity()方法来发出http请求。
此外,也必须通过DefaultHttpClient().execute(httpRequest)添加HttpRequest对象来接收web server的回复,再通过httpResponse.getEntity()取出回复信息。
Android HTTP实例 使用GET方法和POST方法发送请求
//使用Get方法发送请求,需要把参数加载URL后面,用?连接,参数之间用&分隔
String url = baseURL+"?username"+name+"&age"+age;
//生成请求对象
HttpGet httpGet = new HttpGet(url);
HttpClient httpClient = new DefaultHttpClient();
//发送请求
try{
HttpResponse response = httpClient.execute(httpGet);
//自定义函数显示响应
showResponseResult(response);
}catch(Exception e)
{
e.printStackTrace();
}
post方式
NameValuePair pair1 = new BasicNameValuePair("username",name);
NameValuePair pair2 = new BasicNameValuePair("age",age);
List<NameValuePair> pairList = new ArrayList<NameValuePair>();
pairList.add(pair1);
pairList.add(pair2);
try{
HttpEntity requestHttpEntity = new UrlEncodeFormEntity(pairList);
//URL使用基本URL即可,其中不需要加参数
HttpPost httpPost = new HttpPost(baseURL);
//将请求体内容加入请求中
httpPost.setEntity(requestHttpEntity);
//需要客户端对象来发送请求
HttpClient httpClient = new DefaultHttpClient();
//发送请求
HttpResponse response = httpClient.execute(httpPost);
//自定义函数显示响应
showResponseResult(response);
}catch(Exception e)
{
e.printStackTrace();
}
自定义处理函数
private void showResponseResult(HttpResponse response)
{
if (null ==response)
{
return;
}
HttpEntity httpEntity = response.getEntity();
try{
InputStream inputStream = httpEntity.getContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
String result="";
String line = "";
while(null!=(line = reader.readLine()))
{
result +=line;
}
System.out.println(result);
}catch(Exception e)
{
e.printStackTrace();
}
}
参考:
HttpURLConnection:
-
Http学习之使用HttpURLConnection发送post和get请求 android
讲述了一些原理,提供了例子代码 -
Android HttpURLConnection 基础使用
给了简单的例子
HttpClient:
- Android HTTP实例 使用GET方法和POST方法发送请求
- android http协议post请求方式
- Android Http操作介绍
- Android 中通过HTTPRequest 与服务端进行 JSON格式数据交互
JSON:
Android-Async-Http:
- 快速Android开发系列网络篇之Android-Async-Http
-
android http请求异步封装
android http多请求异步封装对你绝对有用