Implementando uma Arquitetura de Serviço Universal Web utilizando Ajax

Este artigo centra-se na construção de arquitetura de serviço aweb. No artigo anterior, você aprendeu a criar uma arquitetura global que inclui as noções básicas de como construir uma malha de serviços e seus URLs apropriadas. No entanto, ele não explicou os detalhes do que serviço aweb faz e por serviço aweb deve fazer o que ele faz. Este artigo descreve as orientações de como desenvolver um Representational State Transfer (REST)-serviço baseado na web. Especificamente, ele aborda os seguintes pontos:

• Serviço aweb Estruturação para resolver uma tarefa específica

• A combinação de serviços Web para filtrar e modificar dados

• A combinação de serviços Web para criar mashupsProblemaVamos olhar para um problema dentro de uma aplicação de negociação de ações como um exemplo de um problema na construção de Web services. O problema é que um número de clientes que precisam acessar em tempo real e informações históricas da ordem. Adicionando front end aweb serviço permite aproveitar o servidor socket middleware sem fazer quaisquer alterações. Embora possa parecer um desperdício de recursos adicionar um front-end para um serviço em um contexto global de serviços Web, faz sentido aqui. Este artigo irá explorar o porquê.

  

Parte da solução 1

A implementação da solução envolve tomar uma das tecnologias já existentes e soquete usando essa tecnologia para construir serviços aweb. Para fins de ilustração, este artigo usa uma única tecnologia Java. Você pode escolher. NET ou C + + a tecnologia em si não é importante, porque o serviço da Web expostos podem ser consumidos por toda a tecnologia que é serviço Web-aware. A abordagem inicial para a construção do serviço da Web é definir o general de operações e, em seguida, executar essas operações em geral usando alguma tecnologia.

Na visão de alto nível da arquitectura de negociação, um tipo chamado TradeServlet classe que implementa uma servlet Java fornece o serviço da Web. Para aqueles não versados em tecnologias Java, um servlet Java é uma forma de implementar um manipulador de HTTP. TradeServlet executa os pedidos de histórico, pedidos de dados real-time, e solicita ordem usando uma interface denominada iTrader. Do ponto de vista de programação, utilizando uma interface é a abordagem correta, porque permite que você use o padrão Bridge. O padrão Bridge permite dissociar a intenção de negociação da implementação da negociação. Na visão de alto nível da arquitetura de serviços Web, o ProviderTrader1 tipo implementa a convocação da funcionalidade adequada através da camada de soquete. A teoria padrão Bridge permite que você use uma chamada de socket hoje como uma solução temporária, mas amanhã substituir ProviderTrader1 com uma nova implementação (como a substituição do middleware com o serviço Web), sem ter de alterar a implementação de TradeServlet ou a hardMOB interface.

A classe ProviderTrader1

iTrader implementa a interface e fornece uma ponte entre o comerciante subsistema de neutro para a tomada baseada em sistema de negociação. Outro fornecedor poderia ser usado para acessar um banco de dados legados. Independentemente do número de prestadores, a serviço da Web interage com o subsistema de comerciante morto. E o profissional interage com o subsistema neutro da tomada baseada em sistema de negociação. Em teoria, essa abordagem é de som, mas ele sofre por ser muito complexo. O problema da abordagem é uma questão de foco. No exemplo do subsistema profissional, o foco é o subsistema, ea camada de serviço Web é um add-on para o subsistema comerciante. Em teoria, o serviço Web add-on não é nem mesmo necessário, porque o subsistema profissional gerencia tudo. No contexto de uma aplicação de serviço Web Ajax, esta é a abordagem errada, porque o foco é o serviço da Web, e não deve ser um add-on.

Parte da solução 2

