2013-07-26 3 views
5

Je développe une application Android et un serveur en Java. L'application serveur s'exécute sur Jetty. L'application Android est émulée sur le même ordinateur.La requête POST devient GET

L'application Android envoie une requête POST au serveur, mais le gestionnaire du serveur l'interprète comme un GET.

Lorsque j'utilise Envoyer l'outil HTTP pour simuler une requête POST, cela fonctionne parfaitement (je veux dire le type de la méthode est POST).

C'est le code fragment de l'application 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); 

Et ceci est le code du gestionnaire:

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

Je ne sais pas ce qui pourrait être un problème, comme Je pense que si j'utilise HttpPost, le type de méthode devrait être POST.

+1

Qu'est-ce 'postGetSalt'? –

+0

C'est le nom original de la variable "post". Je l'ai changé, mais malheureusement pas partout. J'ai corrigé. – szedjani

Répondre

11

Si vous le pouvez, pourriez-vous s'il vous plaît poster votre gestionnaire complet, ou l'initialisation du gestionnaire. Mais je vais deviner la réponse.

J'ai le sentiment que votre demande POST est réellement obtenir redirigé via un 302, de sorte que le gestionnaire reçoit le signal correctement comme une requête GET.

Par défaut, un Jetty ContextHandler avec un contexte de "/ app" redirigera réellement toute demande vers "/ app" vers "/ app /", jetez un oeil à setAllowNullPathInfo.

Vous avez donc 2 solutions possibles, appelez setAllowNullPathInfo(true) sur votre ContextHandler, ou modifier l'url de votre poste sur le client pour HttpPost post = new HttpPost("http://10.0.2.2:8080/app/");

Il peut vous aider à activer RequestLogs sur la jetée, voir Jetty/Tutorial/RequestLog

En utilisant les éléments suivants serveur, vous pouvez voir la différence entre une demande à/app et une demande à/app/via le journal des demandes.

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

A partir des journaux de requêtes, demande Envoyer à "/ app", ce qui a 302

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

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

demande directe "/ app /":

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

+1

Votre estimation était correcte! L'initialisation est tout à fait la même et le gestionnaire ne contient que cette méthode. J'ai ajouté un signe "/" à la fin de l'URL dans l'application Android, et cela fonctionne. Merci beaucoup, je ne pouvais pas trouver ce problème seul. – szedjani

+0

@Andrew Vous m'avez épargné de re-coder l'ensemble du serveur HTTP. JE VOUS REMERCIE. –

+0

Je travaillais avec une application rails et j'avais un problème similaire. Je postais sur un domaine qui était transféré de sorte que la requête 'POST' devenait une requête' GET'. – Skovy