首页
关于
Search
1
笔记测试
276 阅读
2
PostgreSql使用Truncate清空数据表
245 阅读
3
GO语言及gin框架中踩坑总结
241 阅读
4
HashMap和Hashtable之间的区别
219 阅读
5
Docker——具名挂载和匿名挂载
206 阅读
默认分类
Java
Vue
SQL
Linux
Python
Golang
Search
Miku
累计撰写
14
篇文章
累计收到
0
条评论
首页
栏目
默认分类
Java
Vue
SQL
Linux
Python
Golang
页面
关于
搜索到
14
篇与
admin
的结果
2021-04-13
Java重写equals与hashCode方法
常见Java重写equals与hashCode方法@Override public boolean equals(Object o) { //判断是不是同一个对象 if (this == o) { return true; } //判断是否为空 if (o == null || getClass() != o.getClass()) { return false; } //判断是否为Student类型并比较属性 Student student = (Student) o; return age == student.age && Objects.equals(name, student.name); }
2021年04月13日
138 阅读
0 评论
0 点赞
2021-04-12
【Python】Http Post请求四种请求体的Python实现
前言 前几天一个刚接触Python不深的朋友问我的Python的xml格式Post请求怎么发送,刚好最近也在学习Http请求相关的内容,所以决定总结一下各类Post请求的Python实现。 这里说的各类Post请求主要包含json格式、xml格式、文件上传(form-data)、及默认传递的urlencoded。 在开始介绍相关的Python用法之前,我们首先我们来了解一下HTTP的报文结构。 HTTP的报文结构 上面这张图是Fiddle捕获的一个实际请求报文,它清晰的展示了HTTP 消息的结构。详情如下: 请求行:即第一排用空格分割成的三个小块,分别对应请求方法、请求URL、HTTP协议版本三个部分。请求头:从第二行开始到倒数第二行都是我们的请求头(headers)。消息主体:截图的最后一行是请求体,也就是我们要发送的数据的主体,消息主体(entity-body)。 也就是说一个正常的post请求主要由请求行,请求头,消息主体组成。接下来我们来了解一下什么是Content-Type。 Content-Type的定义 要了解Content-Type首先我们要先对HTTP/1.1 协议有一定的了解。 众所周知,HTTP/1.1 规定的 HTTP 请求方法有 OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE、CONNECT 8种,其中 POST 一般用来向服务端提交数据。 但是可能很多人不知道的是,虽然HTTP/1.1协议规定 了POST 提交的数据必须放在消息主体(entity-body)中,但并没有规定数据必须使用什么样的编码方式。也就是说,开发者完全可以自己决定消息主体的格式。 但是数据除了请求方发送之外,还要服务端能够解析才有意义。而这个解析操作的第一步通常就是是根据请求头(headers)中的 Content-Type 字段来获知请求中的消息主体的编码方式,然后再对数据进行对应的解析操作。也就是说请求头中的Content-Type字段用于规定请求体的编码格式,服务端代码需要使用它对接收到的消息主体进行解析。 Content-Type的格式种类 我们前面说了HTTP/1.1没有规定协议编码方式,但是随着协议的应用推广,已经慢慢的形成了四种最常用的编码方式,基本上形成了相应的规范,即基本固定的Content-Type取值application/x-www-form-urlencoded(默认格式)、application/json、text/xml、multipart/form-data,与默认传递的urlencoded、json格式、xml格式、文件格式一 一对应。 接下来我们会每个编码方式的应用场景及Python实现分别进行介绍。我们此次主要使用http://httpbin.org/来做演示。 httpbin是一个专门用来测试 HTTP 请求及响应的网站,其github开源地址是https://github.com/requests/httpbin。作者另外一个开源库就是大名鼎鼎的requests,它也是我们演示代码中重要的部分。 1、application/x-www-form-urlencoded格式 参考Python实现 import requests datas = {"param1": "Detector", "param2": "cnblogs"} r = requests.post("http://httpbin.org/post", data=datas) print(r.text) print(r.status_code) 我们在代码中没有进行Content-Type的设置,但是我们来看看Fiddler抓包的结果。 可以看到Content-Type已经被自动填充为application/x-www-form-urlencoded了。 2、 application/json格式 application/json 这个 Content-Type 作为响应头大家肯定不陌生。实际上,现在越来越多的人把它作为请求头,用来告诉服务端消息主体是序列化后的 JSON 字符串。由于 JSON 规范的流行,除了低版本 IE 之外的各大浏览器都原生支持 JSON.stringify,服务端语言也都有处理 JSON 的函数,使用 JSON 不会遇上什么麻烦。 import json import requests headers = {'Content-Type': 'application/json'} datas = json.dumps({"param1": "Detector", "param2": "cnblogs"}) r = requests.post("http://httpbin.org/post", data=datas, headers=headers) print(r.text) 有兴趣的朋友可以尝试不添加请求头,抓包看看结果。 Fiddler抓包结果 3、text/xml数据格式 它是一种使用 HTTP 作为传输协议,XML 作为编码方式的远程调用规范。典型的 XML-RPC(XML Remote Procedure Call) 请求数据是这样的: <?xml version="1.0"?> <methodCall> <methodName>examples.getStateName</methodName> <params> <param> <value><i4>41</i4></value> </param> </params> </methodCall> 参考Python实现 import requests headers = {"Content-Type": "text/xml"} datas = """<?xml version="1.0"?> <methodCall> <methodName>examples.getStateName</methodName> <params> <param> <value><i4>41</i4></value> </param> </params> </methodCall>""" r = requests.post("http://httpbin.org/post", data=datas, headers=headers) print(r.text) 可以看到,我们和application/json请求的区别是,我们把请求的内容换成了xml格式的字符串,Content-Type换成了text/xml。 Fiddler抓包结果 4、multipart/form-data数据格式 multipart/form-data主要用于文件上传,当我们使用它时,必须让 form表单的enctype 等于 multipart/form-data。直接来看一个请求示例,主要实现了上传本地的test.txt文件: 参考Python实现 import requests files = {"file": open("C:/Users/Administrator/Desktop/test.txt", "rb")} r = requests.post("http://httpbin.org/post", files=files) print(r.text) Fiddler抓包结果
2021年04月12日
114 阅读
0 评论
0 点赞
2021-03-18
Vue.js中this.$nextTick()的使用
this.$nextTick()将回调延迟到下次 DOM 更新循环之后执行。在修改数据之后立即使用它,然后等待 DOM 更新。它跟全局方法 Vue.nextTick 一样,不同的是回调的 this 自动绑定到调用它的实例上。假设我们更改了某个dom元素内部的文本,而这时候我们想直接打印出这个被改变后的文本是需要dom更新之后才会实现的,也就好比我们将打印输出的代码放在setTimeout(fn, 0)中;先来第一个例子看一看<template> <section> <div ref="hello"> <h1>Hello World ~</h1> </div> <el-button type="danger" @click="get">点击</el-button> </section> </template> <script> export default { methods: { get() { } }, mounted() { console.log(333); console.log(this.$refs['hello']); this.$nextTick(() => { console.log(444); console.log(this.$refs['hello']); }); }, created() { console.log(111); console.log(this.$refs['hello']); this.$nextTick(() => { console.log(222); console.log(this.$refs['hello']); }); } } </script>可以根据打印的顺序看到,在created()钩子函数执行的时候DOM 其实并未进行任何渲染,而此时进行DOM操作并无作用,而在created()里使用this.$nextTick()可以等待dom生成以后再来获取dom对象然后来看第二个例子<template> <section> <h1 ref="hello">{{ value }}</h1> <el-button type="danger" @click="get">点击</el-button> </section> </template> <script> export default { data() { return { value: 'Hello World ~' }; }, methods: { get() { this.value = '你好啊'; console.log(this.$refs['hello'].innerText); this.$nextTick(() => { console.log(this.$refs['hello'].innerText); }); } }, mounted() { }, created() { } } </script>根据上面的例子可以看出,在方法里直接打印的话, 由于dom元素还没有更新, 因此打印出来的还是未改变之前的值,而通过this.$nextTick()获取到的值为dom更新之后的值this.$nextTick()在页面交互,尤其是从后台获取数据后重新生成dom对象之后的操作有很大的优势,这里只是简单的例子,实际应用中更为好用~
2021年03月18日
177 阅读
0 评论
0 点赞
2021-03-16
笔记测试
这是一个笔记测试
2021年03月16日
276 阅读
0 评论
0 点赞
1
2
3