java每小时保存http post请求

标签 java http

我正在尝试使用简单的 http 服务器在 aws 上设置一个服务器,并保存每个 http post 请求 header 和负载。

它在本地工作。

通过 ssh 连接到 ec2 服务器后我的步骤:

  • javac 服务器.java
  • sudo nohup java 服务器

它将 header 保存到日志文件,但不保存有效负载,并且不会返回 204 响应。

服务器.java

import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpServer;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.URLDecoder;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.Executors;

public class Server {

    private static final int PORT = 80;
    private static final String FILE_PATH = "/home/ec2-user/logs/";
    private static final String UTF8 = "UTF-8";
    private static final String DELIMITER = "|||";
    private static final String LINE_BREAK = "\n";
    private static final String FILE_PREFIX = "dd_MM_YYYY_HH";
    private static final SimpleDateFormat simpleDateFormat = new SimpleDateFormat(FILE_PREFIX);
    private static final String FILE_TYPE = ".txt";

    public static void main(String[] args) {
        try {
            HttpServer server = HttpServer.create(new InetSocketAddress(PORT), 0);
            server.createContext("/", new HttpHandler() {
                @Override
                public void handle(HttpExchange t) throws IOException {
                    System.out.println("Req\t" + t.getRemoteAddress());
                    InputStream initialStream = t.getRequestBody();
                    byte[] buffer = new byte[initialStream.available()];
                    initialStream.read(buffer);
                    File targetFile = new File(FILE_PATH + simpleDateFormat.format(new Date()) + FILE_TYPE);
                    OutputStream outStream = new FileOutputStream(targetFile, true);
                    String prefix = LINE_BREAK + t.getRequestHeaders().entrySet().toString() + LINE_BREAK + System.currentTimeMillis() + DELIMITER;
                    outStream.write(prefix.getBytes());
                    Map<String, String> queryPairs = new HashMap<>();
                    String params = new String(buffer);
                    String[] pairs = params.split("&");
                    for (String pair : pairs) {
                        int idx = pair.indexOf("=");
                        String key = pair.substring(0, idx);
                        String val = pair.substring(idx + 1);
                        String decodedKey = URLDecoder.decode(key, UTF8);
                        String decodeVal = URLDecoder.decode(val, UTF8);
                        queryPairs.put(decodedKey, decodeVal);
                    }
                    outStream.write(queryPairs.toString().getBytes());
                    t.sendResponseHeaders(204, -1);
                    t.close();
                }
            });
            server.setExecutor(Executors.newCachedThreadPool());
            server.start();
        } catch (Exception e) {
            System.out.println("Exception: " + e.getMessage());
            e.printStackTrace();
        }
    }
}

最佳答案

考虑对您的处理方法进行这些更改。首先,有两件事发生了变化:

  • 它读取完整输入并将其复制到您的文件中(initialStream.available() 可能不是完整的事实)

    <
  • 捕获、记录并重新抛出 IOException(毕竟您没有看到 204)

考虑将输出重定向到文件中,以便稍后检查服务器上发生的情况:

sudo nohup java Server > server.log 2> server.err &

如果您更详细地描述了所需的目标文件结构,我想我们也可以找出一些东西。

            @Override
            public void handle(HttpExchange t) throws IOException {
                try {
                    System.out.println("Req\t" + t.getRemoteAddress());
                    InputStream initialStream = t.getRequestBody();
                    File targetFile = new File(FILE_PATH + simpleDateFormat.format(new Date()) + FILE_TYPE);
                    OutputStream outStream = new FileOutputStream(targetFile, true);
                    // This will copy ENTIRE input stream into your target file
                    IOUtils.copy(initialStream, outStream);
                    outStream.close();

                    t.sendResponseHeaders(204, -1);
                    t.close();
                } catch(IOException e) {
                    e.printStackTrace();
                    throw e;
                }
            }

关于java每小时保存http post请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34269054/

相关文章:

python - 如何从您的 Web 框架将 HTTP 路由动态加载到 NGINX 中?

python - 将 HTTP/1.1 与 SimpleHTTPRequestHandler 结合使用

java - 当Map被mock时如何从Map中获取元素

http - Angular 2,ResolveGuard, Angular http,

java - Hibernate 标准不填充关联

java - 为什么 SQL 中的 CHAR(1) 占用 1 个字节,而 java 中的 char 占用 2 个字节?

php - 如何从用于连接到我的网站的上一页获取 URL?不是链接

http - 自托管 S3 替代方案

java - 通过在请求中发送参数(凭据)登录

java - Java 中的 RESTful 调用