2012-07-06 69 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);    
    } 
相关问题