خادم ويب صغير ولكنه قوي المكتوب بالكامل في Java SE ثم تم نقله إلى Android.
يقوم الخادم بتنفيذ معظم مواصفات HTTP 1.1 ويوفر واجهة برمجة تطبيقات Servlet مخصصة يمكن استخدامها للتعامل مع الصفحات الديناميكية. تم تصميم واجهة برمجة تطبيقات Servlet بعد javax.servlet API ، لكنها غير متوافقة. تدعم الصفحات الديناميكية ملفات تعريف الارتباط والجلسات وتحميل الملفات وأي شيء آخر لإنشاء تطبيق ويب مشترك.
يجب استخدام غلاف Gradle المقدم لبناء التطبيق:
./gradlew clean build عند تشغيل البناء الكامل لأول مرة ، يجب عليك أولاً تثبيت Android SDK. يمكنك إما تثبيته يدويًا أو استخدام البرنامج النصي التالي الذي يقوم بتنزيل وتثبيت جميع التبعيات المطلوبة على ~/android-sdk .
./installsdk.sh لجعل الأشياء تعمل بعد تسجيل الدخول وتسجيل الدخول مرة أخرى ، قم بتكوين متغير بيئة ANDROID_HOME :
echo " export ANDROID_HOME=~/android-sdk " >> ~ /.bashrc && source ~ /.bashrcإن HTTP Subproject هو قلب التطبيق وهو مستقل على منصة Android.
في الواقع ، كان تطبيق Android مجرد محاولة لإيجاد استخدام أكثر عملية لتطبيق بروتوكول HTTP التجريبي.
كان أحد أهداف التصميم هو الحفاظ على القطع الأثرية الناتجة في الحجم الصغير وأقصى ما من حيث التبعية على المكتبات الأخرى - لا يتطلب أي مكون من مكونات طرف ثالث ، ويستند جميع تنفيذ بروتوكول HTTP إلى توزيع البيانات من مآخذ TCP الخام.
بمجرد أن تنضج حزمة ro.polak.http بدرجة كافية ، سيتم إصدارها باعتبارها قطعة أثرية مستقلة.
يمكن اختبار المشروع الفرعي بالطريقة التالية:
./gradlew :http:clean :http:check -PskipAndroidBuildتم إعادة تمثيل رمز الحزمة الأصلي ومغطى باختبارات الوحدة والتكامل. يجب أن تبقى تغطية الكود أعلى من 90 ٪.
يتم استهداف جميع رمز التطبيق إلى Java 7. كما أنه يجمع عن إصدارات Android SDK <19 (محاولة مع الموارد غير مدعومة ، استخدم finally .
قيد توافق آخر هو أن 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 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. انظر Procfile للحصول على وصف النشر.
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 );
}
}يمكن العثور على مثال servlets في http/src/main/java/مثال.
يمكن فحص استخدام عملي للمرشحات في SecurityFilter.java و LogoutFilter.java من تطبيق المسؤول.
DeploymentDescriptorBuilder هو بديل API لنهج web.xml التقليدي. انظر رمز المثال أدناه.
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 () {
}
}يعرض المثال التالي كيفية دمج محرك Templating JTWIG.
تحتاج أولاً إلى إضافة تبعية JTWIG في ملف Gradle:
// ...
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 ());
}
}






إذا كنت ترغب في إرسال رسالة نصية قصيرة حقيقية ، فيرجى إزالة "واختبار = 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/sendيستخدم Server HTTP Android أيقونات من حزمة "Farm-Fresh Web Icons" المصممة بشكل جميل بواسطة Fatcow Web Hosting! مجموعات الأيقونات هذه مرخصة بموجب ترخيص Creative Commons Attribution 3.0.
تتم مشاركة المشروع على ترخيص GNU GPLV3.
إذا كنت مهتمًا برخصة تجارية مخصصة ، فيرجى إسقاط لي خطًا في piotr [at] polak [dot] ro