J'ai écrit un client Java pour un serveur REST qui fonctionne parfaitement à moins qu'une nouvelle ligne ne soit ajoutée à une chaîne dans la requête de corps Json. La même demande fonctionne parfaitement avec la nouvelle ligne si j'utilise un client tel que Insomnia. Un client Javascript / HTML fonctionne également très bien avec les mêmes données. Dans l'exemple Json ci-dessous, le problème est lié au champ "texte". Si je supprime le "\ n", le code fonctionne. Sinon, le serveur renvoie l'erreur 400.
J'ai essayé plusieurs encodages et arguments différents dans la requête. Rien ne semble fonctionner.
//If I just remove the "\n" from the String below the server issues the 200 code
//But the server will accept this string just as it is if sent form Insomnia, handling correctly the newlines.
String jsonBody = "{\"name\": \"Operation 101\",\"idPio\": \"10007200000000000205\",\"idGlobalPio\": \"5387fed1-d010-4bde-b45b-7dd5815b9e03\",\"text\": \"Descrition\n1 - First line\n2 - Second Line\",}";
url = new URL("https://10.120.43.23:8000/api/item/1.0/item/annotation/?t=E34B2A8A-0A64-469A-AE52-45E8A9885D70");
HttpsURLConnection con = (HttpsURLConnection)url.openConnection();
//Add request header
con.setRequestMethod("POST");
con.setRequestProperty("User-Agent", "Java client");
con.setRequestProperty("Accept-Language", "pt-BR,pt;q=0.9,en-US;q=0.8,en;q=0.7,fr;q=0.6");
con.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
con.setRequestProperty("Accept", "application/json, text/plain, */*");
con.setRequestProperty("Accept-Encoding", "gzip, deflate, br");
con.setRequestProperty("Connection", "keep-alive");
con.setDoOutput(true);
//Prepare data and send
DataOutputStream wr = new DataOutputStream(con.getOutputStream());
byte[] arr = jsonBody.getBytes("UTF-8");
wr.write(arr);
wr.flush();
wr.close();
int responseCode = con.getResponseCode();
System.out.println(String.valueOf(responseCode));
Mon code java
Json request formated
{
"name": "Operation 101",
"idPio": "10007200000000000205",
"idGlobalPio": "5387fed1-d010-4bde-b45b-7dd5815b9e03",
"text": "Description\n1 - First line\n2 - Second Line",
}
3 Réponses :
Remplacez le saut de ligne par \\\ n au lieu de \ n .
J'ai essayé cela avec: jsonBody = jsonBody.replaceAll ("\ n", "\\ n"); Le serveur accepte sans émettre d'erreur mais le champ "texte" du serveur devient "Descriptionn1 - Premier linge2 - Deuxième ligne \". La barre oblique inverse disparaît simplement.
@MauricioHofmam N'utilisez pas replaceAll , mais utilisez littéralement \\ n dans vos JavaStrings. En utilisant replaceAll , vous ajoutez un autre niveau de complexité, car il utilise des expressions régulières, qui nécessitent plus de barres obliques inverses pour s'échapper correctement.
Gardez à l'esprit qu'un saut de ligne littéral n'est pas autorisé dans une chaîne en JSON. Il doit être représenté par \ n . Cependant, les sauts de ligne dans les chaînes Java sont également représentés par \ n . Par exemple:
Une chaîne Java comme
String example = "{\"test\":\"line\\nbreak\"}"
// Notice the double backslash ---^^
représenterait la chaîne (JSON)
{"test":"line\nbreak"}
qui n'est pas interdit. Vous avez besoin que la chaîne JSON soit:
{"test":"line
break"}
qui est représentée dans une chaîne Java comme:
String example = "{\"test\":\"line\nbreak\"}"
Avec des mots externes : Tout comme vous devez échapper les guillemets ( ") dans les chaînes Java avec une barre oblique inverse, vous devez également échapper d'autres barres obliques inverses (comme celle de \ n ).
Remplacez le saut de ligne \ n par \\ n et supprimez la virgule (,) du dernier élément json
La syntaxe correcte est comme ci-dessous
String jsonBody = "{\"name\": \"Operation 101\",\"idPio\": \"10007200000000000205\",\"idGlobalPio\": \"5387fed1-d010-4bde-b45b-7dd5815b9e03\",\"text\": \"Descrition\\n1 - First line\\n2 - Second Line\"}";
Vous pouvez essayer de double échapper la nouvelle ligne:
\\ n.Je pense que le problème dans votre JSON valide votre JSON à partir de jsonlint.com après cette vérification