A solução para o subsistema de comerciante é nem o define nem implementar um comerciante subsistema neutro usando uma tecnologia específica. O subsistema de comerciante é convertido em uma série de serviços da Web que você pode montar em um subsistema. AWeb baseada em serviços do subsistema profissional necessita ainda de uma interface, mas a interface é definida no nível de serviço da Web HTTP. Em termos arquitectónicos, as implementações iTrader convertida em serviços web. A arquitetura baseia-se reutilizar as implementações já existentes de ProviderTrader1 e ProviderTrader2 diretamente da classe TradeServlet. Cada aplicação oferece um conjunto de métodos, propriedades e conjuntos de resultados que o comerciante subsistema neutro define. Usando o serviço aweb, os métodos, propriedades e conjuntos de resultados são convertidos em algo que é serviço Web compatível. Em seguida, a um nível superior, outra tecnologia reúne os serviços da Web em um subsistema comerciante.

Aplicar o Trader-Universal Web ServiceO comércio de serviços da Web é um exemplo do que esperar quando a implementação de uma solução completa de serviços web. Este artigo abrange essas peças restantes:

• Definir as URLs

• Identificar os formatos que podem ser enviados e recebidos

• Como suporte para URLs relativas

Definindo as URLs para os Application TraderVamos continuar com a evolução do serviço comerciante Web e delinear as peças importantes, nomeadamente as URLs e formatos de dados suportados. A aplicação comerciante expõe as URLs base seguinte:

 

• / serviços / controlador

• / serviços / realtime

• / serviços / pedidos

• / services/orders/trader123/order345

• / serviços / histórico

/ serviços / controlador é o URL de base utilizada para gerenciar o motor no lado do servidor. O controlador de URL permite que você redefinir o código por trás do serviço da Web manualmente. Por exemplo, no caso do pedido de comerciante, / serviços / controlador iria ligar a implementação de serviços Web para o socket que fornece a interface de negociação. Você pode usar a URL / serviços / controlador / start para iniciar o código do servidor, e você pode usar a URL / serviços / controlador / stop para parar o código do servidor. No entanto, esta abordagem não seria útil, porque parece que os identificadores de início e fim são recursos, que não são. Compará-lo com um interruptor de luz. Um interruptor de luz é um recurso único que tem dois estados: ligado e desligado. Ele faz não tem dois recursos, um para cada estado. você usa parâmetros de consulta para iniciar e parar o código do servidor. Para iniciar o código do servidor, você executar o verbo POST na URL / serviços / controlador com a interface gráfica do computador (CGI) ação = parâmetros começar. Para parar o código do servidor, a URL continua a mesma, assim como o verbo, mas o CGI alterar os parâmetros de ação para = parar. O verbo POST é apropriada, porque você está executando algum processo server-side, e que o processo deve fazer depende dos dados enviados. Chamando o verbo GET no URL / serviços / controlador retorna o status do código do servidor.

Se você gostaria de controlar várias partes de código do servidor em sua aplicação, em seguida, criar URLs criança, como o seguinte: / services/controller/code1 e / services/controller/code2. As orientações para iniciar, parar e recuperar o status dos pedaços de código individual do servidor permanecem os mesmos. Muitas vezes, pedaços de código server-side exigem diretivas de configuração, como o local do diretório base, como muitos tópicos para iniciar, e assim por diante. Estas directivas de configuração são normalmente armazenados em um arquivo de configuração. Você deve ser capaz de especificar essas diretivas quando o servidor de código inicia ou pára. Por exemplo, se você quiser especificar uma contagem da linha, então você pode usar a ação de parâmetros CGI = & start = 12 threadCount para o início do código do servidor.

Se você tiver a capacidade de definir diretrizes de configuração, então eles podem ser consultados e recuperados quando o status do servidor é solicitada. Se você quiser consultar o valor individual de uma variável de servidor, você pode filtrar-lo usando como parâmetros de consulta / serviços / controlador? Status = threadCount uptime +. Você usa o URL base / serviços / tempo real para gerenciar o estoque em tempo real dados ticker. Por exemplo, se você está interessado no ticker GM, você pode usar a URL / serviços / realtime / GM para recuperar as informações em tempo real. Parece que esta base de URL é o mais simples, mas a simplicidade é enganosa. Por exemplo, se os usuários executar GET no URL / serviços / tempo real, o que é retornado? Esta é uma pergunta complicada, porque você está se aproximando do limite de um pedaço de software. De uma perspectiva teórica, chamando a obter resultados no retorno de dados em tempo real para todos os tickers. Isso parece bom em teoria, mas é completamente inviável. Há literalmente milhares de ações nas bolsas de múltiplas. Obter todos os tickers em um pedido em tempo real usando uma solicitação GET é praticamente inviável.

