SkillAgentSearch skills...

NanoHTTPd2

简、小、香的新一代Web小型后端开发框架 A Light Java HTTP Framework

Install / Use

/learn @huzpsb/NanoHTTPd2
About this skill

Quality Score

0/100

Supported Platforms

Universal

README

NanoHTTPd2

新一代中小型后端开发框架

“杀鸡别用牛刀;写小型web后端别用企业级框架!”

Version 1.5

简介

本项目是 NanoHTTPd (https://github.com/gseguin/NanoHTTPd) 的延续版。

同时,加入了很多~~方便外包人摸鱼~~简化小型项目开发难度的功能。

功能亮点

  • 伪数据库。能够直接把ConcurrentHashMap(前提是Key和Value都可以序列化)当作数据库使用;甚至可以在不同版本的序列化对象中自动互相转换。
  • 伪JSON。可以把简单对象直接作为JSON格式返回。
  • CSV导出。可以导出所有数据为CSV表格。自动添加表头。
  • 多线程。全自动多线程香不香?
  • 文件支持。能够处理含文件的POST/GET请求;有FileServer工具类,可以简单轻松的提供本地文件。
  • Logger与Console。摆脱庞大而臃肿还爆出过RCE的Log4j!

(不要跟我讲数据量特别、特别大的时候的性能。你代码有多少人用你自己不清楚?Spring的确适合企业开发,但是一个中学的评教系统啊之类的真的就没必要了好吧。)

Edit:进行了一次压力测试。测试接口为DBServer的/create接口。 100线程,每个线程1k次调用。耗时67s,相当于每次调用0.67ms,失败次数0。100k个记录总没话说了吧?67秒里面是有一次save的,线程安全也没有问题。TwT

框架特色

  • 小:框架本身只有50kb,支持边缘计算(树莓派)等应用场景。
  • 简:框架不依赖任何第三方库,你可以轻易地理解、修改并重新编译框架,实现自己需要的功能。
  • 香:以下例子只有2kb(算上所有类4kb,你可以在example文件夹里找到它的完整代码),却实现了一个带伪数据库和4个接口的后端。
package example.Backend;

import nano.http.d2.console.Logger;
import nano.http.d2.core.Response;
import nano.http.d2.database.NanoDb;
import nano.http.d2.json.NanoJSON;
import nano.http.d2.serve.ServeProvider;
import nano.http.d2.utils.Mime;
import nano.http.d2.utils.Status;

import java.util.Properties;

public class DBServer implements ServeProvider {
    public static final NanoDb<String, User> udb;

    static {
        try {
            udb = new NanoDb<>("students.udb");
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public Response serve(String uri, String method, Properties header, Properties parms, Properties files) {
        try {
            switch (uri) {
                case "/create":
                    User u = new User();
                    u.age = Integer.parseInt(parms.getProperty("age"));
                    u.home = parms.getProperty("home");
                    udb.set(parms.getProperty("name"), u);
                    return new Response(Status.HTTP_OK, Mime.MIME_PLAINTEXT, "Success");
                case "/delete":
                    udb.remove(parms.getProperty("name"));
                    return new Response(Status.HTTP_OK, Mime.MIME_PLAINTEXT, "Success");
                case "/download":
                    Response r = new Response(Status.HTTP_OK, Mime.MIME_DEFAULT_BINARY, udb.toCSV(User.class, "姓名", Locates.getLocalizer()));
                    r.addHeader("Content-Disposition", "attachment; filename=\"download.csv\"");
                    return r;
                case "/query":
                    Response r2 = new Response(Status.HTTP_OK, Mime.MIME_JSON, NanoJSON.asJSON(udb.query(parms.getProperty("name")), User.class));
                    r2.addHeader("Access-Control-Allow-Origin", "*");
                    return r2;
                default:
                    Logger.warning(uri);
                    // Please read the notes in ExampleServer.java (package: nano.http.d2.serve)
                    // You may want to use FileServer.serveFile() here!
                    return new Response(Status.HTTP_NOTFOUND, Mime.MIME_PLAINTEXT, "Not found");
            }
        } catch (Exception e) {
            return new Response(Status.HTTP_INTERNALERROR, Mime.MIME_PLAINTEXT, "Mal-formatted request!");
        }
    }
}

/create
创建一个学生
接口类型:POST
参数:
name - 学生名称
age - 学生年龄
home - 学生家庭住址
返回:
200 - 成功
其他 - 失败原因

/delete
删除一个学生
接口类型:POST
参数:
name - 学生名称
返回:
200 - 成功
其他 - 失败原因

/download
接口类型:GET
以电子表格的形式下载所有学生的信息
参数:
无
返回:
电子表格。(设定的是浏览器访问)

/query
查询一个学生的个人信息
接口类型:GET
参数:
name - 学生名称
返回:
json - 成功
例子: {age:15,home:"BeiJing"}
其他 - 失败原因

伪数据库会被保存至“students.udb”文件。

使用教程

  • 懒得写,反正写了也没有人看
  • 可以去看看example文件夹,里面有完整的例子。
  • ~~还有问题就请您RTFSC吧,就50kb也不多~~

联系信息

NanoHTTPd原作者:

NanoHTTPd2修改者:

~~毒瘤出题人~~测试人员:

完结撒花

( Ad: 如果您是个人开发者而不是接单佬,也一定请康康咱的https://github.com/BukkitHTTP/BukkitHTTP )

View on GitHub
GitHub Stars14
CategoryData
Updated12mo ago
Forks3

Languages

Java

Security Score

72/100

Audited on Apr 4, 2025

No findings