This commit is contained in:
@@ -130,7 +130,8 @@
|
||||
</services>
|
||||
|
||||
<!--
|
||||
REST的核心配置项, 存在[rest]节点则Server启动时会加载REST服务, 当Server为SNCP协议时,则SncpServer会变成REST的HttpServer, 节点可以多个
|
||||
REST的核心配置项
|
||||
当Server为HTTP协议时, rest节点才有效。存在[rest]节点则Server启动时会加载REST服务, 节点可以多个
|
||||
base: REST服务的BaseServlet,必须是 org.redkale.net.http.RestHttpServlet 的子类,该属性值默认值为 org.redkale.net.http.DefaultRestServlet。
|
||||
autoload:默认值"true" 默认值. 加载当前server所能使用的Servce对象;
|
||||
mustsign:默认值"true" 是否只加载标记为RestService的Service类,默认只加载标记RestService且ignore=false的Service
|
||||
|
||||
@@ -31,15 +31,12 @@ public class NodeHttpServer extends NodeServer {
|
||||
|
||||
protected final boolean rest;
|
||||
|
||||
protected final boolean sncp;
|
||||
|
||||
protected final HttpServer httpServer;
|
||||
|
||||
public NodeHttpServer(Application application, AnyValue serconf) {
|
||||
super(application, createServer(application, serconf));
|
||||
this.httpServer = (HttpServer) server;
|
||||
this.rest = serconf == null ? false : serconf.getAnyValue("rest") != null;
|
||||
this.sncp = serconf == null ? false : serconf.getBoolValue("_$sncp", false); //SNCP服务以REST启动时会赋值_$sncp=true
|
||||
}
|
||||
|
||||
private static Server createServer(Application application, AnyValue serconf) {
|
||||
@@ -184,7 +181,7 @@ public class NodeHttpServer extends NodeServer {
|
||||
if (!autoload && !includeValues.contains(stypename)) return;
|
||||
if (!restFilter.accept(stypename)) return;
|
||||
|
||||
RestHttpServlet servlet = httpServer.addRestServlet(stype, wrapper.getName(), wrapper.getService(), baseServletClass, prefix, sncp, (AnyValue) null);
|
||||
RestHttpServlet servlet = httpServer.addRestServlet(wrapper.getName(), stype, wrapper.getService(), baseServletClass, prefix, (AnyValue) null);
|
||||
resourceFactory.inject(servlet, NodeHttpServer.this);
|
||||
if (finest) logger.finest("Create RestServlet[resource=" + wrapper.getName() + "] = " + servlet);
|
||||
if (ss != null) {
|
||||
|
||||
@@ -41,13 +41,12 @@ public final class HttpServer extends Server<String, HttpContext, HttpRequest, H
|
||||
this.prepare.addServlet(servlet, prefix, conf, mappings);
|
||||
}
|
||||
|
||||
public <S extends Service, T extends RestHttpServlet> RestHttpServlet addRestServlet(Class<S> serviceType,
|
||||
final String name, final S service, final Class<T> baseServletClass, final String prefix) {
|
||||
return addRestServlet(serviceType, name, service, baseServletClass, prefix, false, null);
|
||||
public <S extends Service, T extends RestHttpServlet> RestHttpServlet addRestServlet(String name, Class<S> serviceType, S service, Class<T> baseServletClass, String prefix) {
|
||||
return addRestServlet(name, serviceType, service, baseServletClass, prefix, null);
|
||||
}
|
||||
|
||||
public <S extends Service, T extends RestHttpServlet> RestHttpServlet addRestServlet(Class<S> serviceType,
|
||||
final String name, final S service, final Class<T> baseServletClass, final String prefix, final boolean sncp, AnyValue conf) {
|
||||
public <S extends Service, T extends RestHttpServlet> RestHttpServlet addRestServlet(
|
||||
final String name, Class<S> serviceType, final S service, final Class<T> baseServletClass, final String prefix, AnyValue conf) {
|
||||
RestHttpServlet servlet = null;
|
||||
for (final HttpServlet item : ((HttpPrepareServlet) this.prepare).getServlets()) {
|
||||
if (!(item instanceof RestHttpServlet)) continue;
|
||||
@@ -58,9 +57,11 @@ public final class HttpServer extends Server<String, HttpContext, HttpRequest, H
|
||||
break;
|
||||
}
|
||||
} catch (NoSuchFieldException | SecurityException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
if (servlet == null) servlet = Rest.createRestServlet(baseServletClass, serviceType, sncp);
|
||||
final boolean first = servlet == null;
|
||||
if (servlet == null) servlet = Rest.createRestServlet(baseServletClass, serviceType);
|
||||
try { //若提供动态变更Service服务功能,则改Rest服务无法做出相应更新
|
||||
Field field = servlet.getClass().getDeclaredField(Rest.REST_SERVICE_FIELD_NAME);
|
||||
field.setAccessible(true);
|
||||
@@ -83,7 +84,7 @@ public final class HttpServer extends Server<String, HttpContext, HttpRequest, H
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException(serviceType + " generate rest servlet error", e);
|
||||
}
|
||||
this.prepare.addServlet(servlet, prefix, conf);
|
||||
if (first) this.prepare.addServlet(servlet, prefix, conf);
|
||||
return servlet;
|
||||
}
|
||||
|
||||
|
||||
@@ -62,7 +62,7 @@ public final class Rest {
|
||||
return (!controller.name().isEmpty()) ? controller.name() : serviceType.getSimpleName().replaceAll("Service.*$", "").toLowerCase();
|
||||
}
|
||||
|
||||
static <T extends RestHttpServlet> T createRestServlet(final Class<T> baseServletClass, final Class<? extends Service> serviceType, final boolean sncp) {
|
||||
static <T extends RestHttpServlet> T createRestServlet(final Class<T> baseServletClass, final Class<? extends Service> serviceType) {
|
||||
if (baseServletClass == null || serviceType == null) return null;
|
||||
if (!RestHttpServlet.class.isAssignableFrom(baseServletClass)) return null;
|
||||
int mod = baseServletClass.getModifiers();
|
||||
@@ -85,7 +85,7 @@ public final class Rest {
|
||||
|
||||
final String reqInternalName = Type.getInternalName(HttpRequest.class);
|
||||
final String respInternalName = Type.getInternalName(HttpResponse.class);
|
||||
final String attrInternalName = Type.getDescriptor(org.redkale.util.Attribute.class);
|
||||
final String attrInternalName = Type.getInternalName(org.redkale.util.Attribute.class);
|
||||
final String retInternalName = Type.getInternalName(RetResult.class);
|
||||
final String serviceTypeInternalName = Type.getInternalName(serviceType);
|
||||
|
||||
@@ -259,41 +259,37 @@ public final class Rest {
|
||||
String n = null;
|
||||
String comment = "";
|
||||
int radix = 10;
|
||||
RestHeader annhead = null;
|
||||
RestSessionid annsid = null;
|
||||
RestCookie anncookie = null;
|
||||
RestAddress annaddr = null;
|
||||
if (!sncp) { //SNCP协议中忽略参数中特定的注解,此处获取的只是SNCP请求端信息,并不是真实用户请求端的信息
|
||||
annhead = param.getAnnotation(RestHeader.class);
|
||||
if (annhead != null) {
|
||||
n = annhead.name();
|
||||
radix = annhead.radix();
|
||||
comment = annhead.comment();
|
||||
if (n.isEmpty()) throw new RuntimeException("@RestHeader.value is illegal in " + method);
|
||||
}
|
||||
anncookie = param.getAnnotation(RestCookie.class);
|
||||
if (anncookie != null) {
|
||||
if (annhead != null) throw new RuntimeException("@RestCookie and @RestHeader cannot on the same Parameter in " + method);
|
||||
if (ptype != String.class) throw new RuntimeException("@RestCookie must on String Parameter in " + method);
|
||||
n = anncookie.name();
|
||||
radix = anncookie.radix();
|
||||
comment = anncookie.comment();
|
||||
if (n.isEmpty()) throw new RuntimeException("@RestCookie.value is illegal in " + method);
|
||||
}
|
||||
annsid = param.getAnnotation(RestSessionid.class);
|
||||
if (annsid != null) {
|
||||
if (annhead != null) throw new RuntimeException("@RestSessionid and @RestHeader cannot on the same Parameter in " + method);
|
||||
if (anncookie != null) throw new RuntimeException("@RestSessionid and @RestCookie cannot on the same Parameter in " + method);
|
||||
if (ptype != String.class) throw new RuntimeException("@RestSessionid must on String Parameter in " + method);
|
||||
}
|
||||
annaddr = param.getAnnotation(RestAddress.class);
|
||||
if (annaddr != null) {
|
||||
if (annhead != null) throw new RuntimeException("@RestAddress and @RestHeader cannot on the same Parameter in " + method);
|
||||
if (anncookie != null) throw new RuntimeException("@RestAddress and @RestCookie cannot on the same Parameter in " + method);
|
||||
if (annsid != null) throw new RuntimeException("@RestAddress and @RestSessionid cannot on the same Parameter in " + method);
|
||||
if (ptype != String.class) throw new RuntimeException("@RestAddress must on String Parameter in " + method);
|
||||
}
|
||||
|
||||
RestHeader annhead = param.getAnnotation(RestHeader.class);
|
||||
if (annhead != null) {
|
||||
n = annhead.name();
|
||||
radix = annhead.radix();
|
||||
comment = annhead.comment();
|
||||
if (n.isEmpty()) throw new RuntimeException("@RestHeader.value is illegal in " + method);
|
||||
}
|
||||
RestCookie anncookie = param.getAnnotation(RestCookie.class);
|
||||
if (anncookie != null) {
|
||||
if (annhead != null) throw new RuntimeException("@RestCookie and @RestHeader cannot on the same Parameter in " + method);
|
||||
if (ptype != String.class) throw new RuntimeException("@RestCookie must on String Parameter in " + method);
|
||||
n = anncookie.name();
|
||||
radix = anncookie.radix();
|
||||
comment = anncookie.comment();
|
||||
if (n.isEmpty()) throw new RuntimeException("@RestCookie.value is illegal in " + method);
|
||||
}
|
||||
RestSessionid annsid = param.getAnnotation(RestSessionid.class);
|
||||
if (annsid != null) {
|
||||
if (annhead != null) throw new RuntimeException("@RestSessionid and @RestHeader cannot on the same Parameter in " + method);
|
||||
if (anncookie != null) throw new RuntimeException("@RestSessionid and @RestCookie cannot on the same Parameter in " + method);
|
||||
if (ptype != String.class) throw new RuntimeException("@RestSessionid must on String Parameter in " + method);
|
||||
}
|
||||
RestAddress annaddr = param.getAnnotation(RestAddress.class);
|
||||
if (annaddr != null) {
|
||||
if (annhead != null) throw new RuntimeException("@RestAddress and @RestHeader cannot on the same Parameter in " + method);
|
||||
if (anncookie != null) throw new RuntimeException("@RestAddress and @RestCookie cannot on the same Parameter in " + method);
|
||||
if (annsid != null) throw new RuntimeException("@RestAddress and @RestSessionid cannot on the same Parameter in " + method);
|
||||
if (ptype != String.class) throw new RuntimeException("@RestAddress must on String Parameter in " + method);
|
||||
}
|
||||
|
||||
RestParam annpara = param.getAnnotation(RestParam.class);
|
||||
if (annpara != null) radix = annpara.radix();
|
||||
if (annpara != null) comment = annpara.comment();
|
||||
@@ -889,7 +885,7 @@ public final class Rest {
|
||||
}
|
||||
mv.visitInsn(RETURN);
|
||||
maxLocals++;
|
||||
} else if (!sncp && RestOutput.class.isAssignableFrom(returnType)) {
|
||||
} else if (RestOutput.class.isAssignableFrom(returnType)) {
|
||||
mv.visitVarInsn(ASTORE, maxLocals);
|
||||
if (jsvar == null) {
|
||||
mv.visitVarInsn(ALOAD, 0);
|
||||
|
||||
@@ -625,7 +625,7 @@ public final class Utility {
|
||||
conn.disconnect();
|
||||
return remoteHttpContent(ctx, method, newurl, headers, body);
|
||||
}
|
||||
InputStream in = rs < 400 ? conn.getInputStream() : conn.getErrorStream();
|
||||
InputStream in = rs < 400 || rs == 404 ? conn.getInputStream() : conn.getErrorStream();
|
||||
ByteArrayOutputStream out = new ByteArrayOutputStream(1024);
|
||||
byte[] bytes = new byte[1024];
|
||||
int pos;
|
||||
|
||||
Reference in New Issue
Block a user