2009-06-03 4 views
11

저는 http 클라이언트 요청을 실행하는 클래스를 만드는 프로젝트에서 작업하고 있습니다. (클래스는 클라이언트 역할을합니다). URL과 요청 메소드 (GET, POST, PUT 등)가 필요하며 URL을 파싱하고 https 또는 http 여부에 따라 HttpsURLConnection 또는 HttpURLConnection을 열 수 있어야합니다 (제공된 URL은 항상 옳은).자바에서는 HttpsURLConnection 또는 HttpURLConnection을 URL 기반으로 만드는 방법은 무엇입니까?

나는 다음을 수행하는 경우 :

자동으로 HTTP와 HTTPS를 모두 수용 할 수 URLConnection에 생성됩니다,하지만 이렇게하면 그때가 요청 방법을 설정할 수있는 방법을 찾을 수없는 그런
URLConnection conn = url.openConnection(); 

(GET, POST 등), HttpsURLConnection 또는 HttpURLConnection 클래스에만 setRequestMethod 메소드가 있기 때문에.

나는 다음과 같은 것을 할 경우 다음 연결이 만들어

if(is_https) 
    HttpsURLConnection conn = (HttpsURLConnection) url.openConnection(); 
else 
    HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 

을하지만이 경우 블록의 외부에서 액세스 할 수 없습니다.

이렇게 할 수 있습니까, 아니면 그냥 포기하고 아파치 httpclient 클래스를 사용해야합니까?

+5

그냥 * 전 * 라 연결 *을 정의하는 경우 * 성명서. 변수 범위를 읽어야합니다. – user359996

답변

28

HttpsURLConnection 당신이 HttpsURLConnection는 필요하지 않습니다, 그래서 당신은 당신이 HttpsURLConnectionconn를 선언 할 수 HttpsURLConnection extends HttpURLConnection 이후

HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
+1

HTTPS가 점점 더 많이 요구되는 시대에 문제가 발생합니다. –

+0

예, 이것은 Java 다형성을 이용하고 있습니다. JVM은 이러한 conn을 사용할 때 적절한 클래스의 메소드를 호출합니다. 따라서 if (is_https)와 같은 형식 검사는이 경우 이해가되지 않습니다. https://docs.oracle.com/javase/tutorial/java/IandI/polymorphism.html – kiedysktos

19

을 할 수 HttpUrlConnection 확장합니다. 이 방법으로 공통 인터페이스 (setRequestMethod())에 액세스 할 수 있습니다. 확장 메서드에 액세스하기 위해

당신이 후 캐스트를 사용해야합니다 (하위 클래스 HttpsURLConnection 만 정의 getCipherSuite()을 같은)을 instanceof를 :

if (conn instanceof HttpsURLConnection) { 
    HttpsURLConnection secured = (HttpsURLConnection) conn; 
    String cipher = secured.getCipherSuite(); 
} 
관련 문제