Server web multithreaded kecil tapi kuat ditulis sepenuhnya di Java SE dan kemudian diangkut ke Android.
Server mengimplementasikan sebagian besar spesifikasi HTTP 1.1 dan menyediakan API servlet khusus yang dapat digunakan untuk menangani halaman dinamis. Servlet API dirancang setelah javax.servlet API resmi namun tidak kompatibel. Halaman dinamis mendukung cookie, sesi, unggahan file dan apa pun untuk membangun aplikasi web umum.
Pembungkus lulusan yang disediakan harus digunakan untuk membangun aplikasi:
./gradlew clean build Saat menjalankan build penuh untuk pertama kalinya Anda harus terlebih dahulu menginstal Android SDK. Anda dapat menginstalnya secara manual atau menggunakan skrip berikut yang mengunduh dan menginstal semua dependensi yang diperlukan ke ~/android-sdk .
./installsdk.sh Untuk membuat semuanya berfungsi setelah Anda masuk dan masuk kembali, konfigurasikan variabel lingkungan ANDROID_HOME :
echo " export ANDROID_HOME=~/android-sdk " >> ~ /.bashrc && source ~ /.bashrcHTTP Subproject adalah jantung dari aplikasi dan independen pada platform Android.
Sebenarnya aplikasi Android hanyalah upaya untuk menemukan penggunaan yang lebih praktis dari implementasi protokol HTTP eksperimental.
Salah satu tujuan desain adalah untuk menjaga artefak yang dihasilkan dalam ukuran kecil dan minimalis dalam hal ketergantungan pada perpustakaan lain - tidak memerlukan komponen pihak ketiga , semua implementasi protokol HTTP didasarkan pada penguraian data penguraian dari soket TCP mentah.
Setelah paket ro.polak.http cukup matang, itu akan dirilis sebagai artefak independen.
Subproyject dapat diuji dengan cara berikut:
./gradlew :http:clean :http:check -PskipAndroidBuildKode paket asli telah direfaktor dan ditutupi dengan unit dan tes integrasi. Cakupan kode harus disimpan di atas 90%.
Semua kode aplikasi ditargetkan ke Java 7. Ini juga mengkompilasi untuk versi Android SDK <19 (coba dengan sumber daya tidak didukung, gunakan finally .
Kendala kompatibilitas lain adalah bahwa Random alih -alih ThreadLocalRandom digunakan untuk menghasilkan urutan acak dalam stringutilitas
Tes mutasi dapat dijalankan dengan mengeksekusi perintah berikut:
./gradlew :http:clean :http:pitest -PskipAndroidBuild Hasilnya kemudian dapat ditemukan di bawah http/build/reports/pitest/ro.polak.http/index.html dan http/build/reports/pitest/ro.polak.http/mutation.xml .
Server mandiri dapat digunakan untuk menggabungkan subproyject http ke dalam implementasi server yang dapat dijalankan. Subproyik CLI juga independen di platform Android, tidak dibundel dengan APK utama.
./gradlew :cli:bootRun -PskipAndroidBuildDimungkinkan juga untuk membangun satu "uber-jar" dan menggunakannya sebagai aplikasi mandiri:
./gradlew :cli:fatJar -PskipAndroidBuild Artefak yang dihasilkan kemudian dapat diambil dari ./cli/build/libs/cli-all.jar .
Jar server mandiri dapat dijalankan pada mesin apa pun dengan perintah berikut:
java -jar ./cli/build/libs/cli-all.jarjava -jar ./cli/build/libs/cli-all.jar
-Dserver.port=8888
-Dserver.static.path=/www/public_htmlUntuk daftar lengkap parameter yang tersedia, lihat httpd.properties.

Aplikasi demo secara otomatis digunakan ke Heroku dan dapat dihubungi di:
Harap dicatat bahwa aplikasi yang digunakan tidak berisi aplikasi admin karena itu hanya tersedia untuk Android. Lihat Procfile untuk deskripsi penempatan.
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 );
}
}Contoh servlet dapat ditemukan di http/src/main/java/contoh.
Penggunaan praktis filter dapat diperiksa di SecurityFilter.java dan LogoutFilter.java dari aplikasi admin.
DeploymentDescriptorBuilder adalah alternatif API untuk pendekatan web.xml tradisional yang bertujuan untuk membuat pemetaan servlet membangun dan membuat pendaftaran filter mudah. Lihat contoh kode di bawah ini.
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 ();
}
}Melayani sumber daya statis diimplementasikan menggunakan defaultServlet
Pemuatan sumber daya aktual diimplementasikan dengan mendaftarkan instance ResourceProvider di konfigurasi server.
Saat ini ada dua penyedia sumber daya yang diterapkan
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 () {
}
}Contoh berikut menyajikan cara mengintegrasikan mesin templating JTWIG.
Pertama, Anda perlu menambahkan ketergantungan JTWIG di file gradle Anda:
// ...
dependencies {
// ...
compile ' org.jtwig:jtwig-core:5.87.0.RELEASE '
}
// ...Kemudian bekerja di luar kotak:
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 ());
}
}






Jika Anda ingin mengirim SMS sungguhan, silakan hapus "& test = 1" dari Posting Params.
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 Server menggunakan ikon dari paket "Web Farm-Fresh yang dirancang dengan indah oleh Fatcow Web Hosting! Set ikon ini dilisensikan di bawah lisensi Creative Commons Attribution 3.0.
Proyek ini dibagikan pada lisensi GNU GPLV3.
Jika Anda tertarik dengan lisensi komersial khusus, silakan kirimkan saya di piotr [at] polak [dot] ro