2012-03-26 22 views
6

मेरे पास एक स्ट्रिंग है जिसमें HTTP शीर्षलेख है। मैं इसे Apache HttpComponents HttpRequest ऑब्जेक्ट में बदलना चाहता हूं। स्ट्रिंग को अलग करने के बिना इसे करने का कोई तरीका है?एक स्ट्रिंग को अपाचे में कैसे परिवर्तित करें HttpComponents HttpRequest

यह ट्यूटोरियल: http://hc.apache.org/httpcomponents-core-dev/tutorial/html/fundamentals.html#d5e56 और जावाडोक उतना संकेत नहीं देता है।

उत्तर

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

और एक परीक्षण वर्ग है कि यह कैसे उपयोग करने के लिए दिखा:

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

और एक छोटा सा शेख़ी:

क्या हैं अपाचे HTTP टीम सोच रहा है? एपीआई उपयोग करने के लिए अविश्वसनीय रूप से अजीब है। दुनियाभर के डेवलपर्स समय लेखन रैपर और रूपांतरण कक्षाओं को बर्बाद कर रहे हैं, जो हर दिन उपयोग के मिल के चलते क्या चलते हैं (इस उदाहरण के रूप में एक स्ट्रिंग को अपाचे http अनुरोध में परिवर्तित करने का सरल कार्य, और फ़ॉर्म को निकालने के लिए आपको जिस विचित्र तरीके की आवश्यकता है पैरामीटर (किस प्रकार के अनुरोध के आधार पर इसे दो अलग-अलग तरीकों से करना है))। वैश्विक समय बर्बाद हो गया क्योंकि यह बहुत बड़ा है। जब आप नीचे से एक एपीआई लिखते हैं, चश्मा से शुरू करते हैं, तो आपको ऊपर की ओर से एक परत शुरू करनी होगी (शीर्ष इंटरफ़ेस होना जहां आप समझने के बिना सामान्य काम कर सकते हैं या कोड को लागू करने के तरीके को देख सकते हैं), लाइब्रेरी कन्वेंशन और सहज ज्ञान युक्त हर दिन उपयोग करते हैं। अपाचे http पुस्तकालय कुछ भी हैं। यह लगभग एक चमत्कार है कि इस प्रकार के कार्य के लिए इसकी मानक पुस्तकालय है।

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^