接口测试 — 4.Requests库GET、Post请求

Requests库GET请求是使用HTTP协议中的GET请求方式对目标网站发起请求。

(不带参数的GET请求请看上一篇文章的练习)

1、Requests库待参数的GET请求

使用Get方法带参数请求时,是params=参数字典,而不是data=参数字典。data=参数字典是post方法的参数。

"""
1.学习目标必须掌握requests中带参数的get请求
2.语法requests.get(url,parmas=None)2.1 不带参数的get请求(看上一篇中的练习)2.2 带参数的get请求(如下)
3.操作步骤# 1.导入requests库# 2.明确请求地址# 3.明确请求参数data = {key:value}  字典格式# 4.发送请求获取返回数据
4.需求使用requests库发送一个带参数的get请求
"""
# 1.导入requests库
import json
import requests# 2.明确请求地址
url = "http://127.0.0.1:8000/api/departments/"
# 3.明确请求参数
# 是一个字典类型数据
data = {"$dep_id_list": "10,11"}
# 4.发送请求
response = requests.get(url=url, params=data)
# print(response.json())# 将python对象转换为json字符串(格式化放回数据)
result = json.dumps(response.json(), indent=2, ensure_ascii=False)
# print(type(result))  # 字符串类型
print(result)"""
结果:
{"count": 2,"next": null,"previous": null,"results": [{"dep_id": "10","dep_name": "超神_10","master_name": "陆兴雷_10","slogan": "带头学习"},{"dep_id": "11","dep_name": "超神_11","master_name": "陆兴雷_11","slogan": "带头学习"}]
}"""

如果你想学习接口测试,我这边给你推荐一套视频,这个视频可以说是B站播放全网第一的接口自动化测试教程,同时在线人数到达1000人,并且还有笔记可以领取及各路大神技术交流:798478386    

Postman接口测试使用教程和接口自动化测试项目实战你要的都有_哔哩哔哩_bilibiliPostman接口测试使用教程和接口自动化测试项目实战你要的都有共计32条视频,包括:1.精通Postman之课程大纲和效果展示、2.精通Postman之接口测试简介和分类、3.精通Postman之接口测试流程和用例设计等,UP主更多精彩视频,请关注UP账号。icon-default.png?t=N7T8https://www.bilibili.com/video/BV11K4y1J7sh/?spm_id_from=333.337.search-card.all.click

 

2、查看GET请求的内容

我们可以通过访问Httpbin来查看或者调试Requests库发送请求的内容。

还是以上面的例子为例:

# 1.导入requests库
import json
import requests# 2.明确请求地址
# url = "http://127.0.0.1:8000/api/departments/"
url = "http://127.0.0.1:9999/get"
# 3.明确请求参数
# 是一个字典类型数据
data = {"$dep_id_list": "10,11"}
# 4.发送请求
response = requests.get(url=url, params=data)
# response = requests.get(url='http://httpbin.org/get?name=admin&age=20')  # 这种方式调用也可以
# print(response.json())# 将python对象转换为json字符串(格式化放回数据)
result = json.dumps(response.json(), indent=2, ensure_ascii=False)
# print(type(result))  # 字符串类型
print(result)"""
接口返回结果:
{"args": {"$dep_id_list": "10,11"},"headers": {"Accept": "*/*","Accept-Encoding": "gzip, deflate","Connection": "keep-alive","Host": "127.0.0.1:9999","User-Agent": "python-requests/2.18.4"},"origin": "127.0.0.1","url": "http://127.0.0.1:9999/get?%24dep_id_list=10%2C11"
}我们可以看到args属性中有参数内容,
如果是不带参数的Get请求,args属性中是没有内容的,如下:{"args": {},"headers": {"Accept": "*/*","Accept-Encoding": "gzip, deflate","Connection": "keep-alive","Host": "127.0.0.1:9999","User-Agent": "python-requests/2.18.4"},"origin": "127.0.0.1","url": "http://127.0.0.1:9999/get"
}
"""

