在 Django 中为来自客户端的请求和来自服务器的响应(REST API)压缩 JSON 有效负载。

     2023-02-15     70

关键词:

【中文标题】在 Django 中为来自客户端的请求和来自服务器的响应(REST API)压缩 JSON 有效负载。【英文标题】:Compress JSON payload in Django for both request from client and response from server (REST API). 【发布时间】:2015-07-17 21:24:22 【问题描述】:

我想知道是否有一种方法可以压缩我每次都必须发送的带有许多重复字段名称的 JSON 有效负载。虽然this question 只是关于压缩响应,但我也想知道如何压缩来自客户端(可能是移动应用程序)的 JSON 有效负载。另外,我想知道如何在客户端和服务器端将压缩的 JSON 文件转换回其原始结构。

我们将不胜感激。

我将djangorestframework==2.4.4Django==1.7.7 一起用于API。

【问题讨论】:

使用较短的 JSON 属性名称? 【参考方案1】:

从客户端不同的工具可能会以不同的方式完成它。基于python-requests 的客户端的简单实现在this post 中完成。

但至于解压缩,我认为最好在 webserver 级别完成,就像您为响应压缩所做的一样。 Nginx 似乎没有内置配置,但有人在将请求传递给上游之前完成了sort of Lua 进行解压缩。

另一个 - 可能效率较低 - 解决方案是在第一个 Django 中间件中进行解压缩,如下所示:

import gzip


class SimpleMiddleware:
    def __init__(self, get_response):
       self.get_response = get_response

    def __call__(self, request):

        # check the headers if you are writing a versatile API
        # decompress the request body
        request._body = gzip.decompress(request.body)
        # fill the request stream in case you're using something like django-rest-framework
        request._stream = BytesIO(request.body)

        response = self.get_response(request)

        return response

此外,您必须将中间件配置为第一个中间件:

# in Django settings

