HttpRequest

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 中网络操作使用总结

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

android http协议post请求方式

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);


android之HttpURLConnection

  1. 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上面写,减少手机内存的使用.这点很重要,面试经常会被问到.
对文件流操作完,要记得及时关闭.

  1. 向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文件头.

  1. 向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:

  1. Http学习之使用HttpURLConnection发送post和get请求 android
    讲述了一些原理,提供了例子代码
  2. Android HttpURLConnection 基础使用
    给了简单的例子

HttpClient:

  1. Android HTTP实例 使用GET方法和POST方法发送请求
  2. android http协议post请求方式
  3. Android Http操作介绍
  4. Android 中通过HTTPRequest 与服务端进行 JSON格式数据交互

JSON:

  1. Android 中通过HTTPRequest 与服务端进行 JSON格式数据交互

Android-Async-Http:

  1. 快速Android开发系列网络篇之Android-Async-Http
  2. android http请求异步封装
    android http多请求异步封装对你绝对有用
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容