2011-11-23 4 views
3

보기 : 서버로 요청을 보낼 방법 및 URL 번호가 연결쿠키가 HttpURLConnection에서 Java로 설정되는시기는 언제입니까? 이 코드에서

HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();  
conn.setRequestProperty("Cookie","JSESSIONID=" + J_SESSION_ID); 
conn.connect(); 

URL 번호에 대해서 openConnection :

public static String get(String url, Properties parameters) throws MalformedURLException, IOException{ 
     url = buldGetUrl(url, parameters); 
     if(DEBUG) System.out.println("[HTTP GET REQUEST]"); 
     if(DEBUG) System.out.println(" URL: " + url); 
     HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection(); 
     conn.setRequestProperty("Cookie","JSESSIONID=" + J_SESSION_ID); 
     conn.connect(); 

     if(DEBUG) System.out.println("\n[HTTP GET RESPONSE]"); 
     if(DEBUG) System.out.println("==== Response Headers ====="); 
     String serverCookies = conn.getHeaderField("Set-Cookie"); 
     if(serverCookies != null){ 
      String[] cookies = serverCookies.split(";"); 
      for(String s : cookies){ 
       s = s.trim(); 
       if(s.split("=")[0].equals("JSESSIONID")){ 
        J_SESSION_ID = s.split("=")[1]; 
        if(DEBUG) System.out.println(" Session ID Found: " + J_SESSION_ID); 
        break; 
       } 
      } 
     } 
     if(DEBUG){ 
      for(String s : conn.getHeaderFields().keySet()){ 
       if(s == null) 
        System.out.println(" " + conn.getHeaderField(s)); 
       else 
        System.out.println(" " + s + "=" + conn.getHeaderField(s)); 
      } 
     } 

     if(DEBUG) System.out.println("==== Response Content ====="); 
     BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream())); 
     String str = null; 
     StringBuilder sb = new StringBuilder(); 
     while ((str = br.readLine()) != null) { 
      sb.append(str + System.getProperty("line.separator")); 
      if(DEBUG) System.out.println(str); 

     } 
     br.close(); 
     return sb.toString(); 
    } 

이 세 줄을 주목하세요? 대답이 openConnection 방법 인 경우 요청을 이미 보낸 후에 쿠키를 설정할 수 있습니까? 대답이 인 경우 메서드를 연결하면 어떻게 될까요? 이 코드는 아래 내가 서버에서 응답을받을 수도 작동합니다 뜻이 URL가 참조하는 자원에의 통신 링크를 엽니 다()

url = buldGetUrl(url, parameters); 
     if(DEBUG) System.out.println("[HTTP GET REQUEST]"); 
     if(DEBUG) System.out.println(" URL: " + url); 
     HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection(); 

     if(DEBUG) System.out.println("\n[HTTP GET RESPONSE]"); 
     if(DEBUG) System.out.println("==== Response Headers ====="); 
     String serverCookies = conn.getHeaderField("Set-Cookie"); 
     if(serverCookies != null){ 
      String[] cookies = serverCookies.split(";"); 
      for(String s : cookies){ 
       s = s.trim(); 
       if(s.split("=")[0].equals("JSESSIONID")){ 
        J_SESSION_ID = s.split("=")[1]; 
        if(DEBUG) System.out.println(" Session ID Found: " + J_SESSION_ID); 
        break; 
       } 
      } 
     } 
     if(DEBUG){ 
      for(String s : conn.getHeaderFields().keySet()){ 
       if(s == null) 
        System.out.println(" " + conn.getHeaderField(s)); 
       else 
        System.out.println(" " + s + "=" + conn.getHeaderField(s)); 
      } 
     } 

     if(DEBUG) System.out.println("==== Response Content ====="); 
     BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream())); 
     String str = null; 
     StringBuilder sb = new StringBuilder(); 
     while ((str = br.readLine()) != null) { 
      sb.append(str + System.getProperty("line.separator")); 
      if(DEBUG) System.out.println(str); 

     } 
     br.close(); 
     return sb.toString(); 

답변

3

방법은 연결 그러한가 확립되어 있지 않은 경우. getInputStream(), getResponseCode() 또는 getResponseMessage() 메서드는 서버와의 통신 링크를 만듭니다.

+0

하지만 당신은 그것을 설명 할 방법에 대해 설명합니다. 두 번째 예제에서는 open() 메서드를 전혀 호출하지 않았지만 서버에서도 응답을 얻을 수 있습니다. – CaiNiaoCoder

+0

@CaiNiaoCoder이 부분을보십시오 http://stackoverflow.com/questions/2151359/java-httpurlconnection-doesnt-connect-when-i-call-connect. 질문 주셔서 감사합니다. – vinoth

1

일반적으로이 HttpURLConnection 클래스의 메서드가 호출 될 때마다 #connect()는 실제로 불필요합니다. 응답 정보 (예 : #getInputStream()/getResponseCode()/getHeaderFields()/etc.)가 호출되면 암시 적 연결이 실제로 수행됩니다. 내가 맞습니까?

나의 이해는 아래의 토론을 기반으로합니다 Using java.net.URLConnection to fire and handle HTTP requests

관련 문제