рдкреНрд░реЛрдЯреЛрдмреЙрдлрд╝ рдпрд╛ JSON рд╕рдВрд░рдЪрд┐рдд рдлреНрд░рдВрдЯ-рдПрдВрдб рд╕рдВрдЪрд╛рд░ рдкреНрд░реЛрдЯреЛрдХреЙрд▓?

рдЫрд╡рд┐

рд╣рдорд╛рд░реА рдЯреАрдо рдореЗрдВ рдирдП рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ, рд╣рдордиреЗ рдирдП рдЙрддреНрдкрд╛рдж рдХреЗ рд▓рд┐рдП рдлреНрд░рдВрдЯрдПрдВрдб рдлреНрд░реЗрдорд╡рд░реНрдХ VUE рдХреЛ рдЪреБрдирд╛, рдмреИрдХрдПрдВрдб PHP рдореЗрдВ рд▓рд┐рдЦрд╛ рд╣реИ, рдФрд░ рдЕрдм 17 рд╡рд░реНрд╖реЛрдВ рд╕реЗ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред

рдЬрдм рдХреЛрдб рдмрдврд╝рдиреЗ рд▓рдЧрд╛, рддреЛ рдореБрдЭреЗ рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде рдбреЗрдЯрд╛ рдХреЗ рдЖрджрд╛рди-рдкреНрд░рджрд╛рди рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдирд╛ рдкрдбрд╝рд╛, рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореИрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ред

рдмреИрдХрдПрдВрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ


рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛рдлреА рдмрдбрд╝реА рд╣реИ рдФрд░ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдмрд╣реБрдд рдЙрд▓рдЭрди рдореЗрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП, рдбреАрдбреАрдбреА рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рдХреЛрдб рдореЗрдВ рдХреБрдЫ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдПрдВ рдереАрдВ, рд╡реЗ рд╕рдордЧреНрд░ рд░реВрдк рд╕реЗ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдХреБрдЫ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХрддрд╛ рдХреЗ рд▓рд┐рдП рдЬрдЯрд┐рд▓ рдФрд░ рд╕реНрд╡реИрдЪреНрдЫрд┐рдХ рдереЗред

рд╕реАрдорд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ


рдЪрд╛рд░ рдорд╣реАрдиреЗ рдореЛрд░реНрдЪреЗ рдХрд╛ рд╡рд┐рдХрд╛рд╕, рд╣рдордиреЗ JSON рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рд░реНрд╡рд░ рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛, рд╣рдордиреЗ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд╕реНрдЯреЗрдЯ Vuex рдореЗрдВ рдореИрдк рдХрд┐рдпрд╛ред рд▓реЗрдХрд┐рди рд╕рд░реНрд╡рд░ рдкрд░ рд▓реМрдЯрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рд╡рд┐рдкрд░реАрдд рджрд┐рд╢рд╛ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА, рддрд╛рдХрд┐ рд╕рд░реНрд╡рд░ рдЕрдкрдиреЗ рдбреАрдЯреАрдУ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рдкрдврд╝ рдФрд░ рдореИрдк рдХрд░ рд╕рдХреЗ (рдпрд╣ рдЕрдЬреАрдм рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП :))

рд╕рдорд╕реНрдпрд╛


рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИ, рдЙрдиреНрд╣реЛрдВрдиреЗ рдЬреЛ рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИ, рд╡рд╣ рд░рд╛рдЬреНрдп рдмрдбрд╝реА рд╡рд╕реНрддреБрдУрдВ рддрдХ рдмрдврд╝ рдЧрдпрд╛ рд╣реИред рд╡реЗ рдЫреЛрдЯреЗ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рднреА рдЯреВрдЯрдиреЗ рд▓рдЧреЗ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рдЕрдкрдиреЗ рд░рд╛рдЬреНрдп, рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрди рдЖрджрд┐ рдереЗ ... рдкреНрд░рдмрдВрдзрдХреЛрдВ рд╕реЗ рдирдП рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдмрд╛рдж рдПрдкреАрдЖрдИ рдмрджрд▓рдирд╛ рд╢реБрд░реВ рд╣реЛ рдЧрдпрд╛, рдФрд░ рдпрд╣ рд╕рдм рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдирд╛ рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рдХрдард┐рди рд╣реЛ рдЧрдпрд╛, рдлрд┐рд░ рдЗрд╕реЗ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рдореИрдк рдХрд┐рдпрд╛ рдЧрдпрд╛, рдлрд┐рд░ рдЦреЗрддреЛрдВ ...