Este é um exemplo de uma URL onde a teoria ea prática estão em conflito. A solução não suporta a URL raiz como uma referência a dados em tempo real. A raiz de URL é usado para retornar uma lista de todos os links em tempo real. A raiz URL não é utilizada para indicar que as informações em tempo real, é porque isso exigiria seguinte milhares de tickers. A URL raiz retornará os links para onde você pode recuperar dados em tempo real. Isto poderia significar voltar links para milhares de cotações de ações. Você também pode usar o URL raiz para retornar tanto o link para o relógio e uma descrição sumária da empresa. Isso ajudaria na construção de um motor de busca, como a maioria das pessoas não sabe o ticker, mas sei o nome da corporação. Delegando a URL raiz para URLs individuais cria um problema em que o serviço Web não consegue gerir o tempo-real para feeds todas as cotações de ações em todas as trocas.

Para colocá-lo simplesmente, você não pode acompanhar todas as ações em um único computador. Todas as ações de monitoramento requer grandes quantidades de potência que este artigo não vai entrar. A única solução é usar uma faixa-se-perguntou solução. Em uma completa solução perguntou-se, sem reservas são monitorados inicialmente para os dados em tempo real. Dados em tempo real serão monitorados somente se um HTTP GET é executada em uma determinada ação. Um HTTP POST ou PUT ou DELETE não faz sentido na alimentação em tempo real, pois um animal em tempo real, inclui dados que vai do servidor para o cliente. O servidor não está interessado em qualquer informação do cliente diferente do que ticker para gerar dados em tempo real para. Se um outro verbo que GET é executado, o servidor irá gerar um erro HTTP 500.

/ serviços / pedidos especifica a URL de raiz para o processamento de pedidos. No contexto dos estoques, processamento de pedidos faz uso de todos os verbos HTTP. Você usa HTTP POST para enviar uma ordem, HTTP PUT para modificar uma ordem, HTTP GET para recuperar o status de uma ordem, e HTTP DELETE para excluir uma ordem.

Cada pedido será representado como um identificador único, por exemplo, / services/orders/1232445. O identificador exclusivo não tem que ser numérico, mas pode ser alfanumérico ou mesmo amore complicado Globally Unique Identifier (GUID). A URL raiz pode ser o anfitrião de várias ordens, o que poderia significar, literalmente, milhões de encomendas. Para o URL fim, é importante que você tem a capacidade de filtrar as ordens de acordo com um estatuto específico. Você pode ser tentado a organizar ordens de acordo com uma data, mas eu aconselharia contra isso. Sempre que você estiver criando uma raiz de URL, os dados na coleção deve ser acessível em sua forma natural. Em um aplicativo de blog, é natural que se organizar por data. No entanto, a ordem natural de um aplicativo de estoque não é por data, mas sim por ordem de ID. Assim, as ordens de raiz URL vai ter literalmente milhões de pedidos a ela associados. Se acontece um pedido para pedir todas as ordens, o servidor terá de dar todos esses pedidos. No caso de um banco de dados SQL, se uma tabela tem milhões e milhões de registros, e alguém executa a consulta SELECT * FROM tabela, o banco não vai perguntar: "Você tem certeza sobre isso?" O banco de dados irá adiante e selecione todos os registros, apesar de não ser eficiente.

Você pode criar filtros para otimizar o acesso às ordens. Por exemplo, se você quiser encontrar todas as encomendas em 2006, você pode executar a URL / serviços / pedidos /? Ano = 2006. Você também pode converter os parâmetros de consulta em uma exibição de URL, como / services/orders/2006. Se você usa o parâmetro de consulta ou a abordagem URL ver depende de sua preferência. Existe um filtro que vai causar problemas, e se relaciona com os usuários. Em qualquer sistema fim, você tem vários usuários. Um pedido de negociação de ações não é diferente. O que faz uma aplicação de ações para negociação mais complicada é a de que uma ordem não for cumprida automaticamente. Não poderia nunca ser cumprida, e pode até ser cancelada. Se um sistema de ordem não tem a capacidade de filtrar por comerciante, você poderia executar em uma situação onde um operador poderá abrir uma posição e outro operador fecha uma posição.

