首页 > 编程语言 >验证:web应用程序要遵循http协议

验证:web应用程序要遵循http协议

时间:2024-02-13 22:45:29浏览次数:40  
标签:web http socket sock 应用程序 print 请求 conn 客户端

 

说明

web server响应的格式必须要遵循http响应协议,否则浏览器或者其它客户端工具不能解析响应,而http请求协议已经由浏览器或者其它客户端工具帮我们封装好了。 这里我们直接通过socket写一个简单的server来演示。  

get请求

server.py

import socket
import time

# 创建TCP Socket对象;括号中的实参是默认值,可以简写为:sock = socket.socket()
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 绑定IP地址和端口号
host = '127.0.0.1'
port = 8089
sock.bind((host, port))

# 开始监听连接
sock.listen(5)
print('等待客户端连接...')

while True:
    # 接受客户端连接并返回新的Socket对象
    conn, addr = sock.accept()  # 阻塞等待客户端连接

    # print('与客户端', addr[0], '建立了连接!')

    # 接收客户端发送的请求数据,接收最多4096字节大小的请求数据,然后将其转换成UTF-8编码格式的字符串
    data = conn.recv(4096)
    # data = conn.recv(4096).decode("utf-8")
    print('接收到的请求数据为:', data)

    # 服务端返回数据
    conn.send(b'hello, qzcsbj')

    print('返回数据给客户端完成')

    # 关闭当前客户端连接
    conn.close()

  

浏览器请求后,浏览器无法解析服务器响应的内容,因为响应内容没有按照http响应协议返回。

 

服务端打印内容:

 

修改server.py返回内容,其中content-type是text/plain;charset=utf-8,是纯文本,不做解析

import socket

# 创建TCP Socket对象;括号中的实参是默认值,可以简写为:sock = socket.socket()
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 绑定IP地址和端口号
host = '127.0.0.1'
port = 8089
sock.bind((host, port))

# 开始监听连接
sock.listen(5)
print('等待客户端连接...')

while True:
    # 接受客户端连接并返回新的Socket对象
    conn, addr = sock.accept()  # 阻塞等待客户端连接

    # print('与客户端', addr[0], '建立了连接!')

    # 接收客户端发送的请求数据,接收最多4096字节大小的请求数据,然后将其转换成UTF-8编码格式的字符串
    data = conn.recv(4096)
    # data = conn.recv(4096).decode("utf-8")
    print('接收到的请求数据为:', data)

    # 服务端返回数据
    conn.send('HTTP/1.1 200 ok\r\nserver:qzcsbj\r\ncontent-type:text/plain;charset=utf-8\r\n\r\n<h1>hello, 韧</h1>'.encode("utf-8"))

    print('返回数据给客户端完成')

    # 关闭当前客户端连接
    conn.close()

  

浏览器请求结果:

 

F12中可以看到响应头和响应体

服务端打印内容:

 

server.py中,content-type是text/html;charset=utf-8,是html,按html解析

import socket

# 创建TCP Socket对象;括号中的实参是默认值,可以简写为:sock = socket.socket()
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 绑定IP地址和端口号
host = '127.0.0.1'
port = 8089
sock.bind((host, port))

# 开始监听连接
sock.listen(5)
print('等待客户端连接...')

while True:
    # 接受客户端连接并返回新的Socket对象
    conn, addr = sock.accept()  # 阻塞等待客户端连接

    # print('与客户端', addr[0], '建立了连接!')

    # 接收客户端发送的请求数据,接收最多4096字节大小的请求数据,然后将其转换成UTF-8编码格式的字符串
    data = conn.recv(4096)
    # data = conn.recv(4096).decode("utf-8")
    print('接收到的请求数据为:', data)

    # 服务端返回数据
    conn.send('HTTP/1.1 200 ok\r\nserver:qzcsbj\r\ncontent-type:text/html;charset=utf-8\r\n\r\n<h1>hello, 韧</h1>'.encode("utf-8"))

    print('返回数据给客户端完成')

    # 关闭当前客户端连接
    conn.close()

 

浏览器请求结果:

 

服务端打印内容:

 

post请求

server.py

import socket

# 创建TCP Socket对象;括号中的实参是默认值,可以简写为:sock = socket.socket()
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 绑定IP地址和端口号
host = '127.0.0.1'
port = 8089
sock.bind((host, port))

# 开始监听连接
sock.listen(5)
print('等待客户端连接...')

while True:
    # 接受客户端连接并返回新的Socket对象
    conn, addr = sock.accept()  # 阻塞等待客户端连接

    # print('与客户端', addr[0], '建立了连接!')

    # 接收客户端发送的请求数据,接收最多4096字节大小的请求数据,然后将其转换成UTF-8编码格式的字符串
    data = conn.recv(4096)
    # data = conn.recv(4096).decode("utf-8")
    print('接收到的请求数据为:', data)

    # 服务端返回数据
    conn.send('HTTP/1.1 200 ok\r\nserver:qzcsbj\r\ncontent-type:application/json\r\n\r\n{"code":0,"message":"success","data":{"id":"1","name":"韧"}'.encode("utf-8"))

    print('返回数据给客户端完成')

    # 关闭当前客户端连接
    conn.close()

 

入参格式:application/x-www-form-urlencoded

请求

 

服务端打印内容:

 

工具中请求头

 

工具中请求体

 

响应头

 

响应体

 

入参格式:application/json

请求头

 

请求

 