рдФрд░ рдпрд╣рд╛рдВ рд╣рдо рд╣реИрдВ рдкрд╛рд░реНрд╕рд┐рдВрдЧ, рдореИрдкрд┐рдВрдЧ, рдЖрджрд┐ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЦрддреНрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд░реНрд╡рд░ рдФрд░ рдлреНрд░рдВрдЯ рдкрд░ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ред

рдХреБрдЫ рдЦреЛрдЬ рдХреЗ рдмрд╛рдж, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рджреЛ рд╡рд┐рдХрд▓реНрдк рдЖрдП:

  1. рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдмрдлрд╝рд░реНрд╕
  2. рдлреНрд░рдВрдЯ рдХреЗ рд▓рд┐рдП рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рдЬреЗрдПрд╕ рдбреАрдЯреАрдУ рдСрдЯреЛ-рдкреАрдврд╝реА, рдЗрди рдбреАрдЯреАрдУ рдореЗрдВ рдЖрдЧреЗ JSON рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рдеред

рдкреЗрди рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдпрд╣ Google рд╕реЗ рдкреНрд░реЛрдЯреЛрдмреЙрдлрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдерд╛рдЧрдд рдерд╛ред

рдФрд░ рдпрд╣реА рдХрд╛рд░рдг рд╣реИ:

  1. рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╣реИ рдЬреЛ рдХрдИ рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдХреЗ рд▓рд┐рдП рдкреАрдПрдЪрдкреА рдФрд░ рдЬреЗрдПрд╕ рдХреЗ рд▓рд┐рдП рд╡рд░реНрдгрд┐рдд рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИред
  2. рдирд┐рд░реНрдорд┐рдд рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рд▓реЗрдЦрди рдЬрдирд░реЗрдЯрд░ рд╣реИ
  3. рдЖрдк рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЖрд╕рд╛рдиреА рд╕реЗ рдХреБрдЫ рд╕рдВрд╕реНрдХрд░рдг рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред
  4. PHP рдФрд░ JS рджреЛрдиреЛрдВ рдореЗрдВ рд░рд┐рдлреИрдХреНрдЯрд░рд┐рдВрдЧ рдХрд░рдиреЗ рдкрд░ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреА рдЦреЛрдЬ рд╕реБрдЧрдо рд╣реЛ рдЬрд╛рддреА рд╣реИред
  5. рдФрд░ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдЕрдиреНрдп рдЪрд┐рдкреНрд╕ рдЬреИрд╕реЗ рдЬреАрдЖрд░рдкреАрд╕реА рдЖрджрд┐ред

рдмрд╛рдд рдХрд░рдирд╛ рдмрдВрдж рдХрд░реЛ, рдЪрд▓реЛ рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рд╕рдм рдХреИрд╕реЗ рджрд┐рдЦрддрд╛ рд╣реИ


рдореИрдВрдиреЗ рдпрд╣ рдирд╣реАрдВ рдмрддрд╛рдпрд╛ рдХрд┐ рдпрд╣ PHP рдХреА рдУрд░ рдХреИрд╕реЗ рджрд┐рдЦрддрд╛ рд╣реИ, рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╣реИ, рд╡рд╕реНрддреБрдПрдВ рд╕рдорд╛рди рд╣реИрдВред

рдореИрдВ рдЖрдкрдХреЛ Node.js. рдкрд░ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЧреНрд░рд╛рд╣рдХ JS рдФрд░ рдорд┐рдиреА рд╕рд░реНрд╡рд░ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдЦрд╛рдКрдВрдЧрд╛

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдЙрди рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рдирдХреА рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдбреЛрдХрд╛ ред