3、带请求头、参数的get请求

例如上面例子中,请求头信息中"User-Agent": "python-requests/2.18.4",我们需要改变请求头中User-Agent属性的内容,看下面例子:

# 1.导入requests库
import json
import requests# 2.明确请求地址
# url = "http://127.0.0.1:8000/api/departments/"
url = "http://127.0.0.1:9999/get"
# 3.明确请求参数
# 是一个字典类型数据
data = {"$dep_id_list": "10,11"}# 明确请求头信息
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3775.400 QQBrowser/10.6.4209.400"}# 4.发送请求
response = requests.get(url=url, params=data, headers=headers)
# print(response.json())# 将python对象转换为json字符串(格式化放回数据)
result = json.dumps(response.json(), indent=2, ensure_ascii=False)
# print(type(result))  # 字符串类型
print(result)"""
接口返回结果:可以看到User-Agent属性变成了我们设置的内容了。
{"args": {"$dep_id_list": "10,11"},"headers": {"Accept": "*/*","Accept-Encoding": "gzip, deflate","Connection": "keep-alive","Host": "127.0.0.1:9999","User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3775.400 QQBrowser/10.6.4209.400"},"origin": "127.0.0.1","url": "http://127.0.0.1:9999/get?%24dep_id_list=10%2C11"
}"""

除此之外Get请求还有很多请求参数,如timeout你可以设置请求时间,如果超过这个时间变自行结束请求,可以利用此判断请求代理的相应效率,避免在某些错误请求上浪费过多的时间。

4、Requests库POST请求

POST请求用于向服务器提交数据,比如增删改数据,提交一个表单新建一个用户、或修改一个用户等。

对于POST请求,我们可以通过浏览器开发者工具或者其他外部工具来进行抓包,得到请求的URL、请求头(request headers)以及请求的表单data信息,这三样恰恰是我们用Requests模拟POST请求时需要的。

关于请求头的配置和GET请求是一样的,都是定义headers属性即可。

而关于POST请求提交的参数,是和GET请求是不一样的。

post请求四种传送正文方式:

  • (1)请求正文是application/x-www-form-urlencoded

  • (2)请求正文是multipart/form-data

  • (3)请求正文是raw

  • (4)请求正文是binary

这四种提交数据的方式,是在请求头Content-Type属性中来定义。

1、application/x-www-form-urlencoded

Reqeusts支持以application/x-www-form-urlencoded数据格式发送POST请求(标准的POST请求数据格式,默认),只需要将请求的参数构造成一个字典,然后传给requests.post()的data参数即可。

示例:

"""
1.学习目标必须掌握requests库发送post请求方法
2.HTTP协议中post请求参数类型requests.post(url, data=None, json=None, **kwargs)根据不同的请求参数类型分为如下几种:x-www-form-data-urlencodedraw_json格式form-databinary
3.json格式# 1.导入requests库# 2.明确请求地址# 3.明确请求参数data = {key:value}  字典格式# 4.发送请求requests.post(url=url,json=data)
4.需求通过访问http://httpbin.org/post接口,验证post参数类型"""
# 1.导入requests库
import requests
import json# 2.明确请求地址
url = "http://httpbin.org/post"
# 3.明确请求参数
data = {"dep_id": "T01","dep_name": "Test学院","master_name": "Test-Master","slogan": "Here is Slogan"
}
# 4.发送请求
response = requests.post(url=url, data=data)# 将python对象转换为json字符串(格式化返回数据)
result = json.dumps(response.json(), indent=2, ensure_ascii=False)
# print(type(result))  # 字符串类型
print(result)"""
返回结果:
{"args": {},"data": "","files": {},****************主要看这里"form": {"dep_id": "T01","dep_name": "Test学院","master_name": "Test-Master","slogan": "Here is Slogan"},***********************"headers": {"Accept": "*/*","Accept-Encoding": "gzip, deflate","Content-Length": "88",*****************主要看这里"Content-Type": "application/x-www-form-urlencoded",*****************"Host": "httpbin.org","User-Agent": "python-requests/2.18.4","X-Amzn-Trace-Id": "Root=1-5ff401e3-1553596b7788e77e275c4772"},"json": null,"origin": "106.35.9.12","url": "http://httpbin.org/post"
}
"""

