2011-10-16 2 views
0

안녕하세요.HttpURLConnection을 사용한 다중 Http 요청 및 응답

매우 간단한 http 봇을 개발 중입니다. javax.net.ssl.HttpsURLConnection 클래스를 사용하고 있으며 여러 요청을해야합니다. 코드의 발췌문 :

HttpURLConnection urlConnection = 
    (HttpURLConnection) new URL(url+"?"+firstParameters).openConnection(); 
urlConnection.setRequestProperty("Accept-Charset", "UTF-8"); 
headerFields = urlConnection.getHeaderFields(); 
keys = headerFields.keySet(); 
for(String key : keys){ 
    if(key != null && key.contains("ookie")){ 
     cookies = urlConnection.getHeaderField(key); 
     break; 
    } 
} 
for(String cookie : cookies.split(";")){ 
    if(cookie.contains("JSESSION")){ 
     JSESSION = cookie.split("=")[1]; 
     break; 
    } 
} 
document = new InputSource(urlConnection.getInputStream()); 
parser.setDocument(document); 
attributesId.put("name",new ArrayList<String>(Arrays.asList(attributesNames))); 
elementsIds.put("INPUT",attributesId); 
elements = parser.getValues(elementsIds); 
for(String attr : attributesNames){ 
    secondParameters = secondParameters.replaceAll("#r"+index,elements.get(attr)); 
} 
urlConnection.getInputStream().close(); 
//Second call 
urlConnection = (HttpURLConnection) new URL(url2).openConnection(); 
urlConnection.setRequestMethod("POST"); 
urlConnection.setRequestProperty("Cookie", "JSESSIONID="+JSESSION); 
urlConnection.setDoInput(true); 
urlConnection.setDoOutput(true); 
payload = new PrintWriter(urlConnection.getOutputStream()); 
payload.print(secondParameters); 
payload.flush(); 
payload.close(); 

먼저 내가 어떤 페이로드하지 않고 요청을하고 난 서버에서 올바른 응답을 볼 수 있어요,하지만 난 지금 (두 번째 요청을 할 때 문제가, 위의 코드를 요약 페이로드 및 JSESSION 쿠키 사용), 첫 번째 요청에서받은 것과 동일한 응답을 받으면 첫 번째 요청을 다시 한 것처럼 보입니다. 제 질문은, 제가 뭘 잘못하고있는 걸까요? 하나의 연결을 열고 헤더와 페이로드를 변경하면됩니까? 여러 HTTP 요청과 관련된 튜토리얼이 있습니다 (혼합 된 메소드, 게시 및 가져 오기 사용)? 사전에

덕분에 내가 전에 HttpURLConnection을 사용한 적이

답변

1

최고의 안부

. 나는 보통 Apache's HTTPClient code을 사용합니다. 그들의 홈페이지에는 많은 문서와 튜토리얼이 있습니다.

HttpURLConnection에 대한 튜토리얼을 찾을 수 없지만 시도해 보았습니다. 여기 당신과 비슷한 작은 프로그램이 있습니다.

http://pastie.org/2706758

이 작동하는 것 같다 :

  1. 는 세션 쿠키를 얻기 위해 초기 요청합니다.
  2. 쿠키를 가져 오기 위해 응답 헤더를 처리합니다.
  3. 요청의 쿠키로 세션을 인증하라는 두 번째 요청을합니다.
  4. 올바른 사용자 이름/암호가 사용 된 경우 결과에 세션이 인증 되었음이 표시됩니다.

    • 당신의 코드가 응답에 여러 Cookie 헤더를 처리하지 않습니다 : 나는 당신의 코드에 대한주의 일의

커플. 내 것이 그걸 더 잘 다루는 것 같다.

  • 필요한 것은 모두 JSESSION입니까? 어쩌면 누락 된 다른 쿠키가있을 수 있습니까?
  • JSESSION 쿠키가 올바르게 설정되었는지 코드를 디버깅 했습니까? 일부 쿠키가 슬립되지 않도록 쿠키 처리 코드에 trim() 호출을 추가했습니다.
  • secondParameters의 실제 가치를 확인할 수 없습니다. 그들이 유효한지 나는 모른다. 코드를 디버그하여 secondParamters 값이 양호한 지 확인하십시오. 내 코드에서 내가 서버에 게시하는 것을 볼 수 있습니다. Btw, + 대신 StringBuilder을 사용하여 빌드하려고합니다.
  • 희망이 도움이됩니다.

    +0

    답변 해 주셔서 감사합니다. 나는 한 가지 더 질문이있다. 나는 당신이 당신이 서버에 게시하는 것을 보았는가? 예를 들어 브라우저와 서버 사이의 트래픽을보기 위해 피들러 (fiddler) 또는 방화 녀 (firebug)를 사용할 수 있습니다. Java 프로그램에서 보내지는 것을보기 위해 무엇을 사용합니까? – tt0686

    +0

    좋은 답변이 없습니다 @ tt0686. 방화범이 끌리는 사람이나 프록시 서버를 사용하고 싶습니다. 나는'HttpURLConnection'을 사용하여 쉽게 할 수있는 방법이 없다. – Gray