使用java和java.net发布内容很容易。*
但是我想做的恰恰相反,我想要在json格式的POST的接收端。
基本上我想在某个端口上进行推送,然后验证并将内容记录到mongodb中。
我已完成后者的代码(验证并登录mongodb),但不知道如何收听POST。
非常感谢任何指导,线索或示例代码!
答案 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;
}
}