说明:

  • 发送的请求中,form属性接收了参数。
  • 在请求头中,Content-Type属性为application/x-www-form-urlencoded
  • 使用application/x-www-form-urlencoded格式发送数据,requests.post(url=url, data=data)方法中一定要使用data变量来接收参数。
  • 换句话说数据格式是字典格式,使用data变量来接收,会默认发送application/x-www-form-urlencoded数据格式的POST请求。(也可以在请求头中明确一下Content-Type属性,但没必要。)

2、请求正文是raw

RAW的原意就是“未经加工”。换句话说RAW方式使用的是纯字符串的数据上传方式,所以在发送POST请求之前,可能需要手工的把一些JSON格式的数据转换成字符串的(加两单引号),在进行提交。

RAW数据格式的POST请求有两种:

  • 一种是xml格式文本(text/xml)
  • 一种是json格式文本(application/json)

下面我们一一说明:

(1)json格式文本(application/json)
# 1.导入requests库
import requests
import json# 2.明确请求地址
url = "http://httpbin.org/post"
# 3.明确请求参数
data = {"data": [{"dep_id": "T01","dep_name": "Test学院","master_name": "Test-Master","slogan": "Here is Slogan"}]
}# headers = {"Content-Type": "application/json"}# 4.发送请求
response = requests.post(url=url, json=data)
print(response)  # <Response [200]>
print(response.text)"""
返回结果:
{"args": {}, "data": "{\"data\": [{\"dep_id\": \"T01\", \"dep_name\": \"Test\\u5b66\\u9662\", \"master_name\": \"Test-Master\", \"slogan\": \"Here is Slogan\"}]}", "files": {}, "form": {}, "headers": {"Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Content-Length": "119", **************************主要看这里"Content-Type": "application/json", **************************"Host": "httpbin.org", "User-Agent": "python-requests/2.18.4", "X-Amzn-Trace-Id": "Root=1-5ff40a9d-6a6f19d272ba4c1b40ff7bbb"}, **************************主要看这里"json": {"data": [{"dep_id": "T01", "dep_name": "Test\u5b66\u9662", "master_name": "Test-Master", "slogan": "Here is Slogan"}]}, **************************"origin": "106.35.9.12", "url": "http://httpbin.org/post"
}
"""

说明:

  • 发送的请求中,json属性接收了参数。
  • 在请求头中,Content-Type属性为application/json
  • 使用application/json格式发送数据,requests.post(url=url, json=data)方法中一定要使用json变量来接收参数。
  • 换句话说数据格式是Json格式,使用json变量来接收,Requests会默认发送application/json数据格式的POST请求。(也可以在请求头中明确一下Content-Type属性,但没必要。)

注意:

这里我们可以发现Requests模拟post请求时,请求头格式为application/x-www-form-urlencoded与application/json的主要差别在于请求主体的构造格式(前者是键值对,后者是JSON串),前者直接用字典传入,后者用json.dumps()函数将字典转为JSON串即可。

也就是说在有需要的时候json模块下的dumps函数可以将dict转换为str。

(2)xml格式文本(text/xml)

