2012-07-24 28 views
13

मैं जीईटी अनुरोधों को संभालने के लिए जावा में एक सरल एचटीपी सर्वर बनाने की कोशिश कर रहा हूं, लेकिन जब मैं अनुरोध के लिए जीईटी पैरामीटर प्राप्त करने का प्रयास करता हूं तो मैंने देखा कि एचटीपी एक्सचेंज क्लास के पास कोई तरीका नहीं है।जावा HttpServer/HttpExchange के साथ एक GET में क्वेरी स्ट्रिंग कैसे प्राप्त करें?

क्या किसी को जीईटी पैरामीटर (क्वेरी स्ट्रिंग) पढ़ने का आसान तरीका पता है?

यह कैसे मेरे हैंडलर लग रहा है जैसे:

public class TestHandler{ 
    @Override 
    public void handle(HttpExchange exc) throws IOxception { 
    String response = "This is the reponse"; 
    exc.sendResponseHeaders(200, response.length()); 

    // need GET params here 

    OutputStream os = exc.getResponseBody(); 
    os.write(response.getBytes()); 
    os.close(); 
    } 
} 

.. और मुख्य विधि:

public static void main(String[] args) throws Exception{ 
    // create server on port 8000 
    InetSocketAddress address = new InetSocketAddress(8000); 
    HttpServer server = new HttpServer.create(address, 0); 

    // bind handler 
    server.createContext("/highscore", new TestHandler()); 
    server.setExecutor(null); 
    server.start(); 
} 
+0

एक आसान तरीका? यूआरआई पार्स; यह सिर्फ एक अनुरोध है। अगर आपको पदों को संभालना है, तो [इस] जैसी चीजें (http://leonardom.wordpress.com/2009/08/06/getting-parameters-from-httpexchange/) मदद कर सकती हैं। –

उत्तर

26

निम्नलिखित: httpExchange.getRequestURI().getQuery()

इस के समान प्रारूप में स्ट्रिंग वापस आ जाएगी: "field1=value1&field2=value2&field3=value3..."

ताकि आप बस स्ट्राइक पार्स कर सकें

public Map<String, String> queryToMap(String query){ 
    Map<String, String> result = new HashMap<String, String>(); 
    for (String param : query.split("&")) { 
     String pair[] = param.split("="); 
     if (pair.length>1) { 
      result.put(pair[0], pair[1]); 
     }else{ 
      result.put(pair[0], ""); 
     } 
    } 
    return result; 
} 

और यह आप इसे कैसे इस्तेमाल कर सकते हैं है:: अपने आप को एनजी, इस पार्सिंग के लिए समारोह की तरह लग सकता है कैसे है @ anon01 द्वारा उत्तर पर

Map<String, String> params = queryToMap(httpExchange.getRequestURI().getQuery()); 
System.out.println("param A=" + params.get("A")); 
+0

जानना महत्वपूर्ण है: क्वेरी शून्य हो सकती है। आपको यह जांचना चाहिए। – MinecraftShamrock

+5

इस उत्तर के लिए धन्यवाद! यह उन पैराम्स के लिए विफल रहता है जिनके मूल्य में एम्पर्सेंड शामिल है, हालांकि। ठीक करने के लिए, 'getQuery()' के बजाय 'getRawQuery()' का उपयोग करें, फिर 'param = java.net.URLDecoder.decode (param, "UTF-8") "और" पर विभाजन के बाद। – Evan

+1

@Evan, मेरा मानना ​​है कि मानचित्र में मूल्य डालते समय डिकोडिंग होना चाहिए - इस तरह यदि आप इसमें '=' ​​रखते हैं तो आप मान का हिस्सा नहीं खोते हैं। –

0

भवन, इस इसे कैसे करना है ग्रूवी में:

Map<String,String> getQueryParameters(HttpExchange httpExchange) 
{ 
    def query = httpExchange.getRequestURI().getQuery() 
    return query.split('&') 
      .collectEntries { 
     String[] pair = it.split('=') 
     if (pair.length > 1) 
     { 
      return [(pair[0]): pair[1]] 
     } 
     else 
     { 
      return [(pair[0]): ""] 
     } 
    } 
} 

और यह है कि यह कैसे उपयोग करने के लिए है:

def queryParameters = getQueryParameters(httpExchange) 
def parameterA = queryParameters['A'] 
+0

अच्छा, धन्यवाद। लेकिन सवाल जावा के लिए है, गोवी नहीं;) – Tibor

1

यह उत्तर, annon01 के विपरीत, कुंजी और मानों को ठीक से डीकोड करता है। यह String.split का उपयोग नहीं करता है, लेकिन indexOf का उपयोग करके स्ट्रिंग स्कैन करता है, जो तेज़ है।

public static Map<String, String> parseQueryString(String qs) { 
    Map<String, String> result = new HashMap<>(); 
    if (qs == null) 
     return result; 

    int last = 0, next, l = qs.length(); 
    while (last < l) { 
     next = qs.indexOf('&', last); 
     if (next == -1) 
      next = l; 

     if (next > last) { 
      int eqPos = qs.indexOf('=', last); 
      try { 
       if (eqPos < 0 || eqPos > next) 
        result.put(URLDecoder.decode(qs.substring(last, next), "utf-8"), ""); 
       else 
        result.put(URLDecoder.decode(qs.substring(last, eqPos), "utf-8"), URLDecoder.decode(qs.substring(eqPos + 1, next), "utf-8")); 
      } catch (UnsupportedEncodingException e) { 
       throw new RuntimeException(e); // will never happen, utf-8 support is mandatory for java 
      } 
     } 
     last = next + 1; 
    } 
    return result; 
}