当前位置 博文首页 > 文章内容

    浅谈StringEntity 和 UrlEncodedFormEntity之间的区别

    作者:shunshunshun18 栏目:未分类 时间:2021-06-19 18:43:41

    本站于2023年9月4日。收到“大连君*****咨询有限公司”通知
    说我们IIS7站长博客,有一篇博文用了他们的图片。
    要求我们给他们一张图片6000元。要不然法院告我们

    为避免不必要的麻烦,IIS7站长博客,全站内容图片下架、并积极应诉
    博文内容全部不再显示,请需要相关资讯的站长朋友到必应搜索。谢谢!

    另祝:版权碰瓷诈骗团伙,早日弃暗投明。

    相关新闻:借版权之名、行诈骗之实,周某因犯诈骗罪被判处有期徒刑十一年六个月

    叹!百花齐放的时代,渐行渐远!



    一、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的entity
    StringEntity 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"));
    //定义HttpClient
    CloseableHttpClient client = HttpClients.createDefault(); 
    //创建post请求
    HttpPost post = new HttpPost(testUrl);
    //生成装载param的entity
    HttpEntity 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则适合于传统表单格式的参数形式。

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持IIS7站长之家博文。