How to compress URL parameters

后端 未结 12 1504
孤城傲影
孤城傲影 2020-12-04 11:16

Say I have a single-page application that uses a third party API for content. The app’s logic is in-browser only, and there is no backend I can write to.

To allow de

12条回答
  •  臣服心动
    2020-12-04 11:34

    Why not using protocol-buffers?

    Protocol buffers are a flexible, efficient, automated mechanism for serializing structured data – think XML, but smaller, faster, and simpler. You define how you want your data to be structured once, then you can use special generated source code to easily write and read your structured data to and from a variety of data streams and using a variety of languages. You can even update your data structure without breaking deployed programs that are compiled against the "old" format.

    ProtoBuf.js converts objects to protocol buffer messages and vice vera.

    The following object converts to: CgFhCgFiCgFjEgFkEgFlEgFmGgFnGgFoGgFpIgNqZ2I=

    {
        repos : ['a', 'b', 'c'],
        labels: ['d', 'e', 'f'],
        milestones : ['g', 'h', 'i'],
        username : 'jgb'
    }
    

    Example

    The following example is built using require.js. Give it a try on this jsfiddle.

    require.config({
        paths : {
            'Math/Long'  : '//rawgithub.com/dcodeIO/Long.js/master/Long.min',
            'ByteBuffer' : '//rawgithub.com/dcodeIO/ByteBuffer.js/master/ByteBuffer.min',
            'ProtoBuf'   : '//rawgithub.com/dcodeIO/ProtoBuf.js/master/ProtoBuf.min'
        }
    })
    
    require(['message'], function(message) {
        var data = {
            repos : ['a', 'b', 'c'],
            labels: ['d', 'e', 'f'],
            milestones : ['g', 'h', 'i'],
            username : 'jgb'
        }
    
        var request = new message.arguments(data);
    
        // Convert request data to base64
        var base64String = request.toBase64();
        console.log(base64String);
    
        // Convert base64 back
        var decodedRequest = message.arguments.decode64(base64String);
        console.log(decodedRequest);
    });
    
    // Protobuf message definition
    // Message definition could also be stored in a .proto definition file
    // See: https://github.com/dcodeIO/ProtoBuf.js/wiki
    define('message', ['ProtoBuf'], function(ProtoBuf) {
        var proto = {
            package : 'message',
            messages : [
                {
                    name : 'arguments',
                    fields : [
                        {
                            rule : 'repeated',
                            type : 'string',
                            name : 'repos',
                            id : 1
                        },
                        {
                            rule : 'repeated',
                            type : 'string',
                            name : 'labels',
                            id : 2
                        },
                        {
                            rule : 'repeated',
                            type : 'string',
                            name : 'milestones',
                            id : 3
                        },
                        {
                            rule : 'required',
                            type : 'string',
                            name : 'username',
                            id : 4
                        },
                        {
                            rule : 'optional',
                            type : 'bool',
                            name : 'with_comments',
                            id : 5
                        },
                        {
                            rule : 'optional',
                            type : 'bool',
                            name : 'without_comments',
                            id : 6
                        }
                    ],
                }
            ]
        };
    
        return ProtoBuf.loadJson(proto).build('message')
    });
    

提交回复
热议问题