2013-07-26 33 views
5

मैं जावा में एक एंड्रॉइड और सर्वर अनुप्रयोग विकसित कर रहा हूं। सर्वर अनुप्रयोग जेटी पर चलता है। एंड्रॉइड एप्लिकेशन उसी कंप्यूटर पर नकल किया जाता है।POST अनुरोध प्राप्त होता है

एंड्रॉइड एप्लिकेशन सर्वर पर एक POST अनुरोध भेजता है, लेकिन सर्वर के हैंडलर इसे एक जीईटी के रूप में समझते हैं।

जब मैं का उपयोग करता हूं तो POST अनुरोध अनुकरण करने के लिए HTTP टूल भेजें, यह पूरी तरह से काम करता है (मेरा मतलब है कि विधि का प्रकार POST है)।

यह Android ऐप्लिकेशन का कोड-टुकड़ा है:

HttpClient client = new DefaultHttpClient(); 
HttpConnectionParams.setConnectionTimeout(client.getParams(), 
     10000); // Timeout Limit 
HttpResponse response; 

// Create message 
JSONObject json = new JSONObject(); 
json.put("request_type", "info"); 
json.put("user_name", mEmail); 

// Send message and get response 
StringEntity se = new StringEntity(json.toString()); 
se.setContentType(new BasicHeader(HTTP.CONTENT_TYPE, "application/json")); 
HttpPost post = new HttpPost("http://10.0.2.2:8080/app"); 
post.setEntity(se); 
post.setHeader("Accept", "application/json"); 
post.setHeader("Content-Type", "application/json; charset=UTF-8"); 
response = client.execute(post); 

और यह हैंडलर के कोड है:

public void handle(String target, Request baseRequest, 
    HttpServletRequest request, HttpServletResponse response) { 
    System.out.println(request.getMethod()); 
} 

मैं क्या समस्या हो सकती है पता नहीं है, के रूप में मुझे लगता है कि अगर मैं एचटीपीपोस्ट का उपयोग करता हूं, तो विधि प्रकार पोस्ट होना चाहिए।

+1

क्या 'postGetSalt' है? –

+0

यह "पोस्ट" चर का मूल नाम है। मैंने इसे बदल दिया, लेकिन दुर्भाग्य से हर जगह नहीं। मैंने सही किया है – szedjani

उत्तर

11

यदि आप कर सकते हैं, तो क्या आप अपना पूरा हैंडलर, या हैंडलर प्रारंभिक पोस्ट कर सकते हैं। लेकिन मैं जवाब पर अनुमान लगाने जा रहा हूं।

मुझे एहसास है कि आपका POST अनुरोध वास्तव में 302 के माध्यम से रीडायरेक्ट हो रहा है, इसलिए हैंडलर इसे जीईटी अनुरोध के रूप में सही तरीके से प्राप्त कर रहा है।

डिफ़ॉल्ट रूप से जेटी कॉन्टेक्स्ट हैंडलर "/ ऐप" के संदर्भ के साथ वास्तव में किसी भी अनुरोध को "/ app" से "/ app /" पर रीडायरेक्ट करेगा, setAllowNullPathInfo पर एक नज़र डालें।

तो तुम 2 संभव समाधान है, तो अपने ContextHandler पर setAllowNullPathInfo(true) कॉल करें, या HttpPost post = new HttpPost("http://10.0.2.2:8080/app/");

करने के लिए ग्राहक पर अपनी पोस्ट यूआरएल बदल यह आप घाट पर RequestLogs सक्षम करने के लिए मदद कर सकता है, तो निम्न Jetty/Tutorial/RequestLog

देखने का उपयोग करना सर्वर आप अनुरोध लॉग के माध्यम से/ऐप के अनुरोध और/ऐप/अनुरोध के बीच अंतर देख सकते हैं।

public class RequestLogPost { 

    public static class PostHandler extends ContextHandler { 
    public PostHandler() { 
     setContextPath("/app"); 
     // setAllowNullPathInfo(true); // enable to see difference in request handling 
    } 

    @Override 
    public void doHandle(String target, Request baseRequest, HttpServletRequest request, 
     HttpServletResponse response) throws IOException, ServletException { 
     System.out.println(request.getMethod()); 
     response.setStatus(HttpStatus.OK_200); 
     baseRequest.setHandled(true); 
    } 
    } 

    public static void main(String[] args) throws Exception { 
    Server server = new Server(5555); 

    HandlerCollection handlers = new HandlerCollection(); 
    handlers.addHandler(new PostHandler()); 
    handlers.addHandler(new DefaultHandler()); 
    handlers.addHandler(createRequestLogHandler()); 

    server.setHandler(handlers); 

    server.start(); 
    server.join(); 
    } 

    private static RequestLogHandler createRequestLogHandler() { 
    final int RETAIN_FOREVER = 0; // see RolloverFileOutputStream, 0 == forever. 
    RequestLogHandler logHandler = new RequestLogHandler(); 

    NCSARequestLog ncsaRequestLog = new AsyncNCSARequestLog("requests.log"); 
    ncsaRequestLog.setAppend(true); 
    ncsaRequestLog.setExtended(true); 
    ncsaRequestLog.setLogTimeZone("GMT"); 
    ncsaRequestLog.setRetainDays(RETAIN_FOREVER); 
    logHandler.setRequestLog(ncsaRequestLog); 
    return logHandler; 
    } 
} 
अनुरोध लॉग से

, पोस्ट अनुरोध "/ एप्लिकेशन", एक 302

[30/Jul/2013: 12: 28: 09 +0000] में जिसके परिणामस्वरूप के लिए "पोस्ट/एप्लिकेशन HTTP /1.1 "302 0

[30/Jul/2013: 12: 28: 09 +0000]" प्राप्त/ऐप्स/HTTP/1.1 "200 0

प्रत्यक्ष अनुरोध करने के लिए"/ऐप्स/":

[30/Jul/2013: 12: 28: 16 +0000] "पोस्ट/ऐप्स/HTTP/1.1" 200 0

+1

आपका अनुमान सही था! प्रारंभिकता काफी समान है और हैंडलर में केवल यह विधि है। मैंने एंड्रॉइड ऐप में यूआरएल के अंत में प्लस "/" साइन जोड़ा है, और यह काम करता है। बहुत बहुत धन्यवाद, मैं अकेले इस मुद्दे को नहीं ढूंढ पाया। – szedjani

+0

@Andrew आपने मुझे पूरे HTTP सर्वर को दोबारा कोड करने से बचाया। धन्यवाद। –

+0

मैं रेल ऐप के साथ काम कर रहा था और मुझे एक समान समस्या थी। मैं उस डोमेन पर पोस्ट कर रहा था जिसे अग्रेषित किया जा रहा था, इसलिए 'POST' अनुरोध' GET' अनुरोध बन रहा था। – Skovy

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