浅谈StringEntity 和 UrlEncodedFormEntity之间的区别

StringEntity 和 UrlEncodedFormEntity的区别一、UrlEncodedFormEntity

//设置请求方式与参数URI uri = new URI(uriStr);HttpPost httpPost = new HttpPost(uri);httpPost.getParams().setParameter("http.socket.timeout", new Integer(500000));httpPost.setHeader("Content-type", "text/plain; charset=UTF-8");httpPost.setHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows 2000)");httpPost.setHeader("IConnection", "close");List<NameValuePair> nvps = new ArrayList<NameValuePair>();nvps.add(new BasicNameValuePair("KEY1", "VALUE1"));//...httpPost.setEntity(new UrlEncodedFormEntity(nvps));//执行请求HttpClient httpclient = new DefaultHttpClient();httpclient.getParams().setParameter("Content-Encoding", "UTF-8");HttpResponse response = httpclient.execute(httpPost);//获取返回HttpEntity entity = response.getEntity();BufferedReader in = new BufferedReader(new InputStreamReader(entity.getContent(), "UTF-8"));StringBuffer buffer = new StringBuffer();String line = null;while ((line = in.readLine()) != null) {  buffer.append(line);}return buffer.toString();

使用 UrlEncodedFormEntity 来设置 body,消息体内容类似于“KEY1=VALUE1&KEY2=VALUE2&…”这种形式,服务端接收以后也要依据这种协议形式做处理。

二、StringEntity

有时候我们不想使用上述格式来传值,而是想使用json格式来设置body,就可以使用这个类的实例。

JSONObject jsonObject = new JSONObject();jsonObject.put("KEY1", "VALUE1");jsonObject.put("KEY2", "VALUE2");httpPost.setEntity(new StringEntity(jsonObject.toString()));

可以看出,UrlEncodedFormEntity()的形式比较单一,只能是普通的键值对,局限性相对较大。

而StringEntity()的形式比较自由,只要是字符串放进去,不论格式都可以。

HttpClient发送Post请求:StringEntity 和 UrlEncodedFormEntity一. json简介

JSON是一种取代XML的数据结构,和XML相比,它更小巧但描述能力却不差,由于它的小巧所以网络传输数据将减少更多流量从而加快速度。

JSON就是一串字符串 只不过元素会使用特定的符号标注。

a. {} 双括号表示对象

b. [] 中括号表示数组

c. “” 双引号内是属性或值

d. : 冒号表示后者是前者的值(这个值可以是字符串、数字、也可以是另一个数组或对象)

所以 {“name”: “Michael”} 可以理解为是一个包含name为Michael的对象。而[{“name”: “Michael”},{“name”: “Jerry”}]就表示包含两个对象的数组。当然了,可以使用{“name”:[“Michael”,“Jerry”]}来简化,这是一个拥有一个name数组的对象。

JSON格式数据的优点:

A.数据格式比较简单,易于读写,格式都是压缩的,占用带宽小,是非常轻量级的数据格式;

B.易于解析,客户端JavaScript可以简单的通过eval()进行JSON数据的读取;

C.支持多种语言,其中在Java端有丰富的工具操作和解析JSON;

D.因为JSON格式能直接为服务器端代码使用,大大简化了服务器端和客户端的代码开发量,且完成任务不变,并且易于维护;

二. JSONObject 、JSONArray

1,JSONObject

json对象,就是一个键对应一个值,使用的是大括号{ },如:{key:value}

2,JSONArray

json数组,使用中括号[ ],只不过数组里面的项也是json键值对格式的Json对象中添加的是键值对,JSONArray中添加的是Json对象

JSONObject Json = new JSONObject();JSONArray JsonArray = new JSONArray();Json.put(“key”, “value”);//JSONObject对象中添加键值对JsonArray.add(Json);//将JSONObject对象添加到Json数组中

3,JSONObject与Map

Map map和json都是键值对,不同的是map中键值对中间用等号分开,json中键值对中间用冒号分开。json就是一种特殊形式的map。

Map<String,String> strmap=new JSONObject();

这里的需求是:request对象获取的map,想要返回json格式也不用白费力了。

