http - 压缩 1200-1500 个字符的 URL 的有效方法是什么?

标签 http web compression

<分区>

我在这个问题上有很多问题。 我必须压缩没有静态架构的 URI,然后很难做这样的事情:

repos=aaa,bbb,ccc&
labels=ddd,eee,fff&
milestones=ggg,hhh,iii&
username=kkk&
show_open=0&
show_closed=1&
show_commented=1&
show_uncommented=0

摘录:

aaa,bbb,ccc|ddd,eee,fff|ggg,hhh,iii|kkk|0110

请求是以 GraphQL 方式进行的,因此我们发送结构并获得该结构的答案。目前我们使用的压缩只是改变所有请求中的一些措辞(功能:是 f:, ..)。 我们想做一个通用的压缩,而不是如果架构发生变化我们必须维护的东西(在下面的例子中我们不想将 quizz.campaign 更改为每个例子的#12)。我们每次连接都会执行这种请求一到两次,所以什么是最昂贵的在连接上下载一个库,这会将我的请求从 1500 个字符压缩到大约 300 个字符 做一些通用的压缩,例如将 [ 更改为 ( 这将从 1500 压缩到 900。

通用压缩看起来像这样:

str.replace(/\*/g, "%#111")
        .replace(/\!/g, "%#222")
        .replace(/\(/g, "%#333")
        .replace(/\)/g, "%#444")
        .replace(/\~/g, "%#555")
        .replace(/\_/g, "%#666")
        .replace(/\'/g, "%#777")
        .replace(/\,/g, "*")
        .replace(/\:/g, "!")
        .replace(/\[/g, "(")
        .replace(/\]/g, ")")
        .replace(/\{/g, "~")
        .replace(/\}/g, "_")
        .replace(/\"/g, "'")
        .replace(/\%#111/g, ",")
        .replace(/\%#222/g, ":")
        .replace(/\%#333/g, "[")
        .replace(/\%#444/g, "]")
        .replace(/\%#555/g, "{")
        .replace(/\%#666/g, "}")
        .replace(/\%#777/g, '"');

请求的 json 格式如下:

    [{
    "f": "find-qzc-by-id",
    "k": "qzcpn",
    "a": {
        "quizz.campaign/id": "quizz-kdfjdslk"
    },
    "n": [{
        "f": "quizz.campaign/activeQuizzQuestions",
        "k": "quizz.campaign/activeQuizzQuestions",
        "n": ["fanQuestion/id", "fanQuestion/questionText", "fanQuestion/questionType", {
            "f": "fanQuestion/choices",
            "k": "fanQuestion/choices",
            "n": ["quizz.question.choice/bgImg", "fanQuestion.choice/id", "fanQuestion.choice/adminLabel", "fanQuestion.choice/text"]
        }, "bs.model/scid", "bs.model/uiConfig"]
    }, "quizz.campaign/id", "quizz.campaign/gameLogic", "quizz.campaign/quizzConfig", "quizz.campaign/bgImg", "quizz.campaign/previewImage", "quizz.campaign/title", "quizz.campaign/description", "campaign/publicOrganizerName", {
        "f": "campaign/organization",
        "k": "campaign/organization",
        "n": ["org/id"]
    }, "campaign/bsCpnType", "bs.model/scid", "bs.model/uiConfig", "bs.model/bsCustomContent", "bs.time/created", "bs.model/nl"]
}]

然后编码请求看起来像这样:

?q=%5B%7B%22f%22%3A%22find-qzc-by-id%22%2C%22k%22%3A%22qzcpn%22%2C%22a%22%3A%7B%22quizz.campaign%2Fid%22%3A%22quizz-kdfjdslk%22%7D%2C%22n%22%3A%5B%7B%22f%22%3A%22quizz.campaign%2FactiveQuizzQuestions%22%2C%22k%22%3A%22quizz.campaign%2FactiveQuizzQuestions%22%2C%22n%22%3A%5B%22fanQuestion%2Fid%22%2C%22fanQuestion%2FquestionText%22%2C%22fanQuestion%2FquestionType%22%2C%7B%22f%22%3A%22fanQuestion%2Fchoices%22%2C%22k%22%3A%22fanQuestion%2Fchoices%22%2C%22n%22%3A%5B%22quizz.question.choice%2FbgImg%22%2C%22fanQuestion.choice%2Fid%22%2C%22fanQuestion.choice%2FadminLabel%22%2C%22fanQuestion.choice%2Ftext%22%5D%7D%2C%22bs.model%2Fscid%22%2C%22bs.model%2FuiConfig%22%5D%7D%2C%22quizz.campaign%2Fid%22%2C%22quizz.campaign%2FgameLogic%22%2C%22quizz.campaign%2FquizzConfig%22%2C%22quizz.campaign%2FbgImg%22%2C%22quizz.campaign%2FpreviewImage%22%2C%22quizz.campaign%2Ftitle%22%2C%22quizz.campaign%2Fdescription%22%2C%22campaign%2FpublicOrganizerName%22%2C%7B%22f%22%3A%22campaign%2Forganization%22%2C%22k%22%3A%22campaign%2Forganization%22%2C%22n%22%3A%5B%22org%2Fid%22%5D%7D%2C%22campaign%2FbsCpnType%22%2C%22bs.model%2Fscid%22%2C%22bs.model%2FuiConfig%22%2C%22bs.model%2FbsCustomContent%22%2C%22bs.time%2Fcreated%22%2C%22bs.model%2Fnl%22%5D%7D%5D

如果您认为库是解决成本问题的更好方法,您是否有一些关于在 js 中压缩和在 jvm 上解压缩的建议?谢谢。

最佳答案

简单地使用 POST 不需要 OPTION 请求,检查 https://stackoverflow.com/a/27924344/158037

如果您真的想使用压缩,则不必在 JS 中执行。 对于启用 deflate 压缩(“Accept-Encoding: deflate”、gzip 或 br)的方向“服务器 -> 浏览器”应该足够了,不需要对代码进行任何更改,也许只需在服务器配置(apache、tomcat 等)中启用它你用)。

对于“浏览器->服务器”和实际使用使用 HTTP 2.0 的查询字符串将是最简单的解决方案,因为它压缩了所有 header ,包括“路径:”。

关于http - 压缩 1200-1500 个字符的 URL 的有效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48517330/

相关文章:

php - 如何使用 PHP 获取上一个 url

linux - 使用尽可能少的资源,模拟挂起的 Web 应用程序的最佳方法是什么?

iphone - iPhone 和 Xcode 4 的压缩/解压库

php - 流膨胀包装器?

compression - Hadoop,如何压缩映射器输出而不是缩减器输出

指示代理不支持 CONNECT 的 HTTP 状态代码

http - 优化与替代文本——我可以同时拥有两者吗?

python - 如何使用Python并发发送10,000个HTTP请求

html - ovh.com 上的个人网站被黑,在 html 中添加了代码

c# - 如何获取 HttpWebRequest 和 WebResponse 的字节大小?