Em teoria, você poderia comprar e vender uma ação futura, ao mesmo tempo (chamado comércio de lavar). Comprando e vendendo ao mesmo tempo, você não é nem ganhar nem perder, pelo menos, diferente da sua taxa de corretagem. Esta técnica de compra e venda, ao mesmo tempo através de dois diferentes corretores é ilegal, porque faz parecer que haja uma ação em uma posição quando, na verdade não há. Portanto, os comerciantes estão vinculados às suas ordens, e as ordens são vinculados aos seus comerciantes. Um refinamento lógico das ordens de URL seria / serviços / pedidos / [comerciante]. Este URL refinado mostra que às vezes você tem que criar URLs que atendem a outras necessidades, como, neste caso, as necessidades do departamento jurídico.

Com este refinamento do URL, o URL não root / serviços / ordens de se tornar obsoleto? Tudo, incluindo os parâmetros de consulta e os URLs de vista, ainda se aplica. A diferença é que a URL para acessar as informações de ordem irá conter o identificador único do comerciante. Assumindo que você vai usar o requinte para a URL, vamos passar por aquilo que os verbos individual fará a níveis URL diferente. Ao nível da URL raiz (/ serviços / pedidos), apenas o HTTP GET aplica. A este nível, você pode filtrar apenas os pedidos que você deseja ver. Você não pode POST, porque a raiz URL está faltando o comerciante ID, e você não pode colocar, porque a raiz de URL é um URL coleção. Finalmente, você não pode apagar, porque isso iria causar a exclusão de todas as ordens e os comerciantes.

Um nível baixo, você teria a URL raiz para um comerciante individual (/ serviços / pedidos / comerciante-ABC). Na URL de raiz para um comerciante individual, somente o HTTP GET e POST são aplicáveis. Você usaria GET para recuperar e, potencialmente, filtro de todos os comércios que um comerciante fez. Por exemplo, você pode filtro para negociações feitas em um determinado mês, ano ou dia. Você pode usar as URLs / services/orders/trader-abc/2006 ou / serviços / pedidos / comerciante-abc? Ano = 2006. O verbo HTTP POST se aplica, pois permite que os usuários enviem uma ordem sem uma ordem de identificação. A apresentação da ordem retorna o URL onde você pode recuperar o status de uma ordem. Se um POST HTTP para a URL / serviços / pedidos / comerciante-ABC é enviada, o URL / serviços / pedidos / trader-abc/123456 poderiam ser devolvidos.

Aplicando o DELETE verbo na raiz URL é um pouco complicado por causa do que significa o verbo. Se você fosse aplicar o verbo DELETE, seria excluir todas as ordens no URL raiz. Em termos práticos, isto é muito mal aconselhado. Uma das razões para apoiar o verbo DELETE é ser capaz de eliminar itens seletivamente através de um parâmetro de consulta, que funciona como um filtro. Por exemplo, para apagar todas as ordens em um ano, você pode usar a URL / serviços / pedidos / comerciante-abc? Ano = 2006. Observe o URL usado para excluir seletivamente é o mesmo que o URL usado para selecionar seletivamente. A diferença é o verbo (DELETE vs GET). É uma ocorrência comum que URLs partida, mas apresentar um comportamento diferente, dependendo do verbo. No contexto do sistema de negociação, as ordens de exclusão teria restrições. Se uma ordem é executar, você não pode excluir a ordem. Verbo PÔR O restante é para a maior parte não interessa ao nível URL raiz. Você usa o verbo PÔR para enviar uma representação completa do recurso para o servidor. No caso da raiz da URL, isto significa que o envio de todas as ordens para o servidor. O problema com o envio de encomendas para o servidor é que você não consegue enviar encomendas completo. A ordem é completa, mas o identificador de ordem (calculado no momento uma ordem é colocada) está ausente. Assim, você não pode colocar para enviar uma nova ordem para o servidor.

