2013-02-10 5 views
3

Я ищу лучший способ извлечь данные из строки, содержащей HTTP-заголовок. Например, я хотел бы получить номер 160 из части длины содержимого строки: «Content-Length: 160 \ r \ n».Извлечение значений из строки, содержащей 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); 

Но, кажется, грязный, и это хорошо только для получения «Content-Length» в конце строки. Существует ли более универсальное решение для извлечения значений из строки, содержащей HTTP-заголовок, который можно настроить для работы как для значений int, так и для значений String?

Следует также упомянуть, что соединение должно возвращать данные обратно в браузер после запроса, что, по моему мнению, не позволяет мне воспользоваться преимуществами использования HttpURLConnection.

+0

Как вы получаете заголовки? – kaysush

+0

@SuKu, я храню их символ по символу в String. Я сейчас далеко от кода, но я считаю, что это через InputStreamReader. –

+0

определенно это должен быть какой-то «читатель», но что является источником этого «читателя», я имею в виду, что вы можете продолжить использование «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(); длинный подключениеL длина = подключение.getContentLengthLong(); – Dumas45

0

Если вы используете Socket класс для чтения HTTP данных я предлагаю вам использовать HttpURLConnection поскольку он предоставляет вам удобный метод для анализа Header Fields.

У этого метода public Map getHeaderFields(), который вы можете использовать для получения всех полей.

Если вы хотите, чтобы руководство начинало использовать HttpURLConnection, вы можете увидеть его here.

+0

Я начал экспериментировать с этим, но столкнулся с проблемами с отправкой данных. Я в основном пишу базовый веб-сервер. HttpURLConnection позволяет вам принимать HTTP-запрос и использовать это соединение для отправки ответа, который включает такие данные, как HTML или текстовый файл? –

+0

Нет, вы не можете этого сделать. Но посмотрите здесь http://www.java-samples.com/showtutorial.php?tutorialid=236. Вы можете использовать аналогичный метод для анализа вашего заголовка. – kaysush

Смежные вопросы