MIDDLEWARE = [
    'python path to our new custom middleware',
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

以下是参考资料:

    *** post on how to send gzipped reqeusts, Python 3 gzip documentation, Server fault thread on request body decompression, Django middleware reference。

【讨论】:

无法解码来自客户端的握手请求

...on3套接字与JavaScriptWebSocket连接。我正在localhost:8080上测试服务器代码,并与Chrome(94.0)连接。WebSocket客户端和套接字服务器做建立连接。但是,如果服务器不遵循协议并响应握手,则连 查看详情

如何区分来自联合和客户端的解析器调用?

...提供特定的指标,并且与联邦分开。是否可以在被请求的服务器中区分它并解 查看详情

如何在 ASP.NET Core 5.0 中处理来自客户端的双重请求?

...时间】:2021-12-1309:13:22【问题描述】:客户端应用程序对服务器上的单个资源进行双重查询。第一帧没有授权头,第二帧有。不幸的是,在读取第一帧之后,服务器没有得到第二帧。在ASP.NETCORE5服务器上如何处理?测试端点。当... 查看详情

为啥 ZeroMQ 服务器没有收到来自客户端的任何请求?

】为啥ZeroMQ服务器没有收到来自客户端的任何请求?【英文标题】:WhyaZeroMQServerdoesnotreceiveanyrequestsfromClient?为什么ZeroMQ服务器没有收到来自客户端的任何请求?【发布时间】:2020-05-0720:37:56【问题描述】:我在MQL4(类似c++的语... 查看详情

如何为来自 Flex/Air 客户端的异步请求创建 Web 服务器?

】如何为来自Flex/Air客户端的异步请求创建Web服务器?【英文标题】:HowtocreateaWebServerforasynchronousrequestfromaFlex/Airclient?【发布时间】:2009-12-2111:05:24【问题描述】:我使用FlexBuilder创建了一个客户端,该客户端可以在浏览器中运... 查看详情

延迟来自客户端的并发请求,直到创建 HttpSession

】延迟来自客户端的并发请求,直到创建HttpSession【英文标题】:DelayconcurrentrequestsfromaclientuntilHttpSessioniscreated【发布时间】:2012-07-2920:28:02【问题描述】:我有一个servlet.Filter实现,它在数据库表中查找客户端的用户ID(基于IP... 查看详情

Spring RSocket Kubernetes 服务器 - 侧车转换来自客户端的 http 请求?

】SpringRSocketKubernetes服务器-侧车转换来自客户端的http请求?【英文标题】:SpringRSocketKubernetesserver-Sidecartoconverthttprequestsfromclient?【发布时间】:2021-11-0708:33:21【问题描述】:关于如何将http请求转换为RSocket的小问题。服务器设置... 查看详情

使用来自 PHP 客户端的 PUT 请求向 iCal 添加新事件?

】使用来自PHP客户端的PUT请求向iCal添加新事件?【英文标题】:AddingneweventstoiCalwithPUTrequestfromPHPclient?【发布时间】:2012-05-2713:49:47【问题描述】:我正在尝试将PHP编写的日历与KerioConnect日历(iCal)同步。我在连接日历和获取事... 查看详情

来自 Qt5 中 http 客户端的 Post 方法

...问题描述】:我有一个小问题,我将在qt5.1.0中为连接http服务器制作一个客户端程序,我通过post方法在json文件中发送请愿书,它们工作的主要方法的代码如下:voidHttpClient::sendJsonDocument(constQStringtypeId,co 查看详情

java示例代码_编写一个UDP服务器,为来自不同客户端的n个并发请求提供服务

java示例代码_编写一个UDP服务器,为来自不同客户端的n个并发请求提供服务 查看详情

WebSocket 来自客户端的位置

...ide【发布时间】:2016-07-2909:59:57【问题描述】:我已经在服务器端和客户端之间进行了套接字通信。但是WebSocket的实体是从哪里来的呢?客户端代码:var_ws=newWebSocket(...);那应该是从某个地方传来的?我的意思是浏览器知道标签... 查看详情

如何取消或停止来自客户端的推送通知?

...:07【问题描述】:我有一个向客户端发送推送通知的网络服务器。客户端可以在iOS10上拦截UNNotificationServiceExtension的推送通知并更改内容。现在我想取消在某些通知上显示在客户端的推送通知。我怎么做?我试着做self.c 查看详情

在 socket.io 中控制来自客户端的心跳超时

...012-09-3016:21:26【问题描述】:我有移动客户端连接到node.js服务器,通过xhr-polling运行socket.io。我有两种类型的客户:A型当连接由于网络问题(或客户端崩溃)默认心跳超时时间过长B型当这个客户端的连接中断时,我需要 查看详情

如何调试来自 ReactJs(另一个项目)客户端的 Laravel API 请求?

】如何调试来自ReactJs(另一个项目)客户端的LaravelAPI请求?【英文标题】:HowtodebugLaravelAPIrequestfromReactJs(AnotherProject)client?【发布时间】:2020-06-0111:29:11【问题描述】:我有两个项目,一个是由reactjs开发的,另一个是由laravel开... 查看详情

来自 C# 客户端的多部分表单

】来自C#客户端的多部分表单【英文标题】:MultipartformsfromC#client【发布时间】:2010-09-1804:52:06【问题描述】:我正在尝试从C#客户端(Outlook插件)在php应用程序中填写表单。我使用Fiddler从php应用程序中查看原始请求,并且表单... 查看详情

docker基本架构

...C/S架构,包括客户端和服务端。Dockerdaemon作为服务端接受来自客户的请求,并处理这些请求(创建、运行、分发容器)。客户端和服务端既可以运行在一个机器上,也可通过socket或者RESTfulAPI来进行通信。 Dockerdaemon一般在宿... 查看详情

select总结(代码片段)

...端的请求和向客户端做出响应的程序。??Servlet是运行在Web服务器或应用服务器上的java程序,它是作为来自Web浏览器或其他HTTP客户端的请求和HTTP服务器上的数据库或应用程序之间的中间层。使用Servlet,您可以收集来自网页表单... 查看详情

来自客户端的 Spring Boot ExceptionHandler 捕获

...xceptionHandler来捕获带有@RestControllerAdvice注释的所有异常。服务器端捕获异常没有问题。但是,我不知道如何在客户端应用程序中捕获 查看详情