2016-11-06 69 views
1

我已经学会了如何发送和处理Rest API请求,所以我相当满意外部用户如何通过诸如打开API连接,设置请求方法等方法向API提交请求并处理返回的消息。
但是,现在是创建我自己的Rest Web Service的时候了,而且我有点卡住了,因为我不完全熟悉服务器如何处理通信。
我可以建立一个很好的连接来允许通信,但我并不特别满意连接的细节。
下面是我初始化服务器的方法,服务器然后将等待,直到连接并进行简短对话,直到客户端断开连接。构建一个Rest服务器

public void Initialise(){ 
     try { 
      ServerSocket s = new ServerSocket(21); //TODO: Change port? 
      while(true){ 
       Socket incoming = s.accept(); 
       Runnable r = new ConnectionManager(incoming); 
       Thread t = new Thread(r); 
       t.start(); 
      } 
     } 
     catch(IOException e){ 
     e.printStackTrace(); 
     } 
} 

和处理连接的类。

public class ConnectionManager implements Runnable{ 
private Socket incoming; 

public ConnectionManager(Socket i){ 
    this.incoming = i; 
} 

@Override 
public void run() { 
    try{ 
     try{ 
      //Initialise IOStreams 
      InputStream inStream = incoming.getInputStream(); 
      OutputStream outStream = incoming.getOutputStream(); 

      Scanner in = new Scanner(inStream); 
      PrintWriter out = new PrintWriter(outStream, true); 

      out.println("TODO: Change this message. Press Q to quit."); 

      boolean done = false; 
      while (!done && in.hasNextLine()){ 
       String line = in.nextLine(); 
       out.println("Echo: " +line); 
       if (line.trim().equals("Q")){ 
        done = true; 
       } 
      } 
     } 
     finally{ 
      incoming.close(); 
     } 
    } 
    catch (IOException e){ 
     e.printStackTrace(); 
    } 
} 

}

我不知道怎么做的,是我如何开始建立侦听REST请求的应用程序,然后对其进行处理相应。我确信在检查连接时,我可以设计用于处理API请求的功能,但是我不知道如何查看用户发送的Rest请求的具体细节。
例如,如果用户发送的请求,如

GET exampleAPI/endpoint?params 

如何检查请求,并随后进行相应的处理呢?
例如,在客户端上,当你发起请求,方法如使用HttpURLConnection类的可以让你跟随

HttpURLConnection c = (HttpURLConnection) targetURL.openConnection(); 
c.setRequestMethod("GET"); 

的过程,这将允许你提交一个GET请求到目标URI。
翻阅关于Socket的Java文档,我不太清楚我如何查看传入请求和活动连接。
我错过了什么,或者只是把事情搞错了?

+0

为什么不能使用JAX-WS或Jersy?有限制吗? – developer

+0

不是一个答案,但我会建议使用这个框架。它们为您正在尝试手写的所有内容提供功能。 – UnholySheep

+0

@javaguy没有限制,我只是缺乏构建Rest服务器的经验,所以我不确定最佳实践和设置。 – Potatosaurus

回答

3

正如我在我的评论中提到,您可以使用新泽西/春/等。这不是你重写逻辑为整个服务器和处理多个线程,等等。

此外,你应该知道有一个JDKAPI被称为JAX-RS(规范加实施)的相同。你可以看看here

你可以看看hereSpring REST Controllerhere泽西岛。

我建议你先通过JDK JAX-RS API,然后你可以看看Spring and Jersey

还有其他厂商实施JAX-RS,你可能会感兴趣,你可以看看here进行比较的JAX-RS实现。

P.S.:你也应该知道Spring不符合JAX-RS API,而是他们有自己的API

+0

我想补充一点,在Java中,最常见的组合是Tomcat + JAX-RS的实现,例如,泽西/杰克逊或码头 –

+1

是的,我同意你的意见 – developer