# 1.导入requests库
import requests
import json# 2.明确请求地址
url = "http://httpbin.org/post"
# 3.明确请求参数
data = '<sites>' \'<site>' \'<name>菜鸟教程</name>' \'<url>www.runoob.com</url>' \'</site>' \'<site>' \'<name>Google</name>' \'<url>www.google.com</url>' \'</site>' \'</sites>'#  requests.post方法中适用json变量来接收数据,
# 默认是"Content-Type": "application/json", 
# 这里我们需要重新声明一下Content-Type属性。
headers = {'Content-type': 'text/xml'}# 4.发送请求
# 如果数据用data变量来接收会报错。
response = requests.post(url=url, json=data, headers=headers)
print(response)  # <Response [200]>
# print(response.text)# 将python对象转换为json字符串(格式化返回数据)
result = json.dumps(response.json(), indent=2, ensure_ascii=False)
# print(type(result))  # 字符串类型
print(result)"""
返回结果:
{"args": {},"data": "\"<sites><site><name>\\u83dc\\u9e1f\\u6559\\u7a0b</name><url>www.runoob.com</url></site><site><name>Google</name><url>www.google.com</url></site></sites>\"","files": {},"form": {},"headers": {"Accept": "*/*","Accept-Encoding": "gzip, deflate","Content-Length": "149",**************************主要看这里"Content-Type": "text/xml",**************************"Host": "httpbin.org","User-Agent": "python-requests/2.18.4","X-Amzn-Trace-Id": "Root=1-5ff40fa5-21a79b532b1ccf6d20173fd7"},**************************主要看这里"json": "<sites><site><name>菜鸟教程</name><url>www.runoob.com</url></site><site><name>Google</name><url>www.google.com</url></site></sites>",**************************"origin": "106.35.9.12","url": "http://httpbin.org/post"
}
"""

说明:

  • text/xml格式相对用的少。
  • xml也可以作为一个文件来传输。
  • 需要重新声明请求头中Content-Type属性。
  • 其他和application/json一样。

提示:其实raw格式数据可以上传text、json、xml、html等纯字符的文本。

3、正文是binary

使用binary格式的正文发送POST请求,是直接使用二进制流进行数据传输,多用于上传单个图片或图片。

也可以用于把请求的参数放入一个文件中,进行数据的提交。

示例如下:

"""
1.学习目标掌握requests发送post请求
2.HTTP协议中post请求参数类型x-www-form-data-urlencodedraw_json格式form-databinary
3.binary格式# 1.明确请求地址# 2.明确请求参数data = {"files":open("文件名","rb")}  字典格式# 3.发送请求requests.post(url= url,files=data)
4.需求http://httpbin.org/post
"""
# 1.导入requests
import requests# 2.请求地址
url = "http://httpbin.org/post"# 3.请求参数
# 读取文件中的数据作为参数进行提交。
# key位置要写files,是规范
# 也可以写其他的名字,不规范
data = {"files": open("test.txt", "rb")}# 4.发送请求
response = requests.post(url=url, files=data)
print(response.text)"""
请求结果如下:
{"args": {}, "data": "", **************************主要看这里"files": {"files": "username=\u5927\u5c0f\u59d0\r\npassword=test123456\r\nage=18"}, **************************"form": {}, "headers": {"Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Content-Length": "192", **************************主要看这里"Content-Type": "multipart/form-data; boundary=351e0b73ea144694a9e9fdd1e10d2486", **************************"Host": "httpbin.org", "User-Agent": "python-requests/2.18.4", "X-Amzn-Trace-Id": "Root=1-5ff499ea-7ad42c4e6f056b44347b3c26"}, "json": null, "origin": "106.35.9.12", "url": "http://httpbin.org/post"
}
"""

说明:

  • 发送的请求中,files属性接收了参数。
  • 在请求头中,Content-Type属性为multipart/form-data
  • 使用application/json格式发送数据,requests.post(url=url, files=data)方法中一定要使用files变量来接收参数。
  • 换句话说Requests也支持发送binary数据形式的POST请求,只需将文件传给requests.post()方法的files参数即可。

4、multipart/form-data

multipart/form-data数据格式的POST请求,多用于文件上传。

示例1:

"""
1.学习目标掌握requests发送post请求
2.HTTP协议中post请求参数类型x-www-form-data-urlencodedraw_json格式form-databinary
3.form-data格式使用files变量来接收数据,默认是使用form-data格式发送POST请求。
4.需求http://httpbin.org/post
"""import requestsfiles = {'file1': open('logo.png', 'rb')}
response = requests.post('http://127.0.0.1:9999/post', files=files)
print(response.text)"""
接口返回结果:
{"args": {}, "data": "", **************************主要看这里"files": {"file1": "data:application/octet-stream;base64,/9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAgGBgcGBQgHerOCtwJPHpvQjoYqxmHighE/wO1YuuATgOKt9wGMd653WXlhe2xbcpauJjePjQYuZTOOk032eaYj+GgOQ+E1QCBj4UxtunNUFIjBmm5P05oBjLv99qoKgEpW9PSu1b0tAglXYOr2/uN4rtp6ZZay53n81IAlauN/pRH/2Q=="}, **************************"form": {}, "headers": {"Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Connection": "keep-alive", "Content-Length": "394145", **************************主要看这里"Content-Type": "multipart/form-data; boundary=4efea05a2cf34e78a75508a1ebf000ec", **************************"Host": "127.0.0.1:9999", "User-Agent": "python-requests/2.18.4"}, "json": null, "origin": "127.0.0.1", "url": "http://127.0.0.1:9999/post"
}
"""

示例2:

我们也可以显式地设置文件名,文件类型和请求头:

import requests
# hangge.png 为图片名称
files = {'file1': ('hangge.png', open('logo.png', 'rb'), 'image/png', {'Expires': '0'})}
response = requests.post('http://127.0.0.1:9999/post', files=files)
print(response.text)"""
接口返回结果:
{"args": {}, "data": "", **************************主要看这里"files": {"file1": "data:image/png;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyacMkc0Yyc0UAf/Z"}, **************************"form": {}, "headers": {"Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Connection": "keep-alive", "Content-Length": "7063", **************************主要看这里"Content-Type": "multipart/form-data; boundary=382e06cba6834118a1f1efd0ea2c45e3", **************************"Host": "127.0.0.1:9999", "User-Agent": "python-requests/2.18.4"}, "json": null, "origin": "127.0.0.1", "url": "http://127.0.0.1:9999/post"
}"""

示例3:多文件上传

有时我们需要在一个请求中同时发送多个文件,同样使用 files 参数传入一个数组即可:

import requests
files = [('file1', ('1.png', open('logo.png', 'rb'), 'image/png')),('file2', ('2.png', open('logo.png', 'rb'), 'image/png'))
]
response = requests.post('http://127.0.0.1:9999/post', files=files)
print(response.text)"""
接口返回结果:
{"args": {}, "data": "", **************************主要看这里"files": {"file1": "data:image/png;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgc3p8zdacMkc0Yyc0UAf/Z", "file2": "data:image/png;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgc3p8zdacMkc0Yyc0UAf/Z"}, **************************"form": {}, "headers": {"Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Connection": "keep-alive", "Content-Length": "14054", **************************主要看这里"Content-Type": "multipart/form-data; boundary=ba662835a2364b069c99ba3ffa56b974", **************************"Host": "127.0.0.1:9999", "User-Agent": "python-requests/2.18.4"}, "json": null, "origin": "127.0.0.1", "url": "http://127.0.0.1:9999/post"
}"""

示例4:上传时附带其它参数

如果我们需要在上传文件的同时传递一些其它参数,也是可以的:

