Как преобразовать json в прототип сообщения на Javascript стороне клиента? - PullRequest
0 голосов
/ 27 февраля 2020

Мне нужно отправить JSON как запрос к API grp c через Посланника. В настоящее время я использую функции сеттера из автоматически сгенерированного прото c кода. Есть ли способ напрямую преобразовать json (даже глубоко вложенные) в прото-сообщение и отправить его как запрос?

Вот файл прото.

syntax = "proto3";

package movieDetails;

message Category {
    string code = 1;
    repeated float ratings = 2;
    bool liked = 3;
}

message MovieRequest {
    string ping = 1;
    Category sample = 2;
}

message MovieResponse {
    string title = 1;
    string desc = 2;
    repeated int32 numbers = 3;
    repeated Category sample = 4;
}

service MovieDetailService {
    rpc getDetails(MovieRequest) returns (MovieResponse);
}

Я использовал прото c для автоматической генерации * _pb. js файлов.

Под прото-сообщением я подразумеваю данные в этом формате.

{
  "wrappers_": {
    "2": {
      "wrappers_": null,
      "arrayIndexOffset_": -1,
      "array": [
        "XY",
        [
          0.1,
          0.6,
          0.9
        ],
        true
      ],
      "pivot_": 1.7976931348623157e+308,
      "convertedPrimitiveFields_": {
        "2": true
      }
    }
  },
  "arrayIndexOffset_": -1,
  "array": [
    "Mission Impossible",
    [
      "XY",
      [
        0.1,
        0.6,
        0.9
      ],
      true
    ]
  ],
  "pivot_": 1.7976931348623157e+308,
  "convertedPrimitiveFields_": {}
}

для соответствующих JSON

{
  "ping": "Mission Impossible",
  "sample": {
    "code": "XY",
    "ratingsList": [
      0.1,
      0.6,
      0.9
    ],
    "liked": true
  }
}

Это мой код React.

import React, { Component } from 'react';
import logo from './logo.svg';
import './App.css';

const { MovieDetailServiceClient } = require('./grpc/sample_grpc_web_pb');
const { MovieRequest, serializeBinaryToWriter , Category } = require('./grpc/sample_pb');

var client = new MovieDetailServiceClient('http://localhost:9090', null, null);
console.log(client)
class App extends Component {
   callGrpcService = async () => {
    const request = new MovieRequest();
    request.setPing('Mission Impossible');

    const cat = new Category();
    cat.setCode('XY')
    cat.setRatingsList([0.1, 0.6, 0.9])
    cat.setLiked(true)


    const catJson = {code: 'XY', ratings: [0.1, 0.4], liked: false}
    console.log(catJson)// CAN THIS BE DIRECTLY ENCODED AND SEND REQUEST??

    await request.setSample(cat)
    console.log(':', request.toObject())
    client.getDetails(request, {}, (err, response) => {
      if (response == null) {
        console.log('BUG:',err)
      }else {
        console.log(response.getTitle(), response.getDesc(), response.getNumbersList(), response.getSampleList())
        console.log(response.toObject())
        console.log(response.getSampleList().map(it => it.getRatingsList()))
      }
    });
  }

  render() {
    return (
      <div className="App">
        <header className="App-header">
          <img src={logo} className="App-logo" alt="logo" />
          <button style={{padding:10}} onClick={this.callGrpcService}>Click for grpc request</button>
        </header>
      </div>
    );
  }
}

export default App;
...