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();
}
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
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
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à –