2012-07-06 73 views
0

我有一些東西我想實現。Java - 在同一個連接上執行一個http請求POST和GET

我已經運行在我的本地Web應用程序在8080端口上

我有一個HTTP服務器上的本地主機上運行:9005。

我有一個JSP表單,它將信息傳遞給一個servlet java類,然後通過數據字符串將HTTP post發送到HTTP Server localhost:9010上的URL。

我需要做的是執行POST和GET作爲同一連接的一部分。我讓他們作爲兩個獨立的電話工作,但不在同一個連接上。它需要是相同的連接,因爲我發佈數據時,HTTP服務器接收這些數據,處理它並將唯一數據輸出到此URL。因此,GET需要成爲POST的同一連接的一部分。

任何人都可以請幫忙嗎?

這是我處理請求的Java代碼:

import java.net.HttpURLConnection; 
    import java.net.MalformedURLException; 
    import java.net.URL; 
    import java.net.URLEncoder; 
    import java.io.BufferedReader; 
    import java.io.InputStreamReader; 
    import java.io.IOException; 
    import java.io.OutputStreamWriter; 
    import java.io.UnsupportedEncodingException; 
    import javax.servlet.*; 
    import javax.servlet.http.*; 


    import java.util.List; 
    import java.util.Map.Entry; 

    public class ProcessRequest { 

     public void sendRequestToGateway() throws Throwable{ 

      String message = URLEncoder.encode("OP1387927", "UTF-8");  

      try {   
       URL url = new URL("http://localhost:9005/json");    
       HttpURLConnection connection = (HttpURLConnection) url.openConnection();    
       connection.setDoOutput(true);    
       connection.setRequestMethod("POST");    
       OutputStreamWriter writer = new OutputStreamWriter(connection.getOutputStream());   
       writer.write("operator=" + message);  
       writer.close(); 

       System.out.println("connection.getResponseCode() : " + connection.getResponseCode()); 
       System.out.println("connection.getResponseMessage()" + connection.getResponseMessage()); 

       if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) { 

        receiveMessageFromGateway(); 

       } else {     
        // Server returned HTTP error code.    
       } 

       //receiveMessageFromGateway(); 

      } catch (MalformedURLException e) {    
       // ...   
      } catch (IOException e) {   
        // ...   
      } 
     } 

     public void receiveMessageFromGateway() throws Throwable { 


      HttpURLConnection client = null; 
      OutputStreamWriter wr = null; 
      BufferedReader rd = null; 
      StringBuilder sb = null; 
      String line = null; 

      try { 

       URL url = new URL("http://localhost:9005/json"); 
       client = (HttpURLConnection) url.openConnection(); 
       client.setRequestMethod("GET"); 
       client.setDoOutput(true); 
       client.setReadTimeout(10000); 

       client.connect(); 
       System.out.println(" *** headers ***"); 
       for (Entry<String, List<String>> headernew : client.getHeaderFields().entrySet()) { 
       System.out.println(headernew.getKey() + "=" + headernew.getValue()); 
       } 

       System.out.println(" \n\n*** Body ***"); 
       rd = new BufferedReader(new InputStreamReader(client.getInputStream())); 
       sb = new StringBuilder(); 

       while ((line = rd.readLine()) != null) { 
       sb.append(line + '\n'); 
       } 

       System.out.println("body=" + sb.toString()); 

      } finally { 
       client.disconnect(); 
       rd = null; 
       sb = null; 
       wr = null; 
      } 
     } 

    } 

回答

1

一般來說,你無法控制連接複用HttpUrlConnection。你可能能夠將你的連接轉換到特定的實現類並干擾它,但這是一個非常不穩定的方式。

根據要求,Apache HttpClient可能是更好的選擇。

3

你爲什麼不直接從原始POST返回結果?

0

您可以使用Apache HTTP Client進行此操作。它非常簡單。

如果您正在使用Maven,只需添加以下行到您的POM文件:

<dependency> 
    <groupId>org.apache.httpcomponents</groupId> 
    <artifactId>httpclient</artifactId> 
    <version>4.3.3</version> 
</dependency> 

在這個例子中,我提交POST請求和GET請求後。

請看:

public static String get(String p_url) throws IOException 
{  

     CloseableHttpClient httpclient = HttpClients.createDefault(); 

     // First request: POST 
     HttpPost httpPost = new HttpPost("http://the-api-url.com/Login/Auth&token=12345")); 
     CloseableHttpResponse response_post = httpclient.execute(httpPost);     
     System.out.println(response_post.getStatusLine());   
     HttpEntity entity_post = response_post.getEntity();   
     System.out.println(EntityUtils.toString(entity_post)); 

     // Second request: GET 
     HttpGet httpGet = new HttpGet(p_url); 
     CloseableHttpResponse response_get = httpclient.execute(httpGet); 
     System.out.println(response_get.getStatusLine());   
     HttpEntity entity_get = response_get.getEntity();   
     System.out.println(EntityUtils.toString(entity_get)); 

     response_post.close(); 
     response_get.close();   
     return EntityUtils.toString(entity_get);    
    } 
相關問題