product.proto

syntax = "proto3";

package api;

import "price.proto";

message Product {
    message Id {
        uint32 value = 1;
    }
    Id id = 1;
    string name = 2;
    string text = 3;
    string url = 4;
    Price price = 5;
}

price.proto

syntax = "proto3";
package api;

message Price {
    float value = 1;
    uint32 tax = 2;
}

service.proto

syntax = "proto3";

package api;

import "product.proto";

service ApiService {
    rpc getById (Product.Id) returns (Product);
}

рдореИрдВ рдЗрд╕ рд╕реЗрд╡рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕рдордЭрд╛рддрд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ, рдЕрдЧрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рднреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕реЗрд╡рд╛ рдХреЛ рдХреЗрд╡рд▓ рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдкреНрд░рд▓реЗрдЦрди рдХреЗ рд▓рд┐рдП рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдпрд╣ рдХреНрдпрд╛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдХреНрдпрд╛ рджреЗрддрд╛ рд╣реИ, рддрд╛рдХрд┐ рд╣рдо рдЖрд╡рд╢реНрдпрдХ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдкрдиреНрди рдХрд░ рд╕рдХреЗрдВред рдпрд╣ рдХреЗрд╡рд▓ gRPC рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред

рдЕрдЧрд▓рд╛, рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХреЛрдб рдЬрдирд░реЗрдЯрд░ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдФрд░ рдЬреЗрдирд░реЗрд╢рди рдХрдорд╛рдВрдб рдЬреЗрдПрд╕ рдХреЗ рддрд╣рдд рдЪрд▓рддрд╛ рд╣реИред

