2016-11-07 6 views
0

Запрос состоит в том, чтобы ПОЛУЧИТЬ контент с URL-адреса и обрабатывать контент (каждый раз каждый раз), затем POST ответ обратно на тот же URL-адрес. Я встречаю «Не могу сбросить метод: уже подключен», когда я пытаюсь установить RequestMethod («POST») после выполнения GET-метода. Мой код нижеJava - Как открыть один HttpURLConnection для GET и POST

public class MyClass { 

    /** 
    * @param args 
    */ 

    public MyClass() {}; 

    public void process() { 
     String url = "http://www.somesite.com/"; 
     String strPage = null; 
     int n = 0; 

     try{ 
      URL urlObj = new URL(url); 
      HttpURLConnection urlConnection = 
        (HttpURLConnection)urlObj.openConnection(); 
      InputStream in = urlConnection.getInputStream(); 

      BufferedReader reader = new BufferedReader(new InputStreamReader(in)); 

      String strWhole = null; 
      while(null != (strPage = reader.readLine())){ 
       strWhole += strPage; 
      } 

      //handle content here and calculate result 
      ... ... 
      //send result below 

      urlConnection.setRequestMethod("POST"); 
      urlConnection.setDoOutput(true); 
      String urlParameters = "aa=bb&cc=dd&ee=ff"; 

      DataOutputStream wr = new DataOutputStream(urlConnection.getOutputStream()); 
      wr.writeBytes(urlParameters); 
      wr.flush(); 
      wr.close();    

      InputStream in1 = urlConnection.getInputStream(); 

      BufferedReader reader1 = new BufferedReader(new InputStreamReader(in)); 


      while(null != (strPage = reader1.readLine())){ 
       System.out.println(strPage); 
      } 

      reader1.close();    
     } 
     catch(Exception e){ 
      String exception = e.getMessage(); 
      System.out.println(exception); 
      if (reader != null) { 
       reader.close(); 
      } 

      if (reader1 != null) { 
       reader1.close(); 
      } 
     } 

     return; 

    } 

    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     MyClass dp = new MyClass(); 
     dp.process(); 

    } 

} 

ответ

0

Сначала вы должны установить все параметры. Вот код, который я использую в своей заявке:

 HttpURLConnection connection = (HttpURLConnection)new URL(url).openConnection(); 
    connection.setDoOutput(true); 
    connection.setDoInput(true); 
    connection.setInstanceFollowRedirects(false); 
    connection.setRequestMethod("POST"); 
    connection.setRequestProperty("app_token", "my token"); // optional header you can set with your own data 
    connection.setRequestProperty("charset", "utf-8"); 
    connection.setRequestProperty("Content-Length", String.valueOf(urlParameters.getBytes().length)); 
    connection.setUseCaches (false); 
    DataOutputStream wr = new DataOutputStream(connection.getOutputStream()); 
    wr.writeBytes(urlParameters); 
    wr.flush(); 
    wr.close(); 
    connection.disconnect(); 
    InputStream is = connection.getInputStream(); 
    byte[] b = readWithoutSize(is); 
    is.close(); 

readWithoutSize является:

public static byte[] readWithoutSize(InputStream is) throws IOException 
    { 
     ByteArrayOutputStream baos = new ByteArrayOutputStream(4096); 
     byte[] buf = new byte[512]; 
     int leu; 
     while ((leu = is.read(buf)) != -1) 
     baos.write(buf,0,leu); 
     return baos.toByteArray(); 
    } 
+0

@Guiherme, когда я должен назвать openConnection()? –

+0

Прошу прощения, я исправил код. –

+0

@Guiherme Спасибо, это не работает для меня. Решение kgeorgiy - это то, что мне нужно :) –

1

невозможно повторно использовать HttpURLConnection экземпляр. Но documentation говорит, что под капотом, Java повторно соединения для вас:

JDK поддерживает HTTP/1.1 и HTTP/1.0 постоянные соединения.

Когда приложение заканчивает чтение тела ответа или когда приложение вызывает close() на InputStream возвращенном URLConnection.getInputStream(), обработчик протокола HTTP в JDK будет пытаться очистить соединение и в случае успеха, поставить соединение в кэш соединений для повторного использования будущими HTTP-запросами.

Поддержка HTTP keep-Alive выполняется прозрачно.

Следовательно, нет необходимости повторно использовать соединения вручную.

+0

он не работает после вызова функции close() и снова выполняет POST, попав в ту же проблему. –

+0

Он не должен работать после 'close()', просто откройте новое соединение 'openConnection'. – kgeorgiy

+0

правый, твой путь - то, что мне нужно, спасибо :) –