2010-03-22 5 views
0

J'utilise la bibliothèque apache. J'ai créé une classe qui envoie une demande de publication à une servlet. J'ai configuré les paramètres pour le client et j'ai créé un objet post HTTP à envoyer mais pour une raison quelconque lorsque j'exécute la requête je reçois un reposnse qui dit que la méthode get n'est pas supportée (ce qui est vrai parce que je n'ai fait que une méthode dopost dans ma servlet). Il semble qu'une demande d'obtention est envoyée mais je ne sais pas pourquoi. La méthode post a fonctionné avant mais j'ai commencé à corriger l'erreur http 417 "Expectation Failed" parce que je n'ai pas défini la version du protocole mais j'ai corrigé cela en ajoutant des paramètres. Ci-dessous est ma classe où vous voyez un objet HTTPpost en cours de création et d'exécution. J'ai une méthode de gestionnaire de réponse, mais je l'ai retiré de mon code ci-dessous parce que cela n'a rien à voir avec mon problème.Client HTTP - Erreur HTTP 405 "Méthode non autorisée". J'envoie un HTTP Post mais pour une raison quelconque, HTTP Get est envoyé

Je sais qu'un HTTP GET est envoyé en raison du message de réponse qui est renvoyé dit. La méthode HTTP spécifiée n'est pas autorisée pour la ressource demandée (la méthode HTTP GET n'est pas prise en charge par cette URL).

Merci d'avance.

P.s je développe pour android.

public class HTTPrequestHelper { 

private final ResponseHandler<String> responseHandler; 
private static final String CLASSTAG = HTTPrequestHelper.class.getSimpleName(); 
private static final DefaultHttpClient client; 
static{ 

    HttpParams params = new BasicHttpParams();  
     params.setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1); 
     params.setParameter(CoreProtocolPNames.HTTP_CONTENT_CHARSET, HTTP.UTF_8); 
     ///params.setParameter(CoreProtocolPNames.USER_AGENT, "Android-x");  
     params.setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 15000); 
     params.setParameter(CoreConnectionPNames.STALE_CONNECTION_CHECK, false); 

     SchemeRegistry schemeRegistry = new SchemeRegistry(); 
     schemeRegistry.register(
       new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); 

     schemeRegistry.register(
       new Scheme("https", SSLSocketFactory.getSocketFactory(), 443)); 



     ThreadSafeClientConnManager cm = new ThreadSafeClientConnManager(params, schemeRegistry); 

     client = new DefaultHttpClient(cm,params); 

} 



public HTTPrequestHelper(ResponseHandler<String> responseHandler) { 
this.responseHandler = responseHandler; 
} 

public void performrequest(String url, String para) 
{ 

    HttpPost post = new HttpPost(url); 

    StringEntity parameters; 
    try { 

     parameters = new StringEntity(para); 

     post.setEntity(parameters); 
    } catch (UnsupportedEncodingException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    BasicHttpResponse errorResponse = 
     new BasicHttpResponse(
     new ProtocolVersion("HTTP_ERROR", 1, 1), 
     500, "ERROR"); 

    try { 

     client.execute(post, this.responseHandler); 
     } 
    catch (Exception e) { 
     errorResponse.setReasonPhrase(e.getMessage()); 
    try { 
     this.responseHandler.handleResponse(errorResponse); 
     } 
    catch (Exception ex) { 
      Log.e("ouch", "!!! IOException " + ex.getMessage()); 
     } 
    } 


} 

J'ai essayé ajouté la tête permettent à la demande, mais cela ne fonctionne pas aussi bien, mais je ne suis pas sûr si je faisais bien. ci-dessous est le code.

client.addRequestInterceptor(new HttpRequestInterceptor() { 
      @Override 
      public void process(HttpRequest request, HttpContext context) 
        throws HttpException, IOException { 
       //request.addHeader("Allow", "POST"); 

      } 
     }); 

Répondre

1
  1. Comment savez-vous qu'un HTTP GET est effectivement envoyé? Examiner les paquets http envoyés par votre client ou reçus par le serveur serait utile ici
  2. Vous attrapez et avalez UnsupportedEncodingException lors de la construction des paramètres de la publication - que se passe-t-il si vous rencontrez cette exception lors de la définition des paramètres? Votre code tel qu'il est aujourd'hui tentera toujours d'exécuter le POST.
+0

1. Le message de réponse indique qu'un get est en cours d'envoi. Aussi, comment pourrais-je vérifier les paquets http. 2. Quels paramètres ont ces exceptions qui doivent être interceptées. Merci – Shino88

+0

Pour 1, vous devez exclure que le serveur envoie un message d'erreur incorrect qui est source de confusion. Vérifiez le journal d'accès (le cas échéant) sur le serveur, ou vous pouvez activer la journalisation détaillée dans httpclient pour voir toutes les données qu'il envoie sur le réseau - ou utiliser un outil de reniflage de paquets tel que WireShark. –

+0

Hey matt merci pour l'aide. Je suis un étudiant à Uni et je n'ai pas accès aux logs de serveur j'ai juste essayé wireshark mais il s'écrase ketp et pour te dire la vérité je ne sais même pas ce que je cherche im. Des idées sur ce que ça pourrait être. O et je continue à obtenir La méthode HTTP spécifiée n'est pas autorisée pour la ressource demandée (méthode HTTP GET n'est pas supportée par cette URL) réponse du serveur. – Shino88