SpringBoot使用protobuf格式的接口方式

网友投稿 838 2022-10-08


SpringBoot使用protobuf格式的接口方式

SpringBoot使用protobuf格式的接口

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

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">

4.0.0

org.springframework.boot

spring-boot-starter-parent

2.2.2.RELEASE

com.example.protobuf

demo

0.0.1-SNAPSHOT

demo

Demo project for Spring Boot

1.8

org.springframework.boot

spring-boot-starter

org.springframework.boot

spring-boot-starter-test

test

org.junit.vintage

junit-vintage-engine

com.google.protobuf

protobuf-java

3.11.0

com.google.protobuf

protobuf-java-util

3.11.0

com.googlecode.protobuf-java-format

protobuf-java-format

1.2

org.apache.httpcomponents

httpclient

4.5.2

org.apache.httpcomponents

httpcore

4.4

org.springframework.boot

spring-boot-starter

org.springframework.boot

spring-boot-starter-web

org.apache.commons

commons-lang3

3.0

commons-collections

commons-collections

3.0

org.springframework.boot

spring-boot-maven-plugin

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">

4.0.0

org.springframework.boot

spring-boot-starter-parent

2.2.2.RELEASE

com.example.protobuf

demo

0.0.1-SNAPSHOT

demo

Demo project for Spring Boot

1.8

org.springframework.boot

spring-boot-starter

org.springframework.boot

spring-boot-starter-test

test

org.junit.vintage

junit-vintage-engine

com.google.protobuf

protobuf-java

3.11.0

com.google.protobuf

protobuf-java-util

3.11.0

com.googlecode.protobuf-java-format

protobuf-java-format

1.2

org.apache.httpcomponents

httpclient

4.5.2

org.apache.httpcomponents

httpcore

4.4

org.springframework.boot

spring-boot-starter

org.springframework.boot

spring-boot-starter-web

org.apache.commons

commons-lang3

3.0

commons-collections

commons-collections

3.0

org.springframework.boot

spring-boot-maven-plugin

编写.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.apphttp://end(" -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加断点,然后运行测试代码:

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


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:CHECKPOINT 发布R80.3版新特性(checkpoint怎么用)
下一篇:Check_Point_R80.30_Gaia_3.10_T273新特性
相关文章

 发表评论

暂时没有评论,来抢沙发吧~