Как выполнить анализ JSON в микро-сервисах GRPC в iOS, используя Swift 4.1 (Xcode 10)? - PullRequest
0 голосов
/ 18 ноября 2018

Я работаю над проектом, который использовал GRPC microservices. Обычно GRPC использовал protobuf в качестве метода по умолчанию для сериализации данных. Но мы используем JSON вместо protobuf. В общем, мы определили сообщение и сервисы в protobuf и выполнили protoc , затем слили сгенерированный файл с проектом. Но каким-то образом Google сделал жестким объединение JSON в GRPC. Я подумал, что Google должен создать такую ​​документацию (https://grpc.io/blog/grpc-with-json) для разработчика iOS). Но, к сожалению, в Swift нет отдельной документации. Мне было трудно использовать тип JSON в GRPC. Как я буду вызывать методы в КЛИЕНТСКАЯ СТОРОНА код в Swift?

Я хочу передать две переменные (data: String, idToken: String), т.е. определенные в структуре запроса после того, как эти службы должны дать мне Response . Таким образом, я бы понял метод get и post, используемый в GRPC.

https://grpc.io/blog/grpc-with-json, В этой ссылке мы можем проверить, как java работает с JSON + GRPC. Я добавляю этот пример кода Java для большего понимания того, что я хочу сделать в Swift, может быть, это поможет.

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import io.grpc.MethodDescriptor;


public class UserManagerRpcGson {
    private static final String SERVICE_NAME = "url";
    public static final class Request {
        public String data;
        public String idToken;
    }

    public static final MethodDescriptor<Request, Response> REGISTER_METHOD =
            MethodDescriptor.newBuilder(
                    marshallerFor(Request.class),
                    marshallerFor(Response.class))
                    .setFullMethodName(
                            MethodDescriptor.generateFullMethodName(SERVICE_NAME, "registerUser"))
                    .setType(MethodDescriptor.MethodType.UNARY)
                    .setSampledToLocalTracing(true)
                    .build();

    static <T> MethodDescriptor.Marshaller<T> marshallerFor(Class<T> clz) {
        return new MethodDescriptor.Marshaller<T>() {
            @Override
            public InputStream stream(T value) {
                return new ByteArrayInputStream(GsonUtil.gson.toJson(value, clz).getBytes(StandardCharsets.UTF_8));
            }

            @Override
            public T parse(InputStream stream) {
                return GsonUtil.gson.fromJson(new InputStreamReader(stream, StandardCharsets.UTF_8), clz);
            }
        };
    }
}
...