./protoc --proto_path=/Users/user/dev/habr_protobuf/public/proto --js_out=import_style=commonjs,binary:/Users/user/dev/habr_protobuf/src/proto/ /Users/user/dev/habr_protobuf/public/proto/*.proto

рдбреЙрдХ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА ред

рдкреАрдврд╝реА рдХреЗ рдмрд╛рдж, 3 рдЬреЗрдПрд╕ рдлрд╛рдЗрд▓реЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рд╕рдм рдХреБрдЫ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рдХрдо рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрд░рдордмрджреНрдзрддрд╛ рдХреЗ рд╕рд╛рде рдмрдлрд░ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдФрд░ рдмрдлрд░ рд╕реЗ рдбреАрд╕реЗрд░рд┐рдПрд▓рд╛рдЗрдЬреЗрд╢рдиред

price_pb.js
product_pb.js
service_pb.js

рдЕрдЧрд▓рд╛ рд╣рдо JS рдХреЛрдб рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВред

import { Product } from '../proto/product_pb';

//         Product.Id
const instance = new Product.Id().setValue(12345);
let message = instance.serializeBinary();

let response = await fetch('http://localhost:3008/api/getById', {
    method: 'POST',
    body: message
});

let result = await response.arrayBuffer();

//     Product,   ,    , 
//      .
const data = Product.deserializeBinary(result);
console.log(data.toObject());

рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдЧреНрд░рд╛рд╣рдХ рддреИрдпрд╛рд░ рд╣реИред

рд╣рдо рд╕рд░реНрд╡рд░ рдкрд░ рд╡реНрдпрдХреНрдд рдХрд░рддреЗ рд╣реИрдВ

const express = require('express');
const cors = require('cors');

const app = express();
app.use(cors());

//           .
const Product = require('./src/proto/product_pb').Product;
const Price = require('./src/proto/price_pb').Price;

//    , .     .
app.use (function(req, res, next) {
  let data = [];
  req.on('data', function(chunk) {
    data.push(chunk);
  });
  req.on('end', function() {
    if (data.length <= 0 ) return next();
    data = Buffer.concat(data);
    console.log('Received buffer', data);
    req.raw = data;
    next();
  })
});

app.post('/api/getById', function (req, res) {
  //     Product.Id,   
  const prId = Product.Id.deserializeBinary(req.raw);
  const id = prId.toObject().value;

  //   " "      
  const product = new Product();
  product.setId(new Product.Id().setValue(id));
  product.setName('Sony PSP');
  product.setUrl('http://mysite.ru/product/psp/');

  const price = new Price();
  price.setValue(35500.00);
  price.setTax(20);

  product.setPrice(price);

  //       Product
  res.send(Buffer.from(product.serializeBinary()));
});

app.listen(3008, function () {
  console.log('Example app listening on port 3008!');
});

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреБрд▓ рдХреНрдпрд╛ рд╣реИ


  1. рдХрдИ рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╛рд░ рд╡рд░реНрдгрд┐рдд рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЙрддреНрдкрдиреНрди рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рддреНрдп рдХрд╛ рдПрдХ рдмрд┐рдВрджреБред
  2. рдХреЛрдИ рднреНрд░рдо рдирд╣реАрдВ рд╣реИ, рдСрдЯреЛ-рдЬреЗрдирд░реЗрдЯ рдХрд┐рдП рдЧрдП HTML рдФрд░ рдмрд╕ рджреЗрдЦрдиреЗ рд╡рд╛рд▓реА .proto рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рджреЛрдиреЛрдВ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рдкреНрд░рд▓реЗрдЦрди рд╣реИред
  3. рд╣рд░ рдЬрдЧрд╣, рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЗ рд╕рд╛рде, рдЙрдирдХреЗ рд╕рдВрд╢реЛрдзрдиреЛрдВ рдЖрджрд┐ рдХреЗ рдмрд┐рдирд╛ рдХрд╛рдо рдЪрд▓ рд░рд╣рд╛ рд╣реИ, (рдФрд░ рд╣рдо рд╕рднреА рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╕рд╛рдордиреЗ рд╡рд╛рд▓рд╛ рдХреЛ рдкреНрдпрд╛рд░ рдХрд░рддрд╛ рд╣реИ :))
  4. рдЗрд╕ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рдЖрджрд╛рди-рдкреНрд░рджрд╛рди рд╡реЗрдм рд╕реЙрдХреЗрдЯ рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдЛрдг рд╣реИ, рдпрд╣ рдХреНрд░рдордмрджреНрдзрддрд╛ рдФрд░ рдирд┐рд░реНрдЬрдирддрд╛ рдХреА рдЧрддрд┐ рд╣реИ, рдпрд╣рд╛рдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИред

рдореИрдВрдиреЗ 10 рдкреИрд░рд╛рдЧреНрд░рд╛рдлреЛрдВ рдХреЗ рд▓рд┐рдП рд▓реЛрд░реЗрдо рдЗрдкреНрд╕рдо рд▓рд┐рдпрд╛, рдпрд╣ 5.5kb рдбреЗрдЯрд╛ рдирд┐рдХрд▓рд╛, рднрд░реА рд╣реБрдИ рд╡рд╕реНрддреБрдУрдВ рдХреА рдХреАрдордд, рдЙрддреНрдкрд╛рдж рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдПред рдФрд░ рдореИрдВрдиреЗ рдкреНрд░реЛрдЯреЛрдмреБрдлрд╝ рдФрд░ JSON (рд╕рднреА рдПрдХ рд╣реА, рд╕рд┐рд░реНрдл JSON рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рднрд░рд╛ рд╣реБрдЖ рд╣реИ, рдмрдЬрд╛рдп Protobuf рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕) рдкрд░ рдбреЗрдЯрд╛ рдЪрд▓рд╛рдИ

   

Protobuf parsing

client
2.804999ms
1.8150000ms
0.744999ms
server
1.993ms
0.495ms
0.412ms

JSON

client
0.654999ms
0.770000ms
0.819999ms

server
0.441ms
0.307ms
0.242ms

рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рд╕рднреА рдХрд╛ рдзрдиреНрдпрд╡рд╛рдж :)

All Articles