import requestsdata = {"name": "ABC.com","age": 100
}
files = [('file1', ('1.png', open('logo.png', 'rb'), 'image/png')),('file2', ('2.png', open('logo.png', 'rb'), 'image/png'))
]
response = requests.post('http://127.0.0.1:9999/post', data=data, files=files)
print(response.text)"""
接口返回结果:
{"args": {}, "data": "", **************************主要看这里"files": {"file1": "data:image/png;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDA0Yyc0UAf/Z", "file2": "data:image/png;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDA0Yyc0UAf/Z"}, "form": {"age": "100", "name": "ABC.com"}, **************************"headers": {"Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Connection": "keep-alive", "Content-Length": "14233", **************************主要看这里"Content-Type": "multipart/form-data; boundary=6bdedbde2b48465683ef4e3451f7e015", **************************"Host": "127.0.0.1:9999", "User-Agent": "python-requests/2.18.4"}, "json": null, "origin": "127.0.0.1", "url": "http://127.0.0.1:9999/post"
}
"""

示例5:流式上传文件

  • 有时我们需要上传一个非常大的文件(比如 1G 左右),如果像上面的方式直接使用 Requests 提交,可能会造成内存不足而崩溃。

  • 所以发送大文件时还是建议将请求做成数据流。不过默认下 Requests 不支持流式上传,但有个第三方包 requests-toolbelt 是支持的(本质还是 multipart/form-data 上传)

  • 在使用 requests-toolbelt 之前,我们首先通过 pip 进行安装:

# cmd命令行终端执行如下命令。
pip install requests-toolbelt

练习如下:

"""
1.学习目标掌握requests发送post请求
2.HTTP协议中post请求参数类型x-www-form-data-urlencodedraw_json格式form-databinary
3.form-data格式# 1.导入requests库,requests_toolbelt库# 2.明确请求地址# 3.明确请求参数data = {}  字典格式对请求参数加工(实例化)m = MultipartEncoder(fields = data)# 4.添加请求头headers = {"Content_Type":m.content_type}# 5.发送请求requests.post(url= url,data=m,headers=headers)
4.需求http://httpbin.org/post
"""
# 1.导入requests库
import requests
from requests_toolbelt import MultipartEncoder
# from requests_toolbelt.multipart.encoder import MultipartEncoder# 2.明确请求地址
url = "http://httpbin.org/post"
# 3.明确请求参数
data = {"username": "Jerry","password": "1232456","sex": "男"
}# requests-toolbelt 还提供了个监视器(MultipartEncoderMonitor),
# 该监视器接受一个回调函数,我们可以在回调中实时跟踪进度。
# from requests_toolbelt import MultipartEncoderMonitor
# def my_callback(monitor):
#     progress = (monitor.bytes_read / monitor.len) * 100
#     print("\r 文件上传进度:%d%%(%d/%d)"
#           % (progress, monitor.bytes_read, monitor.len), end=" ")# m = MultipartEncoder(
#     fields={'name': 'ABC.com', "age": '100',
#             'file1': ('1.png', open('logo.png', 'rb'), 'image/png'),
#             'file2': ('2.png', open('logo.png', 'rb'), 'image/png')}
# )# 4.添加请求头和加工请求参数
# 加工请求参数----让每个参数都要带有边界
m = MultipartEncoder(fields=data)# 添加请求头
headers = {"Content_Type": m.content_type}# 4.发送请求
response = requests.post(url=url, data=m, headers=headers)
print(response.text)"""
请求结果:{"args": {}, "data": "", "files": {}, **************************主要看这里"form": {    "username": "Jerry","password": "1232456","sex": "男"}, **************************"headers": {"Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Content-Length": "192", **************************主要看这里"Content-Type": "multipart/form-data; boundary=351e0b73ea144694a9e9fdd1e10d2486", **************************"Host": "httpbin.org", "User-Agent": "python-requests/2.18.4", "X-Amzn-Trace-Id": "Root=1-5ff499ea-7ad42c4e6f056b44347b3c26"}, "json": null, "origin": "106.35.9.12", "url": "http://httpbin.org/post"
}
"""

5、总结Binary和Form-data区别

主要区别在于:

  • Binary只可以上传二进制数据,通常用来上传文件,由于没有键值,所以一次只能上传一个文件,而Form-data可以传多个。

  • Form-data既可以上传文件等二进制数据,也可以上传表单键值对。利用key-value对,可以分别对每个文件进行描述。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/225991.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

