通过 gRPC/Protobuf 沟通
Communication through gRPC/Protobuf
我来是因为我无法在我的 API (Go) 和我的客户 (Android) 之间进行交流。
我有这个 protobuf 文件:
syntax = "proto3";
option java_package = "com.emixam23.rushpoc.protobuf";
option java_outer_classname = "HelloWorld";
package helloworld;
// The greeting service definition.
service Greeter {
// Sends a greeting
rpc SayHello (HelloRequest) returns (HelloReply) {}
}
// The request message containing the user's name.
message HelloRequest {
string name = 1;
}
// The response message containing the greetings
message HelloReply {
string message = 1;
}
protobuf文件来自https://grpc.io/docs/quickstart/go.html的例子,我只是没有实现SayHelloAgain。我想要实现的是,从我的 android 应用程序向我的 Go API 发送 SayHello 并获得回复...
对于 android,我遵循了该教程 (https://grpc.io/docs/quickstart/android.html),以便从 protobuf 文件与我的 API 进行通信。但是,有一个stub
,不知道从哪里来的
所以我搜索了如何创建存根 (https://grpc.io/docs/tutorials/basic/android.html),但一无所获..ManagedChannelBuilder 不存在,我找不到安装它的方法..
PS:要从 protobuf 文件生成我的 Java class,我遵循了该教程:https://proandroiddev.com/how-to-setup-your-android-app-to-use-protobuf-96132340de5c
我的方向是正确的还是完全错误的?
我的项目结构:
APP build.gradle
apply plugin: 'com.android.application'
apply plugin: 'com.google.protobuf'
android {
compileSdkVersion 27
defaultConfig {
applicationId "com.rushpoc.emixam23.androidapp"
minSdkVersion 21
targetSdkVersion 27
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:27.1.1'
implementation 'com.android.support.constraint:constraint-layout:1.1.2'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
//Protobuf
implementation 'com.google.protobuf:protobuf-lite:3.0.0'
implementation 'io.grpc:grpc-okhttp:1.13.2'
implementation 'io.grpc:grpc-protobuf-lite:1.13.2'
implementation 'io.grpc:grpc-stub:1.13.2'
}
protobuf {
generatedFilesBaseDir = "$projectDir/generated"
protoc {
// You still need protoc like in the non-Android case
artifact = 'com.google.protobuf:protoc:3.0.0'
}
plugins {
javalite {
// The codegen for lite comes as a separate artifact
artifact = 'com.google.protobuf:protoc-gen-javalite:3.0.0'
}
grpc {
artifact = 'io.grpc:protoc-gen-grpc-java:1.13.2'
}
}
generateProtoTasks {
all().each { task ->
task.builtins {
java
}
task.plugins {
grpc {}
}
}
}
}
TOP-LEVEL/Root build.gradle
// 顶级构建文件,您可以在其中添加所有 sub-projects/modules.
通用的配置选项
buildscript {
ext.protobufVersion = '0.8.6'
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.1.3'
classpath "com.google.protobuf:protobuf-gradle-plugin:$protobufVersion"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
google()
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
我还没有检查整个 gradle 文件,但我在你的屏幕截图中看到 .proto 文件在 src/main/protobufs
中,它没有遵循你提到的任何一个教程。 protobuf gradle 插件默认不检测这个目录。因此我建议您将其更改为默认目录src/main/proto
。如果你想坚持将 .proto 文件放在 src/main/protobufs
中,你可能需要通过添加
让 protobuf gradle 插件知道它
// see https://github.com/google/protobuf-gradle-plugin#customizing-source-directories
sourceSets {
main {
proto {
// In addition to the default 'src/main/proto'
srcDir 'src/main/protobufs'
}
}
}
之后,如果没有其他错误,protobuf gradle 插件将生成 java 代码。
我来是因为我无法在我的 API (Go) 和我的客户 (Android) 之间进行交流。
我有这个 protobuf 文件:
syntax = "proto3";
option java_package = "com.emixam23.rushpoc.protobuf";
option java_outer_classname = "HelloWorld";
package helloworld;
// The greeting service definition.
service Greeter {
// Sends a greeting
rpc SayHello (HelloRequest) returns (HelloReply) {}
}
// The request message containing the user's name.
message HelloRequest {
string name = 1;
}
// The response message containing the greetings
message HelloReply {
string message = 1;
}
protobuf文件来自https://grpc.io/docs/quickstart/go.html的例子,我只是没有实现SayHelloAgain。我想要实现的是,从我的 android 应用程序向我的 Go API 发送 SayHello 并获得回复...
对于 android,我遵循了该教程 (https://grpc.io/docs/quickstart/android.html),以便从 protobuf 文件与我的 API 进行通信。但是,有一个stub
,不知道从哪里来的
所以我搜索了如何创建存根 (https://grpc.io/docs/tutorials/basic/android.html),但一无所获..ManagedChannelBuilder 不存在,我找不到安装它的方法..
PS:要从 protobuf 文件生成我的 Java class,我遵循了该教程:https://proandroiddev.com/how-to-setup-your-android-app-to-use-protobuf-96132340de5c
我的方向是正确的还是完全错误的?
我的项目结构:
APP build.gradle
apply plugin: 'com.android.application'
apply plugin: 'com.google.protobuf'
android {
compileSdkVersion 27
defaultConfig {
applicationId "com.rushpoc.emixam23.androidapp"
minSdkVersion 21
targetSdkVersion 27
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:27.1.1'
implementation 'com.android.support.constraint:constraint-layout:1.1.2'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
//Protobuf
implementation 'com.google.protobuf:protobuf-lite:3.0.0'
implementation 'io.grpc:grpc-okhttp:1.13.2'
implementation 'io.grpc:grpc-protobuf-lite:1.13.2'
implementation 'io.grpc:grpc-stub:1.13.2'
}
protobuf {
generatedFilesBaseDir = "$projectDir/generated"
protoc {
// You still need protoc like in the non-Android case
artifact = 'com.google.protobuf:protoc:3.0.0'
}
plugins {
javalite {
// The codegen for lite comes as a separate artifact
artifact = 'com.google.protobuf:protoc-gen-javalite:3.0.0'
}
grpc {
artifact = 'io.grpc:protoc-gen-grpc-java:1.13.2'
}
}
generateProtoTasks {
all().each { task ->
task.builtins {
java
}
task.plugins {
grpc {}
}
}
}
}
TOP-LEVEL/Root build.gradle
// 顶级构建文件,您可以在其中添加所有 sub-projects/modules.
通用的配置选项buildscript {
ext.protobufVersion = '0.8.6'
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.1.3'
classpath "com.google.protobuf:protobuf-gradle-plugin:$protobufVersion"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
google()
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
我还没有检查整个 gradle 文件,但我在你的屏幕截图中看到 .proto 文件在 src/main/protobufs
中,它没有遵循你提到的任何一个教程。 protobuf gradle 插件默认不检测这个目录。因此我建议您将其更改为默认目录src/main/proto
。如果你想坚持将 .proto 文件放在 src/main/protobufs
中,你可能需要通过添加
// see https://github.com/google/protobuf-gradle-plugin#customizing-source-directories
sourceSets {
main {
proto {
// In addition to the default 'src/main/proto'
srcDir 'src/main/protobufs'
}
}
}
之后,如果没有其他错误,protobuf gradle 插件将生成 java 代码。