服务端打印内容:

 

工具中请求头

 

工具中请求体

 

响应头

 

响应体

 

补充:如果请求数据包含中文

jmeter中要指定内容编码

 

代码中接收客户端请求数据,要打印查看,需要decode

import socket

# 创建TCP Socket对象;括号中的实参是默认值,可以简写为:sock = socket.socket()
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 绑定IP地址和端口号
host = '127.0.0.1'
port = 8089
sock.bind((host, port))

# 开始监听连接
sock.listen(5)
print('等待客户端连接...')

while True:
    # 接受客户端连接并返回新的Socket对象
    conn, addr = sock.accept()  # 阻塞等待客户端连接

    # print('与客户端', addr[0], '建立了连接!')

    # 接收客户端发送的请求数据,接收最多4096字节大小的请求数据,然后将其转换成UTF-8编码格式的字符串
    # data = conn.recv(4096)
    data = conn.recv(4096).decode("utf-8")
    print('接收到的请求数据为:', data)

    # 服务端返回数据
    conn.send('HTTP/1.1 200 ok\r\nserver:qzcsbj\r\ncontent-type:application/json\r\n\r\n{"code":0,"message":"success","data":{"id":"1","name":"韧"}'.encode("utf-8"))

    print('返回数据给客户端完成')

    # 关闭当前客户端连接
    conn.close()

 

服务端打印内容:

 

标签:web,http,socket,sock,应用程序,print,请求,conn,客户端
From: https://www.cnblogs.com/uncleyong/p/18014810

相关文章

  • Blazor OIDC 单点登录授权实例5 - 独立SSR App (net8 webapp ) 端授权
    目录:OpenID与OAuth2基础知识BlazorwasmGoogle登录BlazorwasmGitee码云登录BlazorOIDC单点登录授权实例1-建立和配置IDS身份验证服务BlazorOIDC单点登录授权实例2-登录信息组件wasmBlazorOIDC单点登录授权实例3-服务端管理组件BlazorOIDC单点登录授权实......
  • [Blazor WebAssembly] 学习随笔——组件1.微信弹框(WXDialog)
    总有以下的需求:等待用户确认,就是有【确定】和【取消】按钮,有个标题和内容的弹框(比如:您确定要删除吗?)就是告知一下,就是上面的【取消】按钮不显示(比如:保存成功!)莫有按钮,几秒钟后自己消失,就是所谓的toast(比如:已完成)莫有按钮,需要发送命令才能消息(比如:数据加载中)一开始犯了经验主......
  • Vite+Vue根据环境配置Websocket地址
    前言上回说到,利用vite加载不同mode下的配置文件,可以实现不同运行环境下的参数配置。在前端应用中经常使用到Websocket,其地址同样可以在.env中间中配置。代码vite.config.ts代码的执行是在createApp之前,不可以在vite.config.ts中使用例如pinia、router等组件。可以使用import.me......
  • ruffle 基于webassembly 的flash player 模拟器
    ruffle基于webassembly的flashplayer模拟器包含的特性安全 基于rust以及wasm避免一些安全问题安装简单免费开源说明官方还提供了一个demo站点可以快速体验功能参考资料https://github.com/ruffle-rs/rufflehttps://ruffle.rs/https://ruffle.rs/downloads#websi......
  • 十八、Django之Http
    1、Django请求的生命周期请求响应Http1、发送Http请求请求头(包含Cookie)\r\n\r\n请求体2、服务器请求,根据请求头中的url在路由关系表中进行匹配(从上到下)3、匹配成功后,执行指定的views函数a.Url->函数==>FBVb.Url->类==>CBV4、响应内......
  • Selenium Web Driver的基本运用
    SeleniumWebDriver的基本运用目录SeleniumWebDriver的基本运用浏览器窗口的基本操作浏览器导航操作浏览器窗口操作获取浏览器信息查找页面元素按id查找按name查找按class查找按链接文本查找按链接文本模糊查找按标签类型查找按XPath查找按CSS选择器查找通过By对象按动态条件......
  • 10.使用RestSharps请求WebAPI
    1.请求类publicclassBaseRequest{///<summary>///请求法式///</summary>publicRestSharp.MethodMethod{get;set;}///<summary>///路由///</summary>publicstr......
  • extism 基于rust 开发的强大webassembly 框架
    extism基于rust开发的强大webassembly框架包含的特性使用简单 可以方便的开发基于webassembly的插件系统安全方便运行 包含了灵活的架构可以可以方便与多种语言进行通信(基本覆盖了主流的编程语言)说明目前基于webassembly的语言集成热度是越来越高了,webassembly很值......
  • SharePoint Online Framework WebPart 魔改乱用
    前言最近,经常碰到微软更新SharePointOnlineDOM的情况,然后,页面里的WebPart就乱七八糟了,思前想后,找了个解决方法可以规避这个问题,虽然有点剑走偏锋,但是大家可以看看。正文1.下面灰色的部分,是我测试用的WebPart,大家可以看到位置比较奇葩,在整个页面最下方,而不是......
  • 打包部署运行web项目:No artifacts marked for deployment
     早期的web项目是没有内置tomcat或者jetty服务器的。不像springboot内置了tomcat服务器,所以可以直接运行。早期的web项目还没有使用springboot框架,故没有内置的服务器,故需要手动拷贝到tomcat/jetty服务器下才能运行。参考:IDEA中运行Tomcat的时候报出:Noartifactsmarkedfor......