小但功能強大的多線程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商業許可感興趣