【发布时间】:2021-04-21 06:12:07
【问题描述】:
我正在尝试用 Java 制作自己的 http 服务器。
该应用程序的目的是将 RequestBody 获取为 json。
将键和值分别解析为字符串。
使用下面的代码运行应用程序以及当我使用 curl 进行测试时。
我得到这个错误。你有什么想法吗?
curl http://127.0.0.1:33334 -d @test.json --header "Content-Type: application/json"
curl: (18) 传输关闭,剩余 32 个字节要读取
Main.java
package com.server.entry.http;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.server.functions.Init;
import com.server.models.ProgramArgument;
import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpServer;
import org.apache.log4j.Logger;
import java.io.*;
import java.net.InetSocketAddress;
import java.util.*;
import java.util.concurrent.Executors;
public class Main {
static Logger logger = Logger.getLogger(Main.class);
public static void main(String[] args) throws Exception {
Init init = new Init();
ProgramArgument programArgument = new ProgramArgument();
init.sortArg(programArgument, args);
Properties p = init.readProperties(programArgument.getPropertiesPath());
init.configruProperties(p.getProperty("logPath"));
String hostName = p.getProperty("hostName");
int port = Integer.parseInt(p.getProperty("port"));
try {
HttpServer server = HttpServer.create(new InetSocketAddress(hostName,port), 10);
server.createContext("/", MyHandler.getInstance());
server.setExecutor(Executors.newCachedThreadPool());
server.start();
} catch (Exception e) {
logger.error("{}", e);
}
}
static class MyHandler implements HttpHandler {
private MyHandler() {}
public static MyHandler getInstance() {
return LazyHolder.INSTANCE;
}
private static class LazyHolder {
private static final MyHandler INSTANCE = new MyHandler();
}
@Override
public void handle(HttpExchange t) throws IOException {
String response = "This is the response";
t.sendResponseHeaders(200, response.length());
ObjectMapper mapper = new ObjectMapper();
Map<String, Object> jsonMap = mapper.readValue(t.getRequestBody(), Map.class);
Iterator<String> itr = jsonMap.keySet().iterator();
StringJoiner keyJoiner = new StringJoiner(",", "", "");
StringJoiner valueJoiner = new StringJoiner("','", "'", "'");
while(itr.hasNext())
{
String key = itr.next();
keyJoiner.add(key);
valueJoiner.add((String)jsonMap.get(key));
}
System.out.println(keyJoiner.toString());
System.out.println(keyJoiner.toString());
OutputStream os = t.getResponseBody();
os.write(response.getBytes());
os.close();
}
}
}
test.json
{
"name": "dddddddddd",
"email": "dddd@ddd.com",
"age": 25
}
我想得到这样的结果。
键:姓名,电子邮件,年龄,值:'dddddddddd','dddd@ddd.com','25'
谢谢你们。
【问题讨论】:
标签: java multithreading http thread-safety httpserver