dcoker-compose一键部署EFAK —— 筑梦之路

简介 EFAK&#xff08;Eagle For Apache Kafka&#xff0c;以前称为 Kafka Eagle&#xff09;是一款由国内公司开源的Kafka集群监控系统&#xff0c;可以用来监视kafka集群的broker状态、Topic信息、IO、内存、consumer线程、偏移量等信息&#xff0c;并进行可视化图表展示。独…

Arduino中以太网Udp通信

目录 1、测试硬件 2、程序 &#xff08;0&#xff09;头文件添加 &#xff08;1&#xff09;变量定义 &#xff08;2&#xff09;初始化程序 &#xff08;3&#xff09;循环执行程序 3、程序下载 &#xff08;1&#xff09;开发板控制器和端口号选择 &#xff08;2&am…

pycharm某个xxx.sh文件显示问号,无法编辑

文章目录 pycharm某个xxx.sh文件显示问号,无法编辑其他参考 pycharm某个xxx.sh文件显示问号,无法编辑 问题描述&#xff1a;pycharm某个xxx.sh文件显示问号,无法编辑 问题分析&#xff1a; pycharm无法识别文件类型。 问题解决&#xff1a; 在pycharm中选中该文件&#xff0…

BugKu-Web-滑稽

题目环境 持续的动态图片 F12审查元素 拿下flag&#xff1a;flag{595d994a34342417bfc3a3c3a23e0a48}

synchronized关键字的使用和原理

synchronized关键字的使用和原理 synchronized&#xff1a;对象锁&#xff0c;保证了临界区内代码的原子性&#xff0c;采用互斥的方式让同一时刻至多只有一个线程能持有对象锁&#xff0c;其它线程获取这个对象锁时会阻塞&#xff0c;保证拥有锁的线程可以安全的执行临界区内…

【Android】MVC与MVP的区别,MVP网络请求实践

一、MVC模式 目录 一、MVC模式二、MVP模式 1、MVP的简单应用 1.1 导入相关依赖包并设置权限1.2 实现Model1.2 实现Presenter1.3 实现View1.4分析项目结构和绑定过程1.5效果展示 2、MVP结合RxJava 一、MVC模式 MVC&#xff08;Model(模型)——View(视图)——Controller(控制…

设计模式-状态(State)模式

目录 开发过程中的一些场景 状态模式的简单介绍 状态模式UML类图 类图讲解 适用场景 Java中的例子 案例讲解 什么是状态机 如何实现状态机 SpringBoot状态自动机 优点 缺点 与其他模式的区别 小结 开发过程中的一些场景 我们在平时的开发过程中&#xff0c;经常会…

【Android】在Android上使用mlKit构建人脸检测程序

