zoukankan      html  css  js  c++  java
  • SpringBoot使用protobuf格式的接口

    SpringBoot使用protobuf格式的接口

    建立SpringBoot项目,pom.xml内容如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.2.2.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>com.example.protobuf</groupId>
        <artifactId>demo</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>demo</name>
        <description>Demo project for Spring Boot</description>
    
        <properties>
            <java.version>1.8</java.version>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
                <exclusions>
                    <exclusion>
                        <groupId>org.junit.vintage</groupId>
                        <artifactId>junit-vintage-engine</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
            <dependency>
                <groupId>com.google.protobuf</groupId>
                <artifactId>protobuf-java</artifactId>
                <version>3.11.0</version>
            </dependency>
            <dependency>
                <groupId>com.google.protobuf</groupId>
                <artifactId>protobuf-java-util</artifactId>
                <version>3.11.0</version>
            </dependency>
            <dependency>
                <groupId>com.googlecode.protobuf-java-format</groupId>
                <artifactId>protobuf-java-format</artifactId>
                <version>1.2</version>
            </dependency>
            <!-- 网络请求依赖 -->
            <dependency>
                <groupId>org.apache.httpcomponents</groupId>
                <artifactId>httpclient</artifactId>
                <version>4.5.2</version>
            </dependency>
            <dependency>
                <groupId>org.apache.httpcomponents</groupId>
                <artifactId>httpcore</artifactId>
                <version>4.4</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>org.apache.commons</groupId>
                <artifactId>commons-lang3</artifactId>
                <version>3.0</version>
            </dependency>
            <dependency>
                <groupId>commons-collections</groupId>
                <artifactId>commons-collections</artifactId>
                <version>3.0</version>
            </dependency>
        </dependencies>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    </project>
    

    编写.proto文件,内容如下:

    user_login.proto:

    syntax = "proto3";
    
    option java_package = "com.boomsecret.protobuf";
    option java_outer_classname = "MessageUserLogin";
    
    message MessageUserLoginRequest {
        string username = 1;
        string password = 2;
    }
    
    message MessageUserLoginResponse {
        string access_token = 1;
        string username = 2;
    }
    

    生成java代码:

    protoc.exe --java_out=./ user_login.proto
    

    将生成的代码移动到你的项目中合适位置:

    编写protobuf格式的Controller接口:

    package com.example.protobuf.demo.controller;
    
    import com.boomsecret.protobuf.MessageUserLogin;
    import org.apache.http.HttpResponse;
    import org.apache.http.client.methods.HttpPost;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestBody;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.ResponseBody;
    import util.HttpUtils;
    
    import java.net.URI;
    import java.util.UUID;
    
    @Controller
    public class TestController {
        @RequestMapping(value = "/demo/test", produces = "application/x-protobuf")
        @ResponseBody
        public MessageUserLogin.MessageUserLoginResponse getPersonProto(@RequestBody MessageUserLogin.MessageUserLoginRequest request) {
            MessageUserLogin.MessageUserLoginResponse.Builder builder = MessageUserLogin.MessageUserLoginResponse.newBuilder();
            builder.setAccessToken(UUID.randomUUID().toString()+"_res");
            builder.setUsername(request.getUsername()+"_res");
            return builder.build();
        }
    
    }
    

    编写测试类,通过HttpClient工具调用接口:

    package com.example.protobuf.demo;
    
    import com.boomsecret.protobuf.MessageUserLogin;
    import org.apache.http.HttpResponse;
    import org.apache.http.client.methods.HttpPost;
    import org.junit.jupiter.api.Test;
    import org.springframework.boot.test.context.SpringBootTest;
    import util.HttpUtils;
    
    import java.net.URI;
    
    @SpringBootTest
    class DemoApplicationTests {
    
        @Test
        void contextLoads() {
        }
        @Test
        public void test() {
            try {
                URI uri = new URI("http", null, "127.0.0.1", 8080, "/demo/test", "", null);
                HttpPost request = new HttpPost(uri);
                MessageUserLogin.MessageUserLoginRequest.Builder builder = MessageUserLogin.MessageUserLoginRequest.newBuilder();
                builder.setUsername("tom");
                builder.setPassword("123456");
                HttpResponse response = HttpUtils.doPost(request, builder.build());
                MessageUserLogin.MessageUserLoginResponse messageUserLoginResponse = MessageUserLogin.MessageUserLoginResponse.parseFrom(response.getEntity().getContent());
                System.err.println(messageUserLoginResponse.getAccessToken());
            } catch (Exception e) {
    
            }
        }
    
    }
    

    HttpUtils内容如下:

    package util;
    
    import com.google.protobuf.GeneratedMessageV3;
    import com.googlecode.protobuf.format.JsonFormat;
    import org.apache.http.Header;
    import org.apache.http.HttpResponse;
    import org.apache.http.client.HttpClient;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.entity.InputStreamEntity;
    import org.apache.http.impl.client.HttpClients;
    
    import java.io.ByteArrayInputStream;
    import java.io.IOException;
    
    /**
     * @author wangjinliang on 2018/10/18.
     */
    public class HttpUtils {
    
        public static HttpResponse doPost(HttpPost post, GeneratedMessageV3 message) throws IOException {
            HttpClient httpclient = HttpClients.createDefault();
            String requestUrl = post.getURI().toString();
    
            ByteArrayInputStream inputStream = new ByteArrayInputStream(message.toByteArray());
            InputStreamEntity inputStreamEntity = new InputStreamEntity(inputStream);
            post.setEntity(inputStreamEntity);
    
            post.addHeader("Content-Type", "application/x-protobuf");
            for (Header header : post.getAllHeaders()) {
                System.out.println(header.getName() + ":" + header.getValue());
            }
    
            StringBuilder sb = new StringBuilder();
            sb.append("curl -XPOST ");
            for (Header header : post.getAllHeaders()) {
                sb.append(" -H "").append(header.getName()).append(":").append(header.getValue()).append(""");
            }
    
            String jsonBody = JsonFormat.printToString(message);
            jsonBody = jsonBody.replace(""", "\"");
            sb.append(" -d "").append(jsonBody).append(""");
            sb.append(" ").append(requestUrl);
    
            System.out.println(sb.toString());
            return httpclient.execute(post);
        }
    }
    

    以debug方式运行SpringBoot项目,并在controller加断点,然后运行测试代码:

    可以看到请求过来的数据是正确的,放行后可以看到响应数据也是正确的:

  • 相关阅读:
    00005-js 获取uuid
    00004-form 表单的清空、重置 (jquery)
    使用Socket进行通信
    使用ServerSocket创建TCP服务器端
    TCP协议基础
    基于TCP协议的网络通信
    3D MAX在立方体的使用
    应用纹理贴图
    使用OpenGL ES绘制3D图形
    GL10控制图形旋转
  • 原文地址:https://www.cnblogs.com/yanshaoshuai/p/12146020.html
Copyright © 2011-2022 走看看