2012-07-06 1 views
0

J'ai quelque chose que j'essaie d'atteindre.Java - Effectuer une requête HTTP POST et GET sur la même connexion

J'ai une application Web en cours d'exécution sur mon localhost sur le port 8080.

J'ai un serveur HTTP en cours d'exécution sur localhost: 9005.

J'ai un formulaire JSP qui transmet des informations à une classe java de servlet, qui à son tour exécute le message HTTP à l'URL sur l'hôte local HTTP Server: 9010 avec la chaîne de données.

Ce que je dois faire est d'effectuer le POST et GET dans le cadre de la même connexion. Je les ai travailler comme deux appels distincts, mais pas sur la même connexion. Il doit être la même connexion, car je publie des données, le serveur HTTP prend ces données, les traite et génère des données uniques à cette URL. Par conséquent, le GET doit faire partie de la même connexion que POST.

Quelqu'un peut-il aider s'il vous plaît?

Ceci est mon processus demande le code de 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; 
      } 
     } 

    } 

Répondre

1

En général, vous ne pouvez pas contrôler la réutilisation des connexions avec HttpUrlConnection. Vous pourriez être en mesure de jeter votre connexion à la classe d'implémentation spécifique et interférer avec elle, mais c'est une façon horriblement instable de le faire.

Apache HttpClient est probablement une meilleure option, compte tenu des exigences. Pourquoi ne pas simplement renvoyer le résultat du POST d'origine?

0

Vous pouvez utiliser Apache HTTP Client pour cela. C'est très simple.

Si vous utilisez Maven, il suffit d'ajouter les lignes suivantes dans votre fichier POM:

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

Dans cet exemple, je vous soumets une requête POST et après qu'une requête GET.

Jetez un oeil:

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);    
    }