2010-09-29 14 views
0

J'ai un programme simple qui envoie un HTTP POST.Android HTTP POST Content-Length Exception

Il fonctionne uniquement si la ligne est httpost.addheader("Content-Length","18")pas présent. Sinon, il échoue. Dans le code, c'est la ligne avec "--->"
Commentant cette ligne, le POST réussit.

Android n'envoie pas le POST si cette ligne est dans le code et renvoie une erreur d'exception de protocole. J'ai utilisé Wireshark pour vérifier que rien n'est envoyé.

Des idées pour lesquelles la définition de Content-Length génère une exception?

Le code:

HttpClient httpclient = new DefaultHttpClient(); 
HttpPost httppost = new HttpPost("http://test.com/a_post.php"); 

try { 
    List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2); 
    // DATA 
    nameValuePairs.add(new BasicNameValuePair("mydata", "abcde")); 
    nameValuePairs.add(new BasicNameValuePair("id","29")); 

    StringEntity se = new UrlEncodedFormEntity(nameValuePairs); 
    httppost.setEntity(se); 

    int seLength = (int) se.getContentLength(); 
    String seLengthStr = Integer.toString(seLength); 

    httppost.addHeader("Content-Type","application/x-www-form-urlencoded"); 
    ----> httppost.addHeader("Content-Length", "18"); 

    ResponseHandler<String> responseHandler = new BasicResponseHandler(); 
    String httpResponse=httpclient.execute(httppost, responseHandler); 

    responseV.setText(responseV.getText()+ " " + httpResponse); 
} catch (ClientProtocolException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 
+0

La trace de la pile indique que l'erreur est due au fait que l'en-tête Content-Length est déjà présent. Est-ce le cas, quelle est la méthode pour définir la longueur du contenu? – Tori

+0

Pourquoi voulez-vous ajouter manuellement une longueur de contenu, si elle existe déjà? Si vous avez besoin de le changer pour une raison quelconque, il sera probablement incorrect, provoquant une erreur HTTP. – TuomasR

+0

Dans les documents HttpClient, il est indiqué que HttpClient définit la longueur du contenu pour vous, vous n'avez donc pas besoin de le faire. Ayant vu le code source, HttpClient vérifie actuellement s'il a déjà été ajouté manuellement, et lève le ProtocolException s'il existe déjà –

Répondre

1

Etes-vous sûr la longueur du contenu est exactement 18? Ma conjecture est que la demande n'est pas faite si le code se rend compte que la longueur de contenu définie est incorrecte, car l'envoi d'une requête avec une longueur de contenu invalide (au moins devrait) provoquer une erreur sur le serveur.

Probablement si vous omettez la longueur de contenu, elle est automatiquement ajoutée si nécessaire.

+0

Le contenu est exactement 18, mydata = abcde & id = 29. – Tori

+0

Wireshark indique également la longueur en tant que 18. Faire un httppost.getallheaders montre qu'il y a 1 en-tête quand la longueur de contenu n'est pas ajoutée et 2 en-têtes quand la longueur de contenu est ajoutée. – Tori

+0

Oui, Apache HTTP Client ajoute l'en-tête pour vous, il n'est donc pas nécessaire de l'ajouter. Pourquoi, sinon, cela devrait provoquer une exception non utile, je ne sais pas. –

0

Il existe un certain nombre de conditions dans lesquelles les clients et serveurs HTTP doivent et non envoyer l'en-tête Content-Length. Il n'est souvent pas requis, y compris si l'autre côté de la connexion est compatible HTTP/1.1. Il vaudrait peut-être mieux laisser cette en-tête, et laisser votre bibliothèque client/serveur HTTP gérer la logique d'ajouter ou non l'en-tête.

+0

Le service web auquel j'accède a besoin d'un contenu de longueur, il veut le POST, le type de contenu, la longueur du contenu et le paquet SOAP. Ensuite, il faut compter sur l'implémentation HTTP Android, pour envoyer la longueur du contenu. Je vais tester cela avec le service Web et rendre compte. – Tori