2012-03-26 19 views

cevap

13

:

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); 
     } 
    } 
} 

ve nasıl kullanılacağını gösteren bir test sınıfında:

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); 
     } 
    } 
} 

Ve küçük bir rant:

NELERDİR APACHE HTTP EKİBİ DÜŞÜNME? API kullanımı inanılmaz derecede garip. Dünyanın her yerindeki geliştiriciler, günlük kullanımda değirmende ne yapılması gerektiğine ilişkin sarıcı ve dönüşüm sınıfları yazarak zaman harcıyorlar (bu örnekte bir dizeyi bir apache http isteğine dönüştürmenin basit bir eylemi ve formu ayıklamak için ihtiyaç duyduğunuz tuhaf yol) parametreler (ayrıca ne tür bir istek yapıldığına bağlı olarak bunu iki farklı şekilde yapmak zorundadır)). Bunun yüzünden boşa giden küresel zaman çok büyük. Aşağıdan yukarıya doğru bir API yazdığınızda, teknik özelliklerle başlayarak, en baştan aşağıya bir katman başlatmanız gerekir (üstte, kodun uygulanış şeklini anlamak veya anlamak zorunda kalmadan, tipik işin yapılabildiği bir arayüz)), kütüphanenin her gün kullanımı UYGUNLU ve sezgisel. Apache http kütüphaneleri başka bir şey değil. Bu tür bir görev için standart kütüphanesinin neredeyse bir mucizesi.

İlgili konular