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