如何在特定端口上接收Java中的服务器POST

时间:2018-01-31 02:23:36

标签: java mongodb http

使用java和java.net发布内容很容易。*

但是我想做的恰恰相反,我想要在json格式的POST的接收端。

基本上我想在某个端口上进行推送,然后验证并将内容记录到mongodb中。

我已完成后者的代码(验证并登录mongodb),但不知道如何收听POST。

非常感谢任何指导,线索或示例代码!

3 个答案:

答案 0 :(得分:1)

感谢您的回答,在等待答案时,我正在修补一些不起作用的旧代码,我最终得到了这个。

public static void main(String[] args) throws Exception {
    HttpServer server = HttpServer.create(new InetSocketAddress(8080), 0);
    server.createContext("/requests", new MyHandler());
    server.setExecutor(null); // creates a default executor
    server.start();

}

static class MyHandler implements HttpHandler {
    public void handle(HttpExchange t) throws IOException {

        //Receive the line from the POST
        InputStream in = t.getRequestBody();
        String readLine;
        BufferedReader br = new BufferedReader(new InputStreamReader(in)); 

        //connect to database here

        while (((readLine = br.readLine()) != null)) {          
            try {
                //Print request to console
                System.out.println(readLine);

                //convert Stream string to JSON object
                JSONObject reading = new JSONObject(readLine);

                //parse through the data here

                //insert data into the collection here


            } catch (JSONException e) {
                e.printStackTrace();
            }


        }

        in.close();

        //acknowledge the post request
        String response = "Ack";
        t.sendResponseHeaders(200, response.length());
        OutputStream os = t.getResponseBody();
        os.write(response.getBytes());
        os.close();

    }
}

如果有人想测试代码,只需在终端中输入以下命令即可获得" Ack"回来

curl -d '{"field1":"value1","field2":"value2"}' -H "Content-Type: application/json" -X POST http://localhost:8080/requests

答案 1 :(得分:0)

您可以使用java ServerSocket

ServerSocket serverSocket = new ServerSocket(listeningPort);
Socket socket = null;

while(true){ //Assuming you will be in an infinite listening mode
 socket = serverSocket.accept();
 //Read data from socket using inputStream
}

答案 2 :(得分:0)

一个受yangshun work启发的简单服务器:

import java.net.*;
import java.io.*;
import java.util.*;

class Test {

    static String WEB_ROOT = "./";
    private static Socket s;
    private static InputStream is;
    private static OutputStream os;
    private static DataOutputStream dos;
    private static Req req;

    @SuppressWarnings("resource")
    public static void main(String args[]) {
        ServerSocket serverSocket;
        int port = 47000;
        try {
            serverSocket = new ServerSocket(port);
        } catch (IOException e) {
            e.printStackTrace();
            return;
        }

        while (true) {
            try {
                s = serverSocket.accept();
            } catch (IOException e) {
                e.printStackTrace();
                continue;
            }

            System.out.println("Connection accepted.");

            try {
                is = s.getInputStream();
                os = s.getOutputStream();
                dos = new DataOutputStream(os);
                handleRequests();

                s.close();
                System.out.println("Connection closed\n");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    private static void handleRequests() throws IOException {
        req = new Req(is);

        if (!req.getMethod().matches("(GET|POST)")) {
            String errorMessage = "400: " + req.getPath() + "\r\n";
            dos.writeBytes("HTTP/1.1 400 Bad Request\r\n");
            dos.writeBytes("Content-length: " + errorMessage.length() + "\r\n\r\n");
            dos.writeBytes(errorMessage);
            return;
        }

        if ("/listen".equals(req.getPath()) && req.getMethod().equals("POST")) {
            //TODO your data process code here
            byte[] response = "<html><body>Hello World</body></html>".getBytes("ASCII");
            System.out.println("formData=" + req.getFormData());
            dos.writeBytes("HTTP/1.1 200 OK\r\n");
            dos.writeBytes("Content-Length: " + response.length + "\r\n\r\n");
            dos.write(response);
            dos.flush();
            return;
        } else {
            String errorMessage = "403: " + req.getPath() + "\r\n";
            dos.writeBytes("HTTP/1.1 403 Forbidden\r\n");
            dos.writeBytes("Content-length: " + errorMessage.length() + "\r\n\r\n");
            dos.writeBytes(errorMessage);
            return;
        }
    }
}

class Req {

    private BufferedReader br;
    private String method, path, formData;
    private HashMap<String, String> headers;

    public Req(InputStream is) {
        br = new BufferedReader(new InputStreamReader(is));
        method = "";
        path = "";
        formData = "";
        headers = new HashMap<String, String>();
        try {
            String line = br.readLine();
            if (line == null) {
                return;
            }

            String tokens[] = line.split(" ");

            method = tokens[0];

            if (tokens[1].indexOf("?") != -1) {
                String urlComponents[] = tokens[1].split("\\?");
                path = urlComponents[0];
            } else {
                path = tokens[1];
            }

            int idx;
            line = br.readLine();
            while (!line.equals("")) {
                idx = line.indexOf(":");
                if (idx < 0) {
                    headers = null;
                    break;
                } else {
                    headers.put(line.substring(0, idx).toLowerCase(), line.substring(idx + 1).trim());
                }
                line = br.readLine();
            }

            if (method.equals("POST")) {
                int contentLength = Integer.parseInt(headers.get("content-length"));
                final char[] data = new char[contentLength];
                for (int i = 0; i < contentLength; i++) {
                    data[i] = (char) br.read();
                }
                formData = new String(data);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public String getMethod() {
        return method;
    }

    public String getPath() {
        return path;
    }

    public String getFormData() {
        return formData;
    }
}