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文件中配置申请网络连接的权限。


使用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()
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 pairList = new ArrayList();
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多请求异步封装对你绝对有用

你可能感兴趣的:(HttpRequest)