Implementando um Servidor / Cliente com protocolo HTTP com Apache Thrift

JJ Adams

Eu sou novo em economia de apache. Eu queria usá-lo para me ajudar a implementar um servidor que aceita entrada de um cliente, analisá-lo e, com base nisso, direcioná-lo para a função adequada que, por sua vez, retornaria uma resposta para essa solicitação específica.

Por exemplo:

  1. O cliente envia: / get_list / 1 (deve retornar os valores da lista # 1 do servidor)
  2. O servidor analisa a entrada para o seguinte: get_list && 1
  3. O servidor mapeia isso para um get_list_req que é uma estrutura que tem apenas um parâmetro: i32_t id (que neste caso seria 1)
  4. O servidor envia isso para a função getListReq que deve retornar a estrutura get_list_resp que tem 1 parâmetro: list list_content.

Agora eu defini as estruturas necessárias em mylist.thrift:

struct TGetListRequest {
    1: i32_t id,
}
struct TGetListResponse {
    1: string response_code, //FAIL or SUCCESS
    2: list<string> nodes, 
}

service TmyListService {

    TGetListResponse getListReq( 1:TGetListRequest arg ),
}

Agora, isso gera os arquivos necessários:

TmyListService_server.skeleton.cpp 
TmyListService.cpp
TmyListService.h
mylistconstants.cpp
mylistconstants.h
mylisttypes.cpp
mylisttypes.h

O conteúdo do primeiro arquivo é copiado para TmyListService_server.cpp onde a classe é implementada com seu método: getListReq da seguinte maneira:

class TGetListRequestHandler: public TGetListRequestIf {
public:
    TGetListResponse getListReq(TGetListRequest arg){
        ...
    }
};

Forneci nele o seguinte código para iniciar o servidor na função main ():

int main(int argc, char **argv)  {
  int port = 9090;
  shared_ptr<TmyListServiceHandler> handler(new TmyListServiceHandler());
  shared_ptr<TProcessor> processor(new TmyListServiceProcessor(handler));
  shared_ptr<TServerTransport> serverTransport(new TServerSocket(port));
  shared_ptr<TTransportFactory> transportFactory(new  TBufferedTransportFactory());
  shared_ptr<TProtocolFactory> protocolFactory(new TBinaryProtocolFactory());

  TSimpleServer server(processor, serverTransport, transportFactory,     protocolFactory);
  server.serve();
  return 0;
}

Agora vem a parte complicada para mim:

  1. Onde posso implementar a análise da entrada proveniente de um cliente para o servidor? Disseram-me que é uma implementação simples usando thrift sem a necessidade de escrever seu nosso analisador ou usar um gerador de analisador? Eu não consigo descobrir isso? Onde estou dizendo ao meu servidor o que fazer com a entrada, ou seja, para qual função Req devo direcioná-la?

  2. Em termos de implementação do cliente, tenho o seguinte:

    int main(int argc, char **argv) {
     boost::shared_ptr<TSocket> socket(new TSocket("localhost", 9090));
     boost::shared_ptr<TTransport> transport(new TBufferedTransport(socket));
     boost::shared_ptr<TProtocol> protocol(new TBinaryProtocol(transport));
    
     TmyListServiceClient client(protocol);
     TGetListRequest arg;
     arg.id = 1;
     TGetListResponse argz;
     transport->open();
     client.send_getListReq( arg );
     printf("DONE SEDNING");
     client.recv_getListReq( argz );
     transport->close();
    
    return 0;
    }
    

Basicamente, isso não faz nada além de abrir a conexão do cliente. Ele não aceita nenhuma entrada. Tenho certeza de que isso também está relacionado à implementação da lógica de processamento no servidor primeiro, mas o que devo fazer aqui para ter um cliente pronto para ser testado no servidor?

codeSF

Você está quase pronto!

Em seu servidor, você mostra este código:

shared_ptr<TProcessor> processor(new TmyListServiceProcessor(handler));

Onde está o manipulador ?! Esta é a classe que implementa seu serviço.

Algo como:

class TmyListServiceHandler: public TmyListServiceIf { public: virtual TGetListResponse getListReq(TGetListRequest arg) override { } };

A base para seu serviço (TmyListServiceIf) é gerada em: TmyListService.h

>

Olhando para as edições que você fez na pergunta, acho que você ainda tem um problema de manipulador. A classe Handler é declarada: TGetListRequestHandler no novo código adicionado.

Ainda assim, você está construindo TmyListServiceHandler na função principal do servidor. Já vi isso acontecer quando as pessoas mudam coisas no IDL e regeneram o código sem excluir a saída antiga. Você acaba com duas definições diferentes de coisas. Você precisa usar o TmyListServiceHandler em todos os lugares.

Por seu IDL, TGetListRequest é uma estrutura e não deve ter um manipulador.

Este artigo é coletado da Internet.

Se houver alguma infração, entre em [email protected] Delete.

editar em
0

deixe-me dizer algumas palavras

0comentários
loginDepois de participar da revisão

Artigos relacionados

Implementando um protocolo público com classe interna em swift

Interface do cliente Python Thrift com servidor Go gRPC

Posso registrar um esquema / protocolo de URL personalizado com um servidor Node HTTP?

Implementando uma função com um parâmetro padrão definido em um protocolo

crie um servidor simples com node js (protocolo personalizado)

oAuth Token com cliente Java Apache http

Streams Akka com servidor e cliente Akka HTTP

Implementando um CI com gitlab

Implementando um CI com gitlab

PHP: Como responder com um protocolo personalizado diferente de HTTP?

Enviando um valor do servidor para o cliente com soquetes

Cliente conectando-se a um servidor SSL com certificados autoassinados

Configurando um servidor WebSocket seguro com Jetty e cliente JavaScript

Implementando MVVM com servidor local ArcGIS Runtime

Criar um servidor HTTP simples com Java?

Um servidor HTTP simples com Java / Socket?

Posso construir um servidor http com Python?

Executando PhpStorm com Docker no Win 8.1: o cliente enviou uma solicitação HTTP para um servidor HTTPS

Usando o protocolo Thrift com o driver Datastax Python

Protocolo IRC - Registro para Servidor com Senha

Servidor com Nodejs e cliente com XMLHttpRequest

OutOfMemoryError com cliente elasticsearch REST Java via apache http nio

cliente Jersey descansar com Apache HTTP Client 4.5 vs retrofit

Threads travados com o cliente Apache HTTP 4.5.x

Problemas ao tentar simular o cliente Apache HTTP com Mockito

Threads travados com o cliente Apache HTTP 4.5.x

Implementando um repositório com um controlador

Crie um servidor oauth cliente com senha e credenciais de cliente

Execute a autenticação do cliente para o servidor com gRPC em Java com apenas um CA