我的编程空间,编程开发者的网络收藏夹
学习永远不晚

浅谈StringEntity 和 UrlEncodedFormEntity之间的区别

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

浅谈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
    }
 
    
    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;
    }
 
    
    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;
    }
 
    
    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则适合于传统表单格式的参数形式。

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

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

浅谈StringEntity 和 UrlEncodedFormEntity之间的区别

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

浅谈SpringCloud Alibaba和SpringCloud的区别

这篇文章主要介绍了浅谈SpringCloud Alibaba和SpringCloud的区别,Spring Cloud Netflix框架也属于Spring Cloud,但是Netflix并不是由spring来进行开发的,需要的朋友可以参考下
2023-05-20

浅谈String、StringBuffer和StringBuilder的区别

在Java开发面试经常会被问到String,StringBuider,StringBuffer区别,很多人回答得不够全面和深入,那么它们到底都有什么区别呢!三者都是用来对字符串进行操作,String通常用来定义一个变量,而StringBuilder Strin
浅谈String、StringBuffer和StringBuilder的区别
2019-10-22

浅谈一下forward和redirect的区别

这篇文章主要介绍了forward和redirect的区别,在前端开发中,有很多刚入行的朋友不了解这两者之间的区别,那么这篇文章可以带给你新的认知,需要的朋友可以参考下
2023-03-24

浅谈Linux 脚本 sh 和 ./ 的区别

如果.不在PATH里面,要执行当前目录下的可执行文件,使用全路径: ./executable-file PATH是环境变量,如果将当前目录“./”添加到环境变量中,那么也可以不用“./”,直接输入当前目录下有可执行权限的可执行文件就可以运行
2022-06-04

浅谈Java中static和非static的区别

关于static和非static变量的区别1. static 修饰的变量称为类变量或全局变量或成员变量,在类被加载的时候成员变量即被初始化,与类关联,只要类存在,static变量就存在。非static修饰的成员变量是在对象new出来的时候划
2023-05-31

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录