Java - Как открыть один HttpURLConnection для GET и POST

Запрос состоит в том, чтобы получить содержимое из URL-адреса и правильно обработать его (каждый раз по-разному), а затем отправить ответ обратно на тот же URL-адрес. Я сталкиваюсь с "Не могу сбросить метод: уже подключен", когда я пытаюсь установить setRequestMethod ("POST") после выполнения метода GET. Мой код, как показано ниже

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

    }

}

2 ответа

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

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

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

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

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

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

     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();
   }
Другие вопросы по тегам