我想用Java创建一个非常简单的HTTP服务器应用程序。
例如,如果我在localhost端口8080上运行服务器,并且从浏览器发出以下调用,我希望获得一个带有字符串“hello world!”的Json数组:
http://localhost:8080/func1?param1=123¶m2=456
我希望在服务器中有类似这样的东西(非常抽象的代码):
// Retunrs JSON String
String func1(String param1, String param2) {
// Do Something with the params
String jsonFormattedResponse = "['hello world!']";
return jsonFormattedResponse;
}
我想这个函数实际上不应该“返回”json,而是使用某种HTTP响应处理程序或类似的东西发送它...
最简单的方法是什么,而不需要熟悉许多具有特殊功能和方法的第三方库?
您可以使用com.sun.net.httpserver
包中的类:
import com.sun.net.httpserver.Headers;
import com.sun.net.httpserver.HttpServer;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.InetSocketAddress;
import java.net.URI;
import java.net.URLDecoder;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
public class JsonServer {
private static final String HOSTNAME = "localhost";
private static final int PORT = 8080;
private static final int BACKLOG = 1;
private static final String HEADER_ALLOW = "Allow";
private static final String HEADER_CONTENT_TYPE = "Content-Type";
private static final Charset CHARSET = StandardCharsets.UTF_8;
private static final int STATUS_OK = 200;
private static final int STATUS_METHOD_NOT_ALLOWED = 405;
private static final int NO_RESPONSE_LENGTH = -1;
private static final String METHOD_GET = "GET";
private static final String METHOD_OPTIONS = "OPTIONS";
private static final String ALLOWED_METHODS = METHOD_GET + "," + METHOD_OPTIONS;
public static void main(final String... args) throws IOException {
final HttpServer server = HttpServer.create(new InetSocketAddress(HOSTNAME, PORT), BACKLOG);
server.createContext("/func1", he -> {
try {
final Headers headers = he.getResponseHeaders();
final String requestMethod = he.getRequestMethod().toUpperCase();
switch (requestMethod) {
case METHOD_GET:
final Map<String, List<String>> requestParameters = getRequestParameters(he.getRequestURI());
// do something with the request parameters
final String responseBody = "['hello world!']";
headers.set(HEADER_CONTENT_TYPE, String.format("application/json; charset=%s", CHARSET));
final byte[] rawResponseBody = responseBody.getBytes(CHARSET);
he.sendResponseHeaders(STATUS_OK, rawResponseBody.length);
he.getResponseBody().write(rawResponseBody);
break;
case METHOD_OPTIONS:
headers.set(HEADER_ALLOW, ALLOWED_METHODS);
he.sendResponseHeaders(STATUS_OK, NO_RESPONSE_LENGTH);
break;
default:
headers.set(HEADER_ALLOW, ALLOWED_METHODS);
he.sendResponseHeaders(STATUS_METHOD_NOT_ALLOWED, NO_RESPONSE_LENGTH);
break;
}
} finally {
he.close();
}
});
server.start();
}
private static Map<String, List<String>> getRequestParameters(final URI requestUri) {
final Map<String, List<String>> requestParameters = new LinkedHashMap<>();
final String requestQuery = requestUri.getRawQuery();
if (requestQuery != null) {
final String[] rawRequestParameters = requestQuery.split("[&;]", -1);
for (final String rawRequestParameter : rawRequestParameters) {
final String[] requestParameter = rawRequestParameter.split("=", 2);
final String requestParameterName = decodeUrlComponent(requestParameter[0]);
requestParameters.putIfAbsent(requestParameterName, new ArrayList<>());
final String requestParameterValue = requestParameter.length > 1 ? decodeUrlComponent(requestParameter[1]) : null;
requestParameters.get(requestParameterName).add(requestParameterValue);
}
}
return requestParameters;
}
private static String decodeUrlComponent(final String urlComponent) {
try {
return URLDecoder.decode(urlComponent, CHARSET.name());
} catch (final UnsupportedEncodingException ex) {
throw new InternalError(ex);
}
}
}
问题内容: 我正在尝试编写一个简单的Java http客户端,该客户端仅打印出服务器响应的一行。我的问题是服务器没有响应。这是我所拥有的,正在编译并且没有明显错误地运行,只是在键入主机名(例如“ www.google.com”)后挂起: 有什么建议?请注意,这假设存在一个“ index.html”-即使为true,它仍会挂起。 问题答案: 我认为我可以通过对代码进行少量更改来重现该问题,因此现在它
我是编码和Java的新手,我已经创建了一个简单的客户端-服务器程序,客户端可以请求一个文件。它的内容将显示在浏览器页面中,还有一些细节,如数据类型和长度。我现在有一个问题,我不确定如何在浏览器中显示正确连接的服务器响应,如“HTTP/1.1 200 OK”和关闭的连接,如“Connection: close”。我有一个处理响应的方法,如下所示: 对我如何做到这一点有什么建议吗?非常感谢。
正如前面的章节中讨论的那样,当一个 Web 服务器响应一个 HTTP 请求时,响应通常包括一个状态行、一些响应报头、一个空行和文档。一个典型的响应如下所示: HTTP/1.1 200 OK Content-Type: text/html Header2: ... ... HeaderN: ... (Blank Line) <!doctype ...> <html> <head>...</he
问题内容: 我最近公布的我面对这个问题的详细说明,这里的SO。由于我无法发送实际的请求,因此我使用了超时来模拟异步行为。在@Gloopy的帮助下,从模型到视图的数据绑定工作正常 现在,当我使用而不是(在本地测试)时,我可以看到异步请求成功,并且在我的服务中充满了json响应。但是,我的看法没有更新。 在这里更新了Plunkr 问题答案: 这是一个可以满足您需求的Plunk:http ://plnk
我是Java的新手,我正在尝试学习线程和套接字。所以决定按照官方的java教程制作简单的客户机-服务器应用程序。我的想法很简单--服务器等待连接,如果出现,它就用新的套接字、输入和输出生成新线程。客户端->建立连接;带有套接字、输入、输出和stdIn的新线程(读取行,然后发送到服务器)。但是我的代码出了点问题(不知道为什么)。连接已经建立,没有例外。谁能解释一下为什么不工作,如何修复它?您还可以对
问题内容: 我最近公布的我面对这个问题的详细说明,这里的SO。由于我无法发送实际的请求,因此我使用了超时来模拟异步行为。在@Gloopy的帮助下,从模型到视图的数据绑定工作正常 现在,当我使用而不是(在本地测试)时,我可以看到异步请求成功,并且在我的服务中充满了json响应。但是,我的看法没有更新。 问题答案: 这个想法是您直接使用promise及其promise,然后使用它们的“ then”函数