Как преобразовать строку в Apache HttpComponents HttpRequest

У меня есть строка, содержащая HTTP-заголовок. Я хочу превратить это в объект HttpRequest Apache HttpComponents. Есть ли способ сделать это, не выделяя ничью самостоятельно?

Этот учебник: http://hc.apache.org/httpcomponents-core-dev/tutorial/html/fundamentals.html#d5e56, и javadoc не указывает столько же.

1 ответ

Класс для преобразования строки в запрос apache:

import org.apache.http.*;
import org.apache.http.impl.DefaultHttpRequestFactory;
import org.apache.http.impl.entity.EntityDeserializer;
import org.apache.http.impl.entity.LaxContentLengthStrategy;
import org.apache.http.impl.io.AbstractSessionInputBuffer;
import org.apache.http.impl.io.HttpRequestParser;
import org.apache.http.io.HttpMessageParser;
import org.apache.http.io.SessionInputBuffer;
import org.apache.http.message.*******************************;
import org.apache.http.message.BasicLineParser;
import org.apache.http.params.BasicHttpParams;
import java.io.********************;
import java.io.IOException;
/**
 *
 */
public class ApacheRequestFactory {
 public static HttpRequest create(final String requestAsString) {
 try {
 SessionInputBuffer inputBuffer = new AbstractSessionInputBuffer() {
 {
 init(new ********************(requestAsString.getBytes()), 10, new BasicHttpParams());
 }
 @Override
 public boolean isDataAvailable(int timeout) throws IOException {
 throw new RuntimeException("have to override but probably not even called");
 }
 };
 HttpMessageParser parser = new HttpRequestParser(inputBuffer, new BasicLineParser(new ProtocolVersion("HTTP", 1, 1)), new DefaultHttpRequestFactory(), new BasicHttpParams());
 HttpMessage message = parser.parse();
 if (message instanceof *******************************) {
 ******************************* request = (*******************************) message;
 EntityDeserializer entityDeserializer = new EntityDeserializer(new LaxContentLengthStrategy());
 HttpEntity entity = entityDeserializer.deserialize(inputBuffer, message);
 request.setEntity(entity);
 }
 return (HttpRequest) message;
 } catch (IOException e) {
 throw new RuntimeException(e);
 } catch (HttpException e) {
 throw new RuntimeException(e);
 }
 }
}

и класс тестирования, показывающий, как его использовать:

import org.apache.http.HttpRequest;
import org.apache.http.*************;
import org.apache.http.client.utils.URLEncodedUtils;
import org.apache.http.message.*******************************;
import org.junit.Test;
import java.io.IOException;
import java.net.URI;
import java.util.List;
import static org.junit.Assert.*;
/**
 *
 */
public class ApacheRequestFactoryTest {
 @Test
 public void testGet() {
 String requestString = "GET /?one=aone&two=atwo HTTP/1.1\n" +
 "Host: localhost:7788\n" +
 "Connection: Keep-Alive\n" +
 "User-Agent: Apache-HttpClient/4.0.1 (java 1.5)";
 HttpRequest request = ApacheRequestFactory.create(requestString);
 assertEquals("GET", request.getRequestLine().getMethod());
 List<*************> pairs = URLEncodedUtils.parse(URI.create(request.getRequestLine().getUri()), "ISO-8859-1");
 checkPairs(pairs);
 }
 @Test
 public void testPost() throws IOException {
 String requestString = "POST / HTTP/1.1\n" +
 "Content-Length: 17\n" +
 "Content-Type: application/x-www-form-urlencoded; charset=ISO-8859-1\n" +
 "Host: localhost:7788\n" +
 "Connection: Keep-Alive\n" +
 "User-Agent: Apache-HttpClient/4.0.1 (java 1.5)\n" +
 "\n" +
 "one=aone&two=atwo";
 HttpRequest request = ApacheRequestFactory.create(requestString);
 assertEquals("POST", request.getRequestLine().getMethod());
 List<*************> pairs = URLEncodedUtils.parse(((*******************************)request).getEntity());
 checkPairs(pairs);
 }
 private void checkPairs(List<*************> pairs) {
 for (************* pair : pairs) {
 if (pair.getName().equals("one")) assertEquals("aone", pair.getValue());
 else if (pair.getName().equals("two")) assertEquals("atwo", pair.getValue());
 else assertTrue("got more parameters than expected:"+pair.getName(), false);
 }
 }
}
</*************></*************></*************>

И небольшая напыщенность:

ЧТО ТАКОЕ МАТЕРИАЛЫ APACHE HTTP? Апи невероятно неудобно использовать. Разработчики по всему миру тратят время на создание оболочек и классов конверсии для того, что должно запускаться на мельнице каждый день (например, этот простой пример преобразования строки в HTTP-запрос apache и странный способ извлечь форму параметры (также необходимо сделать это двумя разными способами в зависимости от того, какой тип запроса был сделан)). Из-за этого глобальное время тратится впустую. Когда вы пишете API снизу вверх, начиная со спецификаций, вы ДОЛЖНЫ начинать слой сверху вниз (сверху - интерфейс, где вы можете получить типичную работу без необходимости понимать или смотреть на способ реализации кода), делая ежедневное использование библиотеки CONVENIENT и интуитивно понятным. Apache http-библиотеки не что иное, как. Это почти чудо, что его стандартная библиотека для этого типа задач.

licensed under cc by-sa 3.0 with attribution.