Outra razão para o uso de venda será de modificar uma ordem existente. Em geral, este é um uso legítimo, mas é incorreto no contexto do sistema de negociação. O que acontece se você tentar modificar uma ordem que está sendo executado atualmente? Não existe um recurso simples e, portanto, no contexto do sistema de ordem, modificando uma ordem pode causar mais problemas do que soluções. A solução comercial adequado é excluir a ordem e criar um novo. / Services/orders/trader123/order345 representa uma referência URL para o recurso. Em geral, você pode aplicar todos os verbos HTTP, mas você teria que criar limites para refletir processos de negócio. No caso da aplicação profissional, você não pode usar o verbo Coloque em uma nova ordem, porque o aplicativo para não lhe permitem determinar uma ordem de identificação antes do tempo. Você também não pode colocar uma ordem existente, porque isso significaria modificar a ordem, e no contexto de um sistema de negociação, um fim tanto pode executar ou ser cancelada. Você poderia aplicar e usar o verbo DELETE para definir o cancelamento da ordem. A POST para um fim só faria sentido se o POST representa uma ordem que é um cancelamento. A GET pode ser usado para recuperar o status de execução de uma ordem.

/ serviços / histórico representa uma URL raiz usada para recuperar os dados históricos do middleware. Conseguir um feed histórico é único em que há apenas um verbo aplicável a saber, GET. A palavra histórico implica algo que já aconteceu, e você não pode reescrever a história. Reescrevendo a história poderia ocorrer se você tentar usar o verbo PUT ou DELETE. A POST seria aplicável se você usar o POST para criar uma consulta sofisticada. Por exemplo, você pode usar um POST para digitalizar e filtrar os dados históricos de acordo com um conjunto de critérios. Para fazer o serviço da Web histórico tão eficaz quanto possível, é necessário a capacidade de definir procedimentos sofisticados. REST não está preparado para fazer isso, porque REST se baseia no protocolo HTTP. Isso não quer dizer que você não pode usar REST para consultar os dados, mas que você precisa escrever o encanamento. Por exemplo, digamos que você quiser encontrar todas as ações que a comercializados em um intervalo específico, por cinco dias em 10. Você precisaria codificar este tipo de consulta, sob a forma de uma chamada REST que delega para uma consulta relacional, assumindo que os dados são armazenados em um banco de dados relacional. Outra solução é usar um banco de dados baseado em XML, mas você precisará decidir isto antes do tempo. A vantagem de armazenar seus dados em um banco de dados baseado em XML é que você pode facilmente mapear o HTTP consultas com a hierarquia XML. Usando XML Query Language (XQL) e XPath no banco de dados XML, você pode facilmente executar consultas sofisticados sem ter que escrever o encanamento. É preciso lembrar que o poder de um serviço Web histórico reside na forma como você implementa as consultas.

O formato de dados para enviar?Até agora, todos os serviços da Web de exemplo foram explicados em termos de URLs, mas não em termos de conteúdo, que é aceita e gerado. No caso do pedido de blogs introduzida no artigo 4 º, o serviço de Web dados gerados Atom utilizando o tipo MIME application / atom + xml. Quando os serviços de construção REST Web, o tipo de MIME é importante, porque determina como os dados são recebidos e enviados. No caso do pedido de blogar, se o URL Atom é chamado, ele irá gerar um fluxo de XML. Em teoria, a estratégia de desenvolvimento REST é a criação de serviço aweb que é technologyneutral e irá gerar o conteúdo adequado para a consulta à direita.

um artigo submetido por Sonja Lande


Isenção de responsabilidade:O nosso site não se responsabiliza pelo conteúdo deste artigo. Webarticles é uma fonte de informação livre.
Importante: Este artigo "Implementar uma Arquitetura de Serviço Universal Web utilizando Ajax" foi traduzida por um software automático. Nós sentimos muito por quaisquer erros de ortografia que pode ter ocorrido. Obrigado pela sua compreensão.


Online: 303 users browsing the articles directory