[{name1:{name2:{name3:‘value1',name4:‘value2'}}},{}]

取出name4值过程步骤:

1,将以上字符串转换为JSONArray对象;

2,取出对象的第一项,JSONObject对象;

3,取出name1的值JSONObject对象;

4,取出name2的值JSONObject对象;

5,取出name4的值value2。

示例中json数组格式的字符串可以通过方法直接转换为JSONArray的格式:

JSONArray.fromObject(String)JSONArray getJsonArray=JSONArray.fromObject(arrayStr);//将结果转换成JSONArray对象的形式JSONObject getJsonObj = getJsonArray.getJSONObject(0);//获取json数组中的第一项String result=getJsonObj.getJSONObject(“name1”).getJSONObject(“name2”).getJSONObject(“name4”);

三. json解析1.传统的JSON解析

1、生成json字符串

public static String createJsonString(String key, Object value) {        JSONObject jsonObject = new JSONObject();        jsonObject.put(key, value);        return jsonObject.toString();}

2、解析JSON字符串:分为以下三种情况,一个JavaBean,一个List数组,一个嵌套Map的List数组

//完成对json数据的解析public class JsonTools {    public static Person getPerson(String key, String jsonString) {        Person person = new Person();        try {            JSONObject jsonObject = new JSONObject(jsonString);            JSONObject personObject = jsonObject.getJSONObject("person");               person.setId(personObject.getInt("id"));               person.setName(personObject.getString("name"));               person.setAddress(personObject.getString("address"));        } catch (Exception e) {            // TODO: handle exception        }        return person;    }     public static List getPersons(String key, String jsonString) {        List list = new ArrayList();        try {            JSONObject jsonObject = new JSONObject(jsonString);            // 返回json的数组            JSONArray jsonArray = jsonObject.getJSONArray(key);            for (int i = 0; i < jsonArray.length(); i++) {                JSONObject jsonObject2 = jsonArray.getJSONObject(i);                Person person = new Person();                     person.setId(jsonObject2.getInt("id"));                     person.setName(jsonObject2.getString("name"));                     person.setAddress(jsonObject2.getString("address"));                list.add(person);            }        } catch (Exception e) {            // TODO: handle exception        }        return list;    }    public static List getList(String key, String jsonString) {        List list = new ArrayList();        try {            JSONObject jsonObject = new JSONObject(jsonString);            JSONArray jsonArray = jsonObject.getJSONArray(key);            for (int i = 0; i < jsonArray.length(); i++) {                String msg = jsonArray.getString(i);                list.add(msg);            }        } catch (Exception e) {            // TODO: handle exception        }        return list;    }    public static List> listKeyMaps(String key,String jsonString) {        List> list = new ArrayList>();        try {            JSONObject jsonObject = new JSONObject(jsonString);            JSONArray jsonArray = jsonObject.getJSONArray(key);            for (int i = 0; i < jsonArray.length(); i++) {                JSONObject jsonObject2 = jsonArray.getJSONObject(i);                Map map = new HashMap();                Iterator iterator = jsonObject2.keys();                while (iterator.hasNext()) {                    String json_key = iterator.next();                    Object json_value = jsonObject2.get(json_key);                    if (json_value == null) {                        json_value = "";                    }                    map.put(json_key, json_value);                }                list.add(map);            }        } catch (Exception e) {            // TODO: handle exception        }        return list;    }}

2.JSON解析之GSON

1、生成JSON字符串

import com.google.gson.Gson;public class JsonUtils {    public static String createJsonObject(Object obj) {        Gson gson = new Gson();        String str = gson.toJson(obj);        return str;    }}

2、解析JSON