在Android上构建人脸检测程序 目录 1、导入mlKit依赖包2、配置人脸检测器并且获取人脸检测器3、加载图片资源4、调用人脸检测器5、绘制矩形边框6、完整代码7、效果展示 1、导入mlKit依赖包 dependencies {// ...// Use this dependency to bundle the model with your appi…

CSS盒子的浮动与网页布局(重点,有电影页面案例)

浮动适用于那种盒子的并列布局 CSS 提供了三种传统布局方式(简单说,就是盒子如何进行排列顺序)&#xff1a;  普通流&#xff08;标准流&#xff09;  浮动  定位 标准流&#xff08;普通流/文档流&#xff09; 所谓的标准流: 就是标签按照规定好默认方式排列. 1. 块级…

abap 如何debug 更新进程

今天在测试环境做一个外向交货单过账的时候&#xff0c;每次都会dump ST22中看到报错如下&#xff1a;DBSQL_DUPLICATE_KEY_ERROR 接着我就去SM13去看下在哪个跟新里面失败了 双击错误条目可以看到 那么我就想说去debug看看当时的变量到底是啥&#xff0c;为啥会主键重复&…

数据库的三大范式

第一范式&#xff1a; 属性不可分割&#xff1a;每个属性都是不可分割的原子项&#xff08;实体的属性就是表中的列&#xff09; 在上表中contact应该分为phone和adress两列 第二范式&#xff1a; 在满足第一范式的情况下&#xff0c;表中不存在部分依赖&#xff0c;非主键列…

压缩包文件暴力破解 -Server2005(解析)

任务五十一: 压缩包文件暴力破解 任务环境说明:Server2005 1. 通过本地PC中渗透测试平台Kali使用Nmap扫描目标靶机服务版本信息,将 Telnet 版本信息字符串 作为 Flag 提交; flag:Microsoft Windows XP telnetd 2. 通过本地PC中渗透测试平台Kali对服务器场景Windows进行渗透测…

云演CTF Blog

1、啥也搞不了&#xff0c;扫目录。出来个console 2、有显示锁掉了 3、抓包&#xff0c;改返回包 改成true&#xff0c;放包 不好意思&#xff0c;不会了&#xff0c;哈哈哈哈哈哈哈哈哈 你会的话&#xff0c;请告诉我&#xff0c;大佬

C++:命名空间

从今天正式开始对C的学习&#xff0c;这里只学习C对C的拓展&#xff0c;和C相同的部分在C语言专栏中都可以找到&#xff0c;我们先看一段C代码 #include<iostream> using namespace std; int main() {cout<<"hello world<<endl;return 0; } 同样也是打…

数学公式推导中 “:=“和“:=“的区别

A:B 将A定义为&#xff08;记为&#xff0c;令为&#xff09;B A:B 将B定义为&#xff08;记为&#xff0c;令为&#xff09;A

YOLOv8-Seg改进:轻量化卷积设计 | DualConv双卷积魔改v8结构

🚀🚀🚀本文改进: DualConv双卷积魔改v8结构,达到轻量化的同时并能够实现小幅涨点 🚀🚀🚀YOLOv8-seg创新专栏:http://t.csdnimg.cn/KLSdv 学姐带你学习YOLOv8,从入门到创新,轻轻松松搞定科研; 1)手把手教你如何训练YOLOv8-seg; 2)模型创新,提升分割性能…

​【EI会议征稿中】#先投稿,先送审#第三届网络安全、人工智能与数字经济国际学术会议(CSAIDE 2024)​

#先投稿&#xff0c;先送审# 第三届网络安全、人工智能与数字经济国际学术会议&#xff08;CSAIDE 2024&#xff09; 2024 3rd International Conference on Cyber Security, Artificial Intelligence and Digital Economy 2024年3月1日-3日 | 中国南京 会议官网&#xff1a…

漏刻有时数据可视化Echarts组件开发(45)机场流程导航线和指示点的开发记录

路径线 ECharts中的路径线是指用于连接起点和终点的线。在ECharts中&#xff0c;路径图主要用于带有起点和终点信息的线数据的绘制&#xff0c;如地图上的航班、路线等。路径线可以用于展示数据点之间的连接关系&#xff0c;以及数据点之间的相对位置。 {//路径图name: 路线图…

Mr. Cappuccino的第65杯咖啡——MacOS安装Docker

MacOS安装Docker 下载Docker安装Docker查看Docker相关信息镜像加速 下载Docker Docker官网 Docker文档中心 Docker桌面版下载地址 安装Docker 查看Docker相关信息 docker --versiondocker info镜像加速 阿里云镜像加速器 "registry-mirrors": ["https://gq8…

SpringBoot 源码解析2:启动流程1

SpringBoot 源码解析2&#xff1a;启动流程1 1.启动方式2.SpringBootApplication3.SpringApplication3.1 构造器SpringApplication3.2 SpringApplication#run 3.3 SpringApplication#run 中关键方法3.1 SpringApplication#prepareEnvironment3.2 SpringApplication#prepareCont…