2013-02-10 5 views
3

HTTP 헤더가 포함 된 문자열에서 데이터를 추출하는 더 나은 방법을 찾고 있습니다. 예를 들어, "Content-Length : 160 \ r \ n"문자열의 내용 길이 부분에서 160을 얻고 싶습니다.HTTP 헤더가 포함 된 문자열에서 값 추출

HTTP 헤더의 모든 데이터 앞에는 이름, 콜론 및 공백이 있고 그 값 바로 뒤에 '\ r'및 '\ n'문자가옵니다.

int contentLengthIndex = serverHeader.lastIndexOf("Content-Length: "); 
int contentLastIndex = serverHeader.length()-1; 
String contentText = serverHeader.substring(contentLengthIndex + 16, contentLastIndex); 
contentText = contentText.replaceAll("(\\r|\\n)", ""); 
int contentLength = Integer.parseInt(contentText); 

을하지만 지저분한 보인다는 문자열의 끝에서 "콘텐츠 길이"를 얻기 만 좋다 : 순간

나는이 일을하고있다. int 값 또는 문자열 값을 얻기 위해 작동하도록 조정할 수있는 HTTP 헤더를 포함하는 문자열에서 값을 추출하는 더 보편적 인 솔루션이 있습니까?

또한 요청 후에 브라우저에서 데이터를 다시 반환 할 수 있어야한다는 것을 언급해야합니다. 이는 내 이해에서 HttpURLConnection 사용의 이점을 누리지 못하게합니다.

+0

헤더를받는 방법은 무엇입니까? – kaysush

+0

@ Suku, 나는 그들을 문자 단위로 String에 저장하려고한다. 나는 지금 당장 코드에서 벗어나고 있지만 InputStreamReader를 통해 있다고 생각한다. –

+0

분명히 그것은'Reader' 여야 만하지만'Reader'의 근원은 내 답변에서 언급 한대로'HttpURLConnection'을 사용하여 진행할 수 있다는 뜻입니다. – kaysush

답변

1

빠른 해결책은 다음과 같습니다

new Scanner(serverHeader).useDelimiter("[^\\d]+").nextInt()); 

다른 방법을 당신이 헤더의 Hashtable 만들려면 :

String[] fields = serverHeader.trim().split(":"); 

String key = fields[0].trim(); 
String value = fields[1].trim(); 

를 당신이 왜 확실하지 않다 이 설명서를 작성하면 이미이 API가 있습니다!

+0

여분의 괄호가있는 것 같습니다. – Whymarrh

+0

이것은 마치 이름/값 쌍의 int 값에서만 작동하며 "Content-Length"가 160 인 것으로 알려진 경우에만 작동하는 것처럼 보입니다. 나는 추출 할 수 있기를 바랍니다. 방법이 있으면 이름/값에서 이름을 사용합니다. –

+0

하드 코딩 된 문자열을 예제로 사용했지만 변수를 입력하십시오. – iTech

0

문자열에서 숫자가 아닌 문자를 모두 제거 했습니까?

serverHeader = serverHeader.replaceAll("[^\\d.]", "");

+0

String 값의 이름/값 쌍에서 값을 가져올 수 있어야합니다. –

1

사용 클래스 java.net.HttpURLConnection

편집 : 또한 방법 URLConnection.getContentLength()와 URLConnection.getContentLengthLong()

+0

GET 요청을 처리 한 후 브라우저로 데이터를 반환하기 위해 연결을 사용할 수 있어야하고 HttpURLConnection 그것을 허용합니다. –

+0

URLConnection.getContentLength() 및 URLConnection.getContentLengthLong() 메서드가 있습니다. \t URL url = 새 URL ("http://www.yahoo.com/"); URLConnection connection = url.openConnection(); long connectionLength = connection.getContentLengthLong(); – Dumas45

0

당신은 내가 당신이 HttpURLConnection를 사용하는 것이 좋습니다 HTTP 데이터를 읽을 Socket 클래스를 사용하는 경우 Header Fields을 구문 분석하는 편리한 방법을 제공합니다.

모든 필드를 가져 오는 데 사용할 수있는 public Map getHeaderFields() 방법이 있습니다.

가이드를 HttpURLConnection으로 시작하려면 here을 참조하십시오.

+0

실험을 시작했지만 데이터 전송 문제가 발생했습니다. 기본적으로 기본적인 웹 서버를 작성하고 있습니다. HttpURLConnection을 사용하면 HTTP 요청을 받아 HTML이나 텍스트 파일과 같은 데이터를 포함하는 응답을 보낼 수 있습니까? –

+0

아니, 그럴 수 없어. http://www.java-samples.com/showtutorial.php?tutorialid=236 여기를 한 번보세요. 비슷한 방법으로 머리글을 파싱 할 수 있습니다. – kaysush