2017-11-23 17 views
0

POST 요청에서 양식 데이터를 추출하는 방법. $ curl -X POST -d asdf = blah http://localhost:8000/proxy/http://httpbin.org/post - asdf = blah를 추출해야합니다.Java의 POST 요청에서 양식 데이터를 가져 오는 방법

내가 현재하고있는 방식은 내가 특정 형식으로 읽은 데이터에 크게 의존합니다 (양식 데이터가 항상 마지막 줄에 있다고 가정합니다). 읽을 데이터의 형식에 의존하지 않는 데이터를 얻는 더 좋은 (그리고/또는 더 간단한) 방법이 있습니까?

(참고 : GET 및 POST 요청 모두 프록시 거래) :

public class ProxyThread3 extends Thread { 
private Socket clientSocket = null; 

private OutputStream clientOutputStream; 


private static final int BUFFER_SIZE = 32768; 

public ProxyThread3(Socket socket) { 
    super("ProxyThread"); 
    this.clientSocket = socket; 

} 


public void run() { 
    try { 

     clientOutputStream = clientSocket.getOutputStream(); 

     // Read request 
     InputStream clientInputStream = clientSocket.getInputStream(); 

     byte[] b = new byte[8196]; 
     int len = clientInputStream.read(b); 

     String urlToCall = ""; 


     if (len > 0) { 

      String userData = new String(b, 0, len); 

      String[] userDataArray = userData.split("\n"); 

      //Parse first line to get URL 
      String firstLine = userDataArray[0]; 
      for (int i = 0; i < firstLine.length(); i++) { 

       if (firstLine.substring(i).startsWith("http://")) { 

        urlToCall = firstLine.substring(i).split(" ")[0]; 
        break; 
       } 

      } 


      //get request type 
      String requestType = firstLine.split(" ")[0]; 

      String userAgentHeader = ""; 


      //get USER-AGENT Header and Accept Header 
      for (String data : userDataArray) { 

       if (data.startsWith("User-Agent")) { 

        userAgentHeader = data.split(":")[1].trim(); 
        break; 

       } 

      } 


      switch (requestType) { 

       case "GET": { 

        sendGetRequest(urlToCall, userAgentHeader); 
        break; 
       } 

       case "POST": { 


        String postParams = null; 

        //Get Form Data 
        if (!userDataArray[userDataArray.length - 1].isEmpty()) { 

         postParams = userDataArray[userDataArray.length - 1]; 

        } 

        sendPostRequest(urlToCall, userAgentHeader, postParams); 
        break; 
       } 


      } 

     } else { 
      clientInputStream.close(); 
     } 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally { 
     try { 
      clientSocket.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 


private void sendPostRequest(String urlToCall, String userAgentHeader, String postParams) throws IOException { 


    URL urlToWriteAndReadFrom = new URL(urlToCall); 

    HttpURLConnection httpURLConnection = (HttpURLConnection) urlToWriteAndReadFrom.openConnection(); 

    httpURLConnection.setRequestMethod("POST"); 

    // set User-Agent header 
    httpURLConnection.setRequestProperty("User-Agent", userAgentHeader); 


    httpURLConnection.setDoOutput(true); 

    OutputStream urlOutputStream = httpURLConnection.getOutputStream(); 

    if (postParams != null) { 
     urlOutputStream.write(postParams.getBytes()); 
     urlOutputStream.flush(); 

    } 


    urlOutputStream.close(); 

    int responseCode = httpURLConnection.getResponseCode(); 


    if (responseCode == HttpURLConnection.HTTP_OK) { // success 


     InputStream dataReader = httpURLConnection.getInputStream(); 


     //begin send response to client 
     byte inputInBytes[] = new byte[BUFFER_SIZE]; 

     assert dataReader != null; 

     int index = dataReader.read(inputInBytes, 0, BUFFER_SIZE); 

     while (index != -1) { 
      clientOutputStream.write(inputInBytes, 0, index); 
      index = dataReader.read(inputInBytes, 0, BUFFER_SIZE); 
     } 
     clientOutputStream.flush(); 


    } 


} 

private void sendGetRequest(String urlToCall, String userAgentHeader) throws IOException { 


    URL urlToReadFrom = new URL(urlToCall); 
    HttpURLConnection httpURLConnection = (HttpURLConnection) urlToReadFrom.openConnection(); 

    // set True since reading and getting input 
    httpURLConnection.setDoInput(true); 
    httpURLConnection.setRequestMethod("GET"); 

    // set User-Agent header 
    httpURLConnection.setRequestProperty("User-Agent", userAgentHeader); 

    int responseCode = httpURLConnection.getResponseCode(); 

    if (responseCode == HttpURLConnection.HTTP_OK) { // success 


     InputStream dataReader = httpURLConnection.getInputStream(); 


     //begin send response to client 
     byte inputInBytes[] = new byte[BUFFER_SIZE]; 

     assert dataReader != null; 

     int index = dataReader.read(inputInBytes, 0, BUFFER_SIZE); 

     while (index != -1) { 
      clientOutputStream.write(inputInBytes, 0, index); 
      index = dataReader.read(inputInBytes, 0, BUFFER_SIZE); 
     } 
     clientOutputStream.flush(); 


    } 


} 

}

PS 여기

내가 작성한 코드입니다. 나는이 모든 것에 익숙하지 않기 때문에 코드에 오류가 있다면 그것을 지적 해주십시오.

답변

0

다음은 POST 및 GET 요청을 처리하는 Java HTTP 서버를 만드는 방법에 대한 전체 예제입니다. 공유되고 그건

https://www.codeproject.com/Tips/1040097/Create-a-Simple-Web-Server-in-Java-HTTP-Server

이 나는 ​​아파치 톰캣 같은 아닌 서버가 만들어 J2EE 서블릿을 사용하는 경우 제 3 자 라이브러리 또는 Grizzly 같은 경량 자바 서버 또는 Jetty를 사용하는 것이 좋습니다 것, 아주 원시적이다 이 목적을 위해.

+0

감사! 이 예제는 내가하는 일이 전부는 아니지만 POST 요청에서 양식 데이터를 가져 오는 데 많은 도움이되었습니다. – freakin09