2013-03-15 5 views
4

J'essaye de me connecter avec un serveur en utilisant HttpURLConnection, mais j'ai un problème avec la méthode PUT.
Je dois envoyer une chaîne avec 1500 caractères (ou plus), mais dans ce cas, le serveur produit un délai d'attente et renvoie 500 - erreur interne du serveur.
Si j'envoie une chaîne inférieure à 1400 caractères, je n'ai pas de problème et le serveur renvoie OK.Longueur maximale du contenu?

Mon code est le suivant:

public String connectToServer(String prototype) { 
    String responseString = ""; 

    try { 
     BufferedReader in = new BufferedReader(new InputStreamReader(openURLForInput(new URL(URL), USERNAME, PASSWORD, prototype))); 
     String line; 
     while ((line = in.readLine()) != null) { 
      System.out.println(line); 
      responseString += line; 
     } 

    } catch (IOException e) { 
     e.printStackTrace(); 
     responseString = e.toString(); 
    } 

    return responseString; 
} 

// -----------------------

public InputStream openURLForInput(URL url, String uname, String pword, String content) throws IOException { 
    HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
    conn.setDoInput(true); 
    conn.setDoOutput(true); 
    conn.setRequestProperty("Authorization", userNamePasswordBase64(uname, pword)); // I know this is OK 
    conn.addRequestProperty("Content-type", "application/xml; charset=utf-8"); 

    //conn.setChunkedStreamingMode(8 * 1024); 

    conn.setRequestMethod("PUT"); 
    conn.connect(); 

    OutputStream output = conn.getOutputStream(); 
    OutputStreamWriter osw = new OutputStreamWriter(output, "UTF-8"); 
    BufferedWriter writer = new BufferedWriter(osw); 
    writer.write(content); // content length > 1400 characters 
    writer.close(); 
    output.close(); 

    int status = conn.getResponseCode(); 
    Log.i("STATUS", status + ""); 
    Log.i("STATUS_ERROR", conn.getResponseMessage()); 

    return conn.getInputStream(); 
} 

I essayé d'ajouter les lignes

conn.setFixedLengthStreamingMode(contentLength) 
conn.setChunkedStreamingMode(8 * 1024); 

Mais la réponse du serveur est fausse quand même.

MISE À JOUR:

je pouvais détecter le problème. Pour une raison quelconque, lorsque je tente d'envoyer de gros bodys dans la demande, le serveur produit un délai d'attente mais pas avec tous les réseaux, uniquement avec certains réseaux. J'utilise une connexion sécurisée SSL, peut-être que cela peut causer des problèmes?

+0

Et quel type de serveur est-ce que vous connectez; avez-vous un accès administrateur ou l'administrateur est-il un type amical à la table à côté de vous? –

+0

essayez d'ajouter ceci: conn.addRequestProperty ("Content-Length", content.getLength()); – Kylar

+0

Class Stacker: Nous pouvons, mais que devrions-nous demander? cette partie je ne sais pas. @Kylar: Nous avons déjà essayé de la sorte et nous avons tout de même fait passer le message à 1415 caractères. La chose étrange est que nous obtenons un TimeOut lorsque nous envoyons 1416, pas le message avec 1 caractère manquant (est-ce clair?) – SolArabehety

Répondre

2

Peut-être un problème MTU réseau, je dirais que vous enquêtez sur ce front.

Voici un tableau correspondant aux fenêtres:

Network    MTU (bytes) 
------------------------------- 
16 Mbps Token Ring  17914 
4 Mbps Token Ring   4464 
FDDI      4352 
Ethernet     1500 
IEEE 802.3/802.2   1492 
PPPoE (WAN Miniport)  1480 
X.25      576 
+0

Oui, récemment, je viens de réaliser que c'était le problème, merci Savez-vous comment puis-je définir le réseau MTU à partir du code? – SolArabehety

+0

Non, vous ne pouvez pas définir cela dans le code, puisque le MTU est un valeur définie lorsque l'interface réseau de votre choix est activée/désactivée Ce que vous pouvez faire est d'essayer de configurer une autre configuration réseau pour votre FAI ou votre carte réseau (ou routeur) –

+0

u. De toute façon, si vous pensez dans une autre solution s'il vous plaît faites le moi savoir =) – SolArabehety

0

Je vous recommandons d'utiliser la bibliothèque très utile HTTP-REQUEST par Kevin Sawicki ...

Il m'a aidé beaucoup de fois!

+0

J'ai essayé avec ceci mais j'ai eu la même réponse = (Il est basé dans httpUrlConnection et nous avons déjà essayé cela Merci – SolArabehety

0

Le serveur répond 500 - erreur interne du serveur. Donc, vous devriez vérifier l'implémentation du serveur. Il devrait avoir des restrictions au-dessus de cette longueur de contenu.
J'ai une application qui fait beaucoup de requêtes http serveur et pour moi, votre problème est vraiment le serveur. La preuve principale est que votre code fonctionne avec un contenu inférieur ou égal à 1415 caractères.

+0

Ils ont dit que le serveur n'a pas de limites – SolArabehety

+0

J'ai essayé dans mon téléphone portable (3g) et l'application fonctionne bien , mais lorsque je me connecte en utilisant le wifi via une connexion globale, le serveur renvoie "500 - erreur interne du serveur", ce qui signifie "timeout" .Le WEIRD PART est que si je connecte mon téléphone portable en wifi, mais un autre ISP (Global Crossing), la connexion fonctionne bien – SolArabehety

Questions connexes