Existe uma maneira de criar um servidor HTTP muito básico (suportando apenas GET / POST) em Java usando apenas a API Java SE, sem escrever código para analisar manualmente solicitações HTTP e formatar manualmente respostas HTTP? A API do Java SE encapsula bem a funcionalidade do cliente HTTP no HttpURLConnection, mas existe um analógico para a funcionalidade do servidor HTTP?
Só para esclarecer, o problema que tenho com muitos exemplos de ServerSocket que eu vi on-line é que eles fazem sua própria formatação de análise / resposta de solicitação e manipulação de erros, o que é tedioso, propenso a erros e provavelmente não é abrangente, e estou tentando evitá-lo por esses motivos.
Como um exemplo da manipulação manual de HTTP que estou tentando evitar:
http://java.sun.com/developer/technicalArticles/Networking/Webserver/WebServercode.html
fonte
Respostas:
Desde o Java SE 6, há um servidor HTTP interno no
SunOracle JRE. Ocom.sun.net.httpserver
resumo do pacote descreve as classes envolvidas e contém exemplos.Aqui está um exemplo de kickoff copiado de seus documentos (para todas as pessoas que tentam editá-lo, no entanto, porque é um pedaço feio de código, por favor, não, esta é uma pasta de cópia, não minha, além disso, você nunca deve editar citações, a menos que elas tenham sido alteradas na fonte original). Você pode simplesmente copiá-lo e executá-lo no Java 6+.
Deveria ser notado que a
response.length()
parte no exemplo deles é ruim, deveria ter sidoresponse.getBytes().length
. Mesmo assim, ogetBytes()
método deve especificar explicitamente o conjunto de caracteres que você especifica no cabeçalho da resposta. Infelizmente, apesar de mal orientado para os iniciantes, é apenas um exemplo básico de kickoff.Execute-o e vá para http: // localhost: 8000 / test e você verá a seguinte resposta:
Quanto ao uso de
com.sun.*
classes, observe que isso é, ao contrário do que alguns desenvolvedores pensam, absolutamente proibido pela FAQ bem conhecida Por que os desenvolvedores não devem escrever programas que chamam de pacotes 'sun' . Essa FAQ refere-se aosun.*
pacote (comosun.misc.BASE64Encoder
) para uso interno pelo Oracle JRE (que mataria seu aplicativo quando você o executasse em um JRE diferente), não aocom.sun.*
pacote. A Sun / Oracle também acaba de desenvolver software sobre a API Java SE, como qualquer outra empresa, como Apache e assim por diante. O uso decom.sun.*
classes é desencorajado (mas não proibido) quando se trata da implementação de uma determinada API Java, como GlassFish ( implemento Java EE), Mojarra (impl JSF), Jersey (impl JAX-RS), etc.fonte
sun.*
comcom.sun.*
. Por exemplo, você vê alguma documentação dasun.*
API? Veja aqui: java.sun.com/products/jdk/faq/faq-sun-packages.html Ele diz alguma coisacom.sun.*
? Ocom.sun.*
é usado apenas para seu próprio software público, que não faz parte da API Java. Eles também desenvolvem software sobre a API Java, como qualquer outra empresa.@jdk.Exported
no código-fonte do OpenJDK, o que significa que a API é considerada pública e estará disponível no Java 9 (alguns outroscom.sun.*
pacotes ficarão indisponíveis devido ao Project Jigsaw).Confira o NanoHttpd
"O NanoHTTPD é um servidor HTTP leve projetado para incorporação em outros aplicativos, lançado sob uma licença BSD modificada.
Ele está sendo desenvolvido no Github e usa o Apache Maven para compilações e testes de unidade "
fonte
GET /../../blahblah http/1.1
é emitida e o servidor caminha acima da raiz do site e entra no arquivo de sistema, servindo arquivos que podem ser usados para comprometer ou atacar remotamente o sistema, como um arquivo de senha.A solução com.sun.net.httpserver não é portátil entre os JREs. É melhor usar a API oficial de serviços da web em javax.xml.ws para inicializar um servidor HTTP mínimo ...
EDIT: isso realmente funciona! O código acima se parece com Groovy ou algo assim. Aqui está uma tradução para Java que eu testei:
fonte
text/xml
.Gosto dessa pergunta porque é uma área em que há inovação contínua e sempre é necessário ter um servidor leve, especialmente quando se fala em servidores incorporados em dispositivos pequenos. Eu acho que as respostas se enquadram em dois grandes grupos.
Embora eu possa considerar bibliotecas HTTP como: Jetty , Apache Http Components , Netty e outras mais como um recurso de processamento HTTP bruto. A rotulagem é muito subjetiva e depende do tipo de coisa que você solicitou para entregar em sites pequenos. Faço essa distinção no espírito da pergunta, particularmente a observação sobre ...
Essas ferramentas brutas permitem fazer isso (conforme descrito em outras respostas). Eles realmente não se prestam a um estilo pronto para criar um servidor leve, incorporado ou mini. Um minisservidor é algo que pode oferecer funcionalidade semelhante a um servidor da Web com todas as funções (como, por exemplo, Tomcat ), sem sinos e assobios, baixo volume, bom desempenho 99% do tempo. Um servidor thin parece mais próximo do fraseado original um pouco mais do que bruto, talvez com uma funcionalidade de subconjunto limitada, o suficiente para fazer você parecer bem 90% do tempo. Minha idéia de matéria-prima seria me faz ficar bem 75% - 89% do tempo sem design e codificação extras. Acho que se / quando você atingir o nível dos arquivos WAR, deixamos o "pequeno" para os servidores bonsi que se parece com tudo o que um grande servidor faz menor.
Opções de servidor thin
Opções de mini-servidor:
Entre as outras coisas a considerar, eu incluiria autenticação, validação, internacionalização, usando algo como FreeMaker ou outra ferramenta de modelo para renderizar a saída da página. Caso contrário, o gerenciamento da edição e parametrização HTML provavelmente fará com que o trabalho com HTTP pareça noughts-n-crosses. Naturalmente, tudo depende de quão flexível você precisa ser. Se for uma máquina de fax baseada em menus, pode ser muito simples. Quanto mais interações, mais ' espessa ' sua estrutura precisa ser. Boa pergunta, boa sorte!
fonte
Dê uma olhada no servidor da web "Jetty" Jetty . Excelente peça de software de código aberto que parece atender a todos os seus requisitos.
Se você insistir em criar o seu próprio, dê uma olhada na classe "httpMessage".
fonte
Era uma vez, eu estava procurando por algo semelhante - um servidor HTTP leve, mas totalmente funcional, que eu pudesse incorporar e personalizar facilmente. Encontrei dois tipos de possíveis soluções:
Então ... eu decidi escrever JLHTTP - O Java HTTP Lightweight Server .
Você pode incorporá-lo em qualquer projeto como um único arquivo de origem (se bem longo) ou como um frasco de ~ 50K (~ 35K despojado) sem dependências. Ele se esforça para ser compatível com RFC e inclui extensa documentação e muitos recursos úteis, mantendo o mínimo de inchaço.
Os recursos incluem: hosts virtuais, serviço de arquivo do disco, mapeamentos do tipo MIME via arquivo mime.types padrão, geração de índice de diretório, arquivos de boas-vindas, suporte para todos os métodos HTTP, ETags condicional e suporte ao cabeçalho If- *, codificação de transferência em pedaços, gzip / deflate compactação, HTTPS básico (conforme fornecido pela JVM), conteúdo parcial (continuação do download), manipulação de dados de várias partes / formulário para upload de arquivos, manipuladores de contexto múltiplos via API ou anotações, análise de parâmetros (string de consulta ou x-www-form-urlencoded corpo), etc.
Espero que outros achem útil :-)
fonte
Um servidor web muito básico escrito em java pode ser encontrado aqui http://library.sourcerabbit.com/v/?id=19
fonte
O Spark é o mais simples, aqui está um guia de início rápido: http://sparkjava.com/
fonte
É possível criar um servidor de https que fornece suporte básico para servlets J2EE com apenas o JDK e a API do servlet em apenas algumas linhas de código.
Achei isso muito útil para servlets de teste de unidade, pois ele é iniciado muito mais rapidamente do que outros contêineres leves (usamos jetty para produção).
A maioria dos httpservers muito leves não fornece suporte para servlets, mas precisamos deles, então pensei em compartilhar.
O exemplo abaixo fornece suporte básico ao servlet ou lança e UnsupportedOperationException para coisas ainda não implementadas. Ele usa o com.sun.net.httpserver.HttpServer para suporte básico a http.
fonte
Eu recomendo fortemente a pesquisa no Simple , especialmente se você não precisar dos recursos do Servlet, mas simplesmente acessar os objetos de solicitação / resposta. Se você precisa do REST, pode colocar Jersey no topo, se precisar gerar HTML ou similar, há o Freemarker. Eu realmente amo o que você pode fazer com essa combinação e há relativamente pouca API para aprender.
fonte
Esse código é melhor que o nosso, você só precisa adicionar 2 libs: javax.servelet.jar e org.mortbay.jetty.jar .
Molhe da classe:
Classe de servlet:
fonte
*.Servlet.jar
e*.jetty.jar
obviamente não fazem parte do Java SE.Você também pode dar uma olhada em algumas estruturas de aplicativos NIO, como:
fonte
Todas as respostas acima detalham detalhes sobre o único manipulador de solicitações encadeado principal.
configuração:
Permite que várias solicitações sejam veiculadas por meio de vários threads usando o serviço executor.
Portanto, o código final será algo como abaixo:
fonte
checkout Simples . é um servidor embutido bastante simples, com suporte integrado para diversas operações. Eu particularmente amo o seu modelo de rosqueamento ..
Surpreendente!
fonte
Confira
takes
. Consulte https://github.com/yegor256/takes para obter informações rápidasfonte
E o projeto HttpCore do Apache Commons ?
A partir do site: ... Objetivos HttpCore
fonte
Tente este https://github.com/devashish234073/Java-Socket-Http-Server/blob/master/README.md
Esta API cria um servidor HTTP usando soquetes.
Por exemplo, aqui está como o construtor na
Response.java
classe converte uma resposta bruta em uma resposta http:fonte
Você pode escrever um servidor Jetty Java incorporado bastante simples .
Jetty incorporado significa que o servidor (Jetty) é enviado junto com o aplicativo, em vez de implantá-lo no servidor Jetty externo.
Portanto, se em uma abordagem não incorporada, seu aplicativo da Web foi incorporado ao arquivo WAR, implantado em algum servidor externo ( Tomcat / Jetty / etc), no Jetty incorporado, você escreve o aplicativo da Web e instancia o servidor do jetty na mesma base de código.
Um exemplo para o servidor Java Jetty incorporado, você pode clonar e usar o git : https://github.com/stas-slu/embedded-jetty-java-server-example
fonte