广告
返回顶部
首页 > 资讯 > 后端开发 > Python >浅谈StringEntity 和 UrlEncodedFormEntity之间的区别
  • 245
分享到

浅谈StringEntity 和 UrlEncodedFormEntity之间的区别

2024-04-02 19:04:59 245人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

StringEntity 和 UrlEncodedFORMEntity的区别 一、UrlEncodedFormEntity //设置请求方式与参数 URI uri = new U

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

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

--结束END--

本文标题: 浅谈StringEntity 和 UrlEncodedFormEntity之间的区别

本文链接: https://www.lsjlt.com/news/128597.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • 浅谈StringEntity 和 UrlEncodedFormEntity之间的区别
    StringEntity 和 UrlEncodedFormEntity的区别 一、UrlEncodedFormEntity //设置请求方式与参数 URI uri = new U...
    99+
    2022-11-12
  • 浅谈C结构和C++结构之间的区别
    今天我们来看一下:C结构和C++结构之间,到底有什么不一样地方! 在C++中,struct和class完全相同,除了struct默认为公共可见性和class默认为私有可见性。&nbs...
    99+
    2022-11-12
  • 浅谈Java中Int、Integer、Integer.valueOf()、new Integer()之间的区别
    目录IntInteger和Integer.valueOf()new Integer()三者之间的比较Int Int是Java八种基本数据类型之一,一般大小为4字节32位,取值范围为2...
    99+
    2022-11-12
  • 一文浅谈:&和&&的区别
    当我们在Java中使用逻辑运算符时,经常会用到两个符号:& 和 &&。这两个符号在表达式中的作用非常重要,但是很多人容易混淆它们的使用,因此我们需要了解它们之间的区别。 一、& 和 && 的用途 & 和 && 都可以用于逻辑运算,例 in...
    99+
    2023-10-24
    java jvm 面试
  • 浅谈System.getenv()和System.getProperty()的区别
    最近遇到一个需求,服务器实例需要获取当前的环境变量。经过查资料,发现环境变量可以在两个地方设置。 一、在系统层面设置环境变量 在系统层面设置环境变量,之前我们应该都操作过,以wind...
    99+
    2022-11-12
  • 浅谈RedisTemplate和StringRedisTemplate的区别
    目录一、区别二、问题总结三、案例:springboot整合redis五种数据结构API1、string(字符串)类型2、hash(哈希)类型3、list(列表)类型4、set(无序集...
    99+
    2022-11-13
  • 浅谈Mysql8和mysql5.7的区别
    目录1.NoSql存储2.隐藏索引3.设置持久化4.UTF-8编码5.通用表表达式(CommonTableExpressions)1.NoSql存储 Mysql从5.7 版本提供了N...
    99+
    2022-11-13
  • 浅谈String、StringBuffer和StringBuilder的区别
    在Java开发面试经常会被问到String,StringBuider,StringBuffer区别,很多人回答得不够全面和深入,那么它们到底都有什么区别呢!三者都是用来对字符串进行操作,String通常用来定义一个变量,而StringBui...
    99+
    2019-10-22
    java入门 java String StringBuffer StringBuilder
  • 浅谈HttpClient、okhttp和RestTemplate的区别
    一、HttpClient 1、pom依赖 <!--HttpClient--> <dependency> <groupId>common...
    99+
    2022-11-12
  • 浅谈Ribbon、Feign和OpenFeign的区别
    Ribbon Ribbon 是 Netflix开源的基于HTTP和TCP等协议负载均衡组件 Ribbon 可以用来做客户端负载均衡,调用注册中心的服务 Ribbon的使用需要代码里手...
    99+
    2022-11-12
  • 浅谈SpringCloud Alibaba和SpringCloud的区别
    目录Spring Cloud Netflix 和 Spring Cloud 是什么关系?为什么有了Spring Cloud又出来个Spring Cloud Alibaba呢?Clou...
    99+
    2023-05-20
    SpringCloud SpringCloud Alibaba
  • 浅谈Python3.10 和 Python3.9 之间的差异
    目录介绍:了解 Python 及其用例:分析 Python 3.9 V/s Python 3.10 的差异Python 3.9:IANA 时区数据库合并和更新字典的函数删除前缀和后缀...
    99+
    2022-11-12
  • 浅谈Java中Lock和Synchronized的区别
    目录1. 从功能角度来看2. 从特性来看3. 从性能方面来看1. 从功能角度来看 Lock和Synchronized都是java中去用来解决线程安全问题的一个工具 2. 从特性来看 ...
    99+
    2022-11-13
  • 浅谈Linux 脚本 sh 和 ./ 的区别
    如果.不在PATH里面,要执行当前目录下的可执行文件,使用全路径: ./executable-file PATH是环境变量,如果将当前目录“./”添加到环境变量中,那么也可以不用“./”,直接输入当前目录下...
    99+
    2022-06-04
    浅谈 脚本 区别
  • 浅谈JDK7和JDK8的区别在哪
    目录一、接口中的default方法二、lambda表达式三、函数式接口四、StreamAPI五、移出永久代,元空间替换六、HashMap中的优化七、currentHashMap的优化...
    99+
    2022-11-12
  • 浅谈一下forward和redirect的区别
    目录1.forward 和redirectforward又叫转发,表示转发,当请求来到时,可以将请求转发到其他的指定服务,用户端不知晓。redirect又叫重定向,表示转发,当请求发...
    99+
    2023-03-24
    forward redirect forward和redirect的区别
  • 浅谈JS中var,let和const的区别
    目录区别1区别2区别3区别4区别5区别6区别7区别1 let和var用来声明变量,const用来声明常量。 变量就是赋值后可以改变它的值,常量就是赋值后就不能改变它的值。 当声明为对...
    99+
    2022-11-13
  • 浅谈synchronized加锁this和class的区别
    目录synchronized 用法1.加锁 class 共享一个类实例2.加锁 class 创建多个实例3.加锁 this 共享一个类实例4.加锁 this 创建多个类实例总结syn...
    99+
    2022-11-12
  • 浅谈Java中static和非static的区别
    关于static和非static变量的区别 static 修饰的变量称为类变量或全局变量或成员变量,在类被加载的时候成员变量即被初始化,与类关联,只要类存在,static变量就存在。非static修饰的成员变量是在对象new出来的时候划分存...
    99+
    2023-05-31
    java static ava
  • 详谈锁和监视器之间的区别_Java并发
    在面试中你可能遇到过这样的问题:锁(lock)和监视器(monitor)有什么区别?嗯,要回答这个问题,你必须深入理解Java的多线程底层是如何工作的。简短的答案是,锁为实现监视器提供必要的支持。详细答案如下。锁(lock)逻辑上锁是对象内...
    99+
    2023-05-31
    java 监视器
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作