public class GsonTools {    public GsonTools() {        // TODO Auto-generated constructor stub    }     /**     * @param      * @param jsonString     * @param cls     * @return     */    public static  T getPerson(String jsonString, Class cls) {        T t = null;        try {            Gson gson = new Gson();            t = gson.fromJson(jsonString, cls);        } catch (Exception e) {            // TODO: handle exception        }        return t;    }     /**     * 使用Gson进行解析 List     * @param      * @param jsonString     * @param cls     * @return     */    public static  List getPersons(String jsonString, Class cls) {        List list = new ArrayList();        try {            Gson gson = new Gson();            list = gson.fromJson(jsonString, new TypeToken>() {            }.getType());        } catch (Exception e) {        }        return list;    }     /**     * @param jsonString     * @return     */    public static List getList(String jsonString) {        List list = new ArrayList();        try {            Gson gson = new Gson();            list = gson.fromJson(jsonString, new TypeToken>() {            }.getType());        } catch (Exception e) {            // TODO: handle exception        }        return list;    }     public static List> listKeyMaps(String jsonString) {        List> list = new ArrayList>();        try {            Gson gson = new Gson();            list = gson.fromJson(jsonString,                    new TypeToken>>() {                    }.getType());        } catch (Exception e) {            // TODO: handle exception        }        return list;    }}

3.JSON解析之FastJSON

public class JsonTool {    public static  T getPerson(String jsonstring, Class cls) {        T t = null;        try {            t = JSON.parseObject(jsonstring, cls);        } catch (Exception e) {            // TODO: handle exception        }        return t;    }     public static  List getPersonList(String jsonstring, Class cls) {        List list = new ArrayList();        try {            list = JSON.parseArray(jsonstring, cls);        } catch (Exception e) {            // TODO: handle exception        }        return list;    }     public static  List> getPersonListMap1( String jsonstring) {        List> list = new ArrayList>();        try {            list = JSON.parseObject(jsonstring,                    new TypeReference>>() {                    }.getType());         } catch (Exception e) {            // TODO: handle exception        }        return list;    }}

JSON对于移动设备来说,尤其对于网络环境较差和流量限制的情况下,相对于XML格式的数据传输会更节省流量,传输效率更高。在这三种解析方式中FastJson是效率最高的,推荐使用。

四. HttpClient发送Post请求:StringEntity 和 UrlEncodedFormEntity

1.StringEntity

StringEntity有两个参数,一个是具体的参数值(string串),另一个是ContentType,默认是text/plain,编码格式是:ISO_5598_1。

使用httpclient时,尽量指定编码方式来初始化StringEntity。

使用HttpClient来发送请求获取数据:拼接出来的body本质是一串Sring,所以可以用StringEntity,使用方法如下:

//构造测试数据JSONObject param = new JSONObject();param.put("key","value");//CloseableHttpClient:建立一个可以关闭的httpClient//这样使得创建出来的HTTP实体,可以被Java虚拟机回收掉,不至于出现一直占用资源的情况。CloseableHttpClient client = HttpClients.createDefault(); //创建post请求HttpPost post = new HttpPost(testUrl);  //生成装载param的entityStringEntity entity = new StringEntity(param.toString(), "utf-8");   post.setEntity(entity);//执行请求CloseableHttpResponse response = TestConfig.httpClient.execute(post);//返回string格式的结果String result  = EntityUtils.toString(response.getEntity(), "utf-8");//关闭链接post.releaseConnection();client.close(); 

2.UrlEncodedFormEntity

ContentType就是application/x-www-form-urlencoded,urlEncodeFormEntity会将参数以key1=value1&key2=value2的键值对形式发出。类似于传统的application/x-www-form-urlencoded表单上传。

//构造测试数据List<NameValuePair> param = new ArrayList<NameValuePair>();param.add(new BasicNameValuePair("key1","value1"));param.add(new BasicNameValuePair("key2","value2"));//定义HttpClientCloseableHttpClient client = HttpClients.createDefault(); //创建post请求HttpPost post = new HttpPost(testUrl);//生成装载param的entityHttpEntity entity = new UrlEncodedFormEntity(param, "utf-8");post.setEntity(entity);//执行请求CloseableHttpResponse response = client.execute(post);//返回string格式的结果String result  = EntityUtils.toString(response.getEntity(), "utf-8");//关闭链接post.releaseConnection();client.close(); 

StringEntity可以用来灵活设定参数格式形式,而UrlEncodeFormEntity则适合于传统表单格式的参数形式。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。

只有一条路不能拒绝——那就是成长的路。

浅谈StringEntity 和 UrlEncodedFormEntity之间的区别

相关文章:

你感兴趣的文章:

标签云: