2012-03-26 27 views
6

Tôi có một Chuỗi chứa tiêu đề HTTP. Tôi muốn biến điều này thành một đối tượng HttpComponents HttpComponents của Apache. Có cách nào để làm điều này mà không cần tự tách rời chuỗi không?Cách chuyển đổi chuỗi thành một HttpComponents của Apache HttpRequest

Hướng dẫn này: http://hc.apache.org/httpcomponents-core-dev/tutorial/html/fundamentals.html#d5e56 và javadoc không biểu thị nhiều.

Trả lời

13

Một lớp học để chuyển đổi một chuỗi để yêu cầu 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.BasicHttpEntityEnclosingRequest; 
import org.apache.http.message.BasicLineParser; 
import org.apache.http.params.BasicHttpParams; 

import java.io.ByteArrayInputStream; 
import java.io.IOException; 

/** 
* 
*/ 
public class ApacheRequestFactory { 
    public static HttpRequest create(final String requestAsString) { 
     try { 
      SessionInputBuffer inputBuffer = new AbstractSessionInputBuffer() { 
       { 
        init(new ByteArrayInputStream(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 BasicHttpEntityEnclosingRequest) { 
       BasicHttpEntityEnclosingRequest request = (BasicHttpEntityEnclosingRequest) 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); 
     } 
    } 
} 

và một lớp thử nghiệm cho thấy làm thế nào để sử dụng nó:

import org.apache.http.HttpRequest; 
import org.apache.http.NameValuePair; 
import org.apache.http.client.utils.URLEncodedUtils; 
import org.apache.http.message.BasicHttpEntityEnclosingRequest; 
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<NameValuePair> 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<NameValuePair> pairs = URLEncodedUtils.parse(((BasicHttpEntityEnclosingRequest)request).getEntity()); 
     checkPairs(pairs); 
    } 

    private void checkPairs(List<NameValuePair> pairs) { 
     for (NameValuePair 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); 
     } 
    } 
} 

Và một rant nhỏ:

THE LÀ GÌ APACHE HTTP TEAM THINKING? Api là vô cùng khó xử khi sử dụng. Các nhà phát triển trên toàn thế giới đang lãng phí thời gian viết wrapper và các lớp chuyển đổi cho những gì nên được chạy của nhà máy sử dụng hàng ngày (như ví dụ này hành động đơn giản của chuyển đổi một chuỗi để apache http yêu cầu, và cách kỳ lạ bạn cần phải trích xuất các hình thức các tham số (cũng phải thực hiện theo hai cách khác nhau tùy thuộc vào loại yêu cầu đã được thực hiện)). Thời gian toàn cầu lãng phí vì điều này là rất lớn. Khi bạn viết một API từ dưới lên, bắt đầu với các thông số, bạn PHẢI sau đó bắt đầu một lớp từ trên xuống (trên cùng là một giao diện mà bạn có thể hoàn thành công việc điển hình mà không cần phải hiểu hoặc nhìn vào cách mã được triển khai), làm cho việc sử dụng hàng ngày của thư viện CONVENIENT và trực quan. Thư viện http Apache là bất cứ điều gì nhưng. Nó gần như là một phép lạ là thư viện chuẩn của nó cho loại nhiệm vụ này.

Các vấn đề liên quan