小但功能强大的多线程Web服务器完全写在Java SE中,然后移植到Android。
该服务器实现了大多数HTTP 1.1规范,并提供可用于处理动态页面的自定义Servlet API。 Servlet API是在官方javax.servlet API之后设计的,但它不兼容。动态页面支持cookie,会话,文件上传以及其他任何东西来构建常见的Web应用程序。
提供的Gradle包装器应用于构建应用程序:
./gradlew clean build首次运行完整构建时,您必须首先安装Android SDK。您可以手动安装它,或使用以下脚本下载并将所有必需的依赖项安装到~/android-sdk 。
./installsdk.sh要在注销和登录后使事情正常工作,请配置ANDROID_HOME环境变量:
echo " export ANDROID_HOME=~/android-sdk " >> ~ /.bashrc && source ~ /.bashrcHTTP子标记是应用程序的核心,并且在Android平台上是独立的。
实际上,Android应用程序只是试图找到实验性HTTP协议实现的更实际使用。
设计目标之一是在对其他库的依赖方面保持最小的尺寸和简约的人工制品 -它不需要任何第三方组件,所有HTTP协议实现都是基于从原始TCP插座上读取的数据。
一旦ro.polak.http软件包已经足够成熟,它将以独立的人工形式发布。
可以通过以下方式测试子标记:
./gradlew :http:clean :http:check -PskipAndroidBuild原始的软件包代码已被重构并用单元和集成测试覆盖。代码覆盖范围应保持在90%以上。
所有应用程序代码均针对Java 7。它还编译了Android SDK版本<19(不支持资源的尝试,在关闭流时finally其作为替代方案使用ioutilities.closeilities.closeilities.closeilities.closeilities.closeilities.closeilities.closeilities.closeilities.closeilities.closeilitions.closeilities。
另一个兼容性约束是, Random而不是ThreadLocalRandom用于在弦乐中生成随机序列
突变测试可以通过执行以下命令来运行:
./gradlew :http:clean :http:pitest -PskipAndroidBuild然后可以在http/build/reports/pitest/ro.polak.http/index.html和http/build/reports/pitest/ro.polak.http/mutation.xml下找到结果。
独立服务器可用于将http标记捆绑到可运行的服务器实现中。 CLI子标记在Android平台上也独立,它与主APK并未捆绑在一起。
./gradlew :cli:bootRun -PskipAndroidBuild也可以构建一个“ Uber-jar”并将其用作独立应用程序:
./gradlew :cli:fatJar -PskipAndroidBuild然后可以从./cli/build/libs/cli-all.jar中抓住所产生的工件。
独立的服务器罐可以在任何机器上运行以下命令:
java -jar ./cli/build/libs/cli-all.jarjava -jar ./cli/build/libs/cli-all.jar
-Dserver.port=8888
-Dserver.static.path=/www/public_html有关可用参数的完整列表,请参阅httpd.properties。

演示应用程序将自动部署到Heroku,可以在以下位置联系到:
请注意,部署的应用程序不包含管理应用程序,因为仅适用于Android。有关部署说明,请参见copfile。
package example ;
import ro . polak . http . servlet . HttpServletRequest ;
import ro . polak . http . servlet . HttpServletResponse ;
import ro . polak . http . servlet . HttpServlet ;
public class HelloWorld extends HttpServlet {
@ Override
public void service ( HttpServletRequest request , HttpServletResponse response ) {
response . getWriter (). print ( "Hello World!" );
}
} package example ;
import java . io . IOException ;
import ro . polak . http . exception . ServletException ;
import ro . polak . http . servlet . Filter ;
import ro . polak . http . servlet . FilterChain ;
import ro . polak . http . servlet . FilterConfig ;
import ro . polak . http . servlet . HttpServletRequest ;
import ro . polak . http . servlet . HttpServletResponse ;
public class RequestLoggingFilter implements Filter {
private static final Logger LOGGER = Logger . getLogger ( RequestLoggingFilter . class . getName ());
@ Override
public void init ( FilterConfig filterConfig ) throws ServletException {
// Do nothing
}
@ Override
public void doFilter ( HttpServletRequest request , HttpServletResponse response ,
FilterChain filterChain ) throws IOException , ServletException {
LOGGER . fine ( "Handling incoming request " + request . getRequestURL ());
filterChain . doFilter ( request , response );
}
}示例servlet可以在HTTP/SRC/MAIN/JAVA/示例中找到。
可以在Admin应用程序的SecurityFilter.java和Logoutfilter.java上检查过滤器的实际使用。
DeploymentDescriptorBuilder是传统web.xml方法的API替代方法,旨在使Servlet映射构图和过滤注册变得容易。请参阅下面的示例代码。
package example ;
import java . util . List ;
import java . util . regex . Pattern ;
import ro . polak . http . configuration . DeploymentDescriptorBuilder ;
import ro . polak . http . configuration . ServerConfig ;
import ro . polak . http . session . storage . SessionStorage ;
class DeploymentDescriptorFactory {
public List < ServletContextWrapper > buildDeploymentDescriptor ( SessionStorage sessionStorage ,
ServerConfig serverConfig ) {
return DeploymentDescriptorBuilder . create ()
. withSessionStorage ( sessionStorage )
. withServerConfig ( serverConfig )
. addServletContext ()
. withContextPath ( "/example" )
. addFilter ()
. withUrlPattern ( Pattern . compile ( "^.*$" ))
. withUrlExcludedPattern ( Pattern . compile ( "^/(?:Login|Logout)" ))
. withFilterClass ( SecurityFilter . class )
. end ()
. addFilter ()
. withUrlPattern ( Pattern . compile ( "^/Logout$" ))
. withFilterClass ( LogoutFilter . class )
. end ()
. addServlet ()
. withUrlPattern ( Pattern . compile ( "^/Index$" ))
. withServletClass ( Index . class )
. end ()
. addServlet ()
. withUrlPattern ( Pattern . compile ( "^/$" ))
. withServletClass ( Index . class )
. end ()
. end ()
. build ();
}
}使用DefaultServlet实施服务静态资源
实际的资源加载是通过在服务器配置中注册实例ResourceProvider来实现的。
目前有两个资源提供商已实施
package ro . polak . http . resource . provider ;
import ro . polak . http . servlet . impl . HttpServletRequestImpl ;
import ro . polak . http . servlet . impl . HttpServletResponseImpl ;
import java . io . IOException ;
public class DummyResourceProvider implements ResourceProvider {
/**
* Tells whether this resource provider can load resource for given path.
*/
@ Override
public boolean canLoad ( final String path ) {
return false ; // TODO Add some logic
}
/**
* Loads the resource for the given path by copying the stream to the response.getOutputStream().
*/
@ Override
public void load ( final String path ,
final HttpServletRequestImpl request ,
final HttpServletResponseImpl response ) throws IOException {
// TODO Load the stream to response.getOutputStream();
}
/**
* Shuts down the resource provider if necessary, usually closes all open resources.
*/
@ Override
public void shutdown () {
}
}以下示例提出了如何集成JTWIG模板引擎。
首先,您需要在Gradle文件中添加JTwig依赖性:
// ...
dependencies {
// ...
compile ' org.jtwig:jtwig-core:5.87.0.RELEASE '
}
// ...然后它从开箱即用:
package example ;
import org . jtwig . JtwigModel ;
import org . jtwig . JtwigTemplate ;
import ro . polak . http . exception . ServletException ;
import ro . polak . http . servlet . HttpServlet ;
import ro . polak . http . servlet . HttpServletRequest ;
import ro . polak . http . servlet . HttpServletResponse ;
public class Templating extends HttpServlet {
@ Override
public void service ( HttpServletRequest request , HttpServletResponse response )
throws ServletException {
JtwigTemplate template = JtwigTemplate . inlineTemplate ( "Hello {{ var }}" );
JtwigModel model = JtwigModel . newModel (). with ( "var" , "World" );
template . render ( model , response . getOutputStream ());
}
}






如果要发送真实的SMS,请从邮政参数中删除“&test = 1”。
SERVER_IP=192.168.1.1 ; SERVER_PORT=8080 ;
echo " Phone number: " ; read TO ; echo " Message: " ; read MESSAGE ;
wget -qO- --post-data " to= $TO &message= $MESSAGE &test=1 "
http:// $SERVER_IP : $SERVER_PORT /api/1.0/sms/sendAndroid HTTP服务器使用FatCow Web托管的精美设计的“ Farm-Fresh Web图标”包中的图标!这些图标集由创意共享归因3.0许可证获得许可。
该项目在GNU GPLV3许可证上分享。
如果您对专门piotr [at] polak [dot] ro商业许可感兴趣