Skip to content

protoc

Install


sudo apt install protobuf-compiler

Development


Create java object from proto file

protoc --java_out=java resources/article.proto

Curl call


Call proto endpoint and get data

curl http://localhost:8080/article/1 | protoc --decode_raw

Call proto endpoint and send data payload creation

protoc --encode=michalszalkowski.Article article.proto < article.txt > article.payload  

api call

curl -X POST --data-binary @article.payload -H "Content-Type: application/x-protobuf" http://localhost:8080/article/

Data


article.proto

syntax = "proto3";  
package michalszalkowski;  
option java_package = "com.michalszalkowski.protomolecule";  
option java_outer_classname = "ProtoObj";  

message Article {  
  int32 id = 1;  
  string title = 2;  
  Author author = 3;  
}  
message Author {  
  int32 id = 1;  
  string first_name = 2;  
  string last_name = 3;  
  string email = 4;  
  repeated PhoneNumber phone = 5;  
  message PhoneNumber {  
    string number = 1;  
    PhoneType type = 2;  
  }  
  enum PhoneType {  
    MOBILE = 0;  
    LANDLINE = 1;  
  }  
}

article.txt

id: 1  
title: "Test"  
author: {  
    id: 1  
    first_name: "Michal"  
    last_name: "Szalkowski"  
    email: "no-valid@michalszalkowski.com"  
}

Tools


  • https://github.com/qaware/protocurl (not tested)

Code Snippets


pom.xml

...
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>com.google.protobuf</groupId>
            <artifactId>protobuf-java</artifactId>
            <version>3.25.3</version>
        </dependency>
    </dependencies>
...

package com.michalszalkowski.protomolecule;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.http.converter.protobuf.ProtobufHttpMessageConverter;

@SpringBootApplication
public class ProtomoleculeApplication {

    public static void main(String[] args) {
        SpringApplication.run(ProtomoleculeApplication.class, args);
    }

    @Bean
    public ProtobufHttpMessageConverter protobufHttpMessageConverter() {
        return new ProtobufHttpMessageConverter();
    }
}
package com.michalszalkowski.protomolecule;

import org.springframework.web.bind.annotation.*;

@RestController
public class ArticleRestController {

    private final ArticleRepository articleRepository = new ArticleRepository();

    @GetMapping("/article/{id}")
    public ProtoObj.Article getArticle(@PathVariable Integer id) {
        return articleRepository.getArticle(id);
    }

    @PostMapping("/article/")
    public ProtoObj.Article creteArticle(@RequestBody ProtoObj.Article article) {
        System.out.println("Title = " + article.getTitle());
        System.out.println("FirstName = " + article.getAuthor().getFirstName());
        System.out.println("LastName = " + article.getAuthor().getLastName());
        return article;
    }
}
package com.michalszalkowski.protomolecule;

import org.springframework.stereotype.Repository;

import java.util.HashMap;
import java.util.Map;

@Repository
public class ArticleRepository {

    private final Map<Integer, ProtoObj.Article> articles = new HashMap<>();

    public ArticleRepository() {

        ProtoObj.Article course1 = ProtoObj.Article.newBuilder()
                .setId(1)
                .setTitle("First article about Lorm Ipsum")
                .setAuthor(getAuthor())
                .build();

        ProtoObj.Article course2 = ProtoObj.Article.newBuilder()
                .setId(2)
                .setTitle("Second article about Lorm Ipsum")
                .setAuthor(getAuthor())
                .build();

        this.articles.put(course1.getId(), course1);
        this.articles.put(course2.getId(), course2);
    }

    private static ProtoObj.Author getAuthor() {
        return ProtoObj.Author.newBuilder()
                .setId(1)
                .setFirstName("Michal")
                .setLastName("Szalkowski")
                .setEmail("no-valid@michalszalkowski.com")
                .addPhone(
                        ProtoObj.Author.PhoneNumber
                                .newBuilder()
                                .setNumber("000-111-222")
                                .setType(ProtoObj.Author.PhoneType.MOBILE)
                                .build()
                )
                .addPhone(
                        ProtoObj.Author.PhoneNumber
                                .newBuilder()
                                .setNumber("333-444-555")
                                .setType(ProtoObj.Author.PhoneType.LANDLINE)
                                .build()
                )
                .build();
    }

    public ProtoObj.Article getArticle(int id) {
        return articles.get(id);
    }
}