2013-07-26 7 views
5

Rozwijam aplikację Android i serwer w Javie. Aplikacja serwera działa na pomoście. Aplikacja na Androida jest emulowana na tym samym komputerze.Żądanie POST staje się GET

Aplikacja dla systemu Android wysyła żądanie POST na serwer, ale program obsługi serwera interpretuje go jako pobranie.

Kiedy używam Wysyłaj narzędzie HTTP do symulacji żądania POST, działa idealnie (mam na myśli typ metody POST).

Jest to kod-fragment Android aplikacji:

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

I to jest kod obsługi:

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

nie wiem, co może być problemem, jak Myślę, że jeśli używam HttpPost, typem metody powinien być POST.

+1

Co jest 'postGetSalt'? –

+0

To jest oryginalna nazwa zmiennej "post". Zmieniłem go, ale niestety nie wszędzie. Poprawiłem. – szedjani

Odpowiedz

11

Jeśli możesz, możesz opublikować swój pełny program obsługi lub inicjalizację programu obsługi. Ale zamierzam odgadnąć odpowiedź.

Mam wrażenie, że Twój wniosek POST jest faktycznie przekierowywany przez 302, więc przewodnik otrzymuje go poprawnie jako żądanie GET.

Domyślnie Jetty ContextHandler z kontekstem "/ app" faktycznie przekieruje każde żądanie do "/ app" do "/ app /", spójrz na setAllowNullPathInfo.

Więc masz 2 możliwe rozwiązania, zadzwoń setAllowNullPathInfo(true) na ContextHandler lub zmienić pocztowy URL na kliencie do HttpPost post = new HttpPost("http://10.0.2.2:8080/app/");

To może pomóc, aby umożliwić RequestLogs na molo, zobacz Jetty/Tutorial/RequestLog

stosując następujące na serwerze widać różnicę między żądaniem do/aplikacji a żądaniem do/app/poprzez dziennik żądań.

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

Z dzienników żądanie, wniosek Post "/ app", co w rezultacie daje 302

[30/lipca/2013: 12: 28: 09 +0000] „POST/app HTTP /1.1" 302 0

[30/lipiec/2013: 12: 28: 09 +0000] "GET/APP/HTTP/1.1" 200 0

bezpośrednie żądanie "/ APP /":

[30/lipca/2013: 12: 28: 16 +0000] "POST/app/HTTP/1.1" 200 0

+1

Twoje przypuszczenie było słuszne! Inicjalizacja jest dość podobna, a moduł obsługi zawiera tylko tę metodę. Dodałem znak plus "/" na końcu adresu URL w aplikacji na Androida i działa. Dziękuję bardzo, nie mogłem znaleźć tego problemu sam. – szedjani

+0

@Andrew Uratowałeś mnie przed ponownym kodowaniem całego serwera HTTP. DZIĘKUJĘ CI. –

+0

Pracowałem z aplikacją szyn i miałem podobny problem. Pisałem do domeny, która była przekierowywana, więc żądanie 'POST' stało się żądaniem' GET'. – Skovy