OVH Community, votre nouvel espace communautaire.

Caractères accentués via API RESTful en java


Charles.A
03/03/2015, 14h50
merci pour votre feedback et votre code en exemple.

En effet les caractères accentués autres que les basiques é, è, à nécessitent le 8bit et cela reduit fortement la capacité en caractères d'un SMS.

Charles

smsDecision
03/03/2015, 14h43
Bonjour,

merci pour la réponse.

J'avais un petit problème dans mon code pour encoder en UTF-8
En fait, il faut utiliser la ligne suivante pour encoder le message :
Code:
new String(message.getBytes("UTF-8"), "ISO-8859-1");
En laissant le "coding": "7bit", j'ai bien les messages avec les caractères accentués sauf les caractères suivants: âêëîïôû
Il faut que je passe le paramètre "coding": "8bit" pour avoir les caractères précédents.

Finalement, le code pour envoyer des sms avec des caractères accentués basiques, est le suivant

Code:
public static void sendSms(String message) {
        String ServiceName = "sms-xx000000-1";
        String METHOD = "POST";
        try {
            URL    QUERY  = new URL("https://eu.api.ovh.com/1.0/sms/"+ServiceName+"/jobs/");

            message = new String(message.getBytes("UTF-8"), "ISO-8859-1");

            // mettre coding:8bit si on veut les caractères accentués spéciaux âêëîïôû (par contre le message est limité à 70 caractères
            String BODY   = "{\"coding\":\"7bit\",\"receivers\":[\"+33612345678\"],\"message\":\"" + message + "\",\"priority\":\"high\",\"senderForResponse\":true}";

            long TSTAMP  = new Date().getTime()/1000;

            //Creation de la signature
            String toSign    = AS + "+" + CK + "+" + METHOD + "+" + QUERY + "+" + BODY + "+" + TSTAMP;
            String signature = "$1$" + HashSHA1(toSign);

            HttpURLConnection req = (HttpURLConnection)QUERY.openConnection();
            req.setRequestMethod(METHOD);
            req.setRequestProperty("Content-Type",      "application/json");
            req.setRequestProperty("X-Ovh-Application", AK);
            req.setRequestProperty("X-Ovh-Consumer",    CK);
            req.setRequestProperty("X-Ovh-Signature",   signature);
            req.setRequestProperty("X-Ovh-Timestamp",   "" + TSTAMP);

            if(!BODY.isEmpty())
            {
                req.setDoOutput(true);
                DataOutputStream wr = new DataOutputStream(req.getOutputStream());
                wr.writeBytes(BODY);
                wr.flush();
                wr.close();
            }

            String inputLine;
            BufferedReader in;
            int responseCode = req.getResponseCode();
            if ( responseCode == 200 )
            {
                //Récupération du résultat de l'appel
                in = new BufferedReader(new InputStreamReader(req.getInputStream()));
            }
            else
            {
                in = new BufferedReader(new InputStreamReader(req.getErrorStream()));
            }
            StringBuffer response   = new StringBuffer();

            while ((inputLine = in.readLine()) != null) {
                response.append(inputLine);
            }
            in.close();

            //Affichage du résultat
            System.out.println(response.toString());

        } catch (MalformedURLException e) {
            final String errmsg = "MalformedURLException: " + e;
        } catch (IOException e) {
            final String errmsg = "IOException: " + e;
        }
    }

    //calcul du SHA1
    public static String HashSHA1(String text)
    {
        MessageDigest md;
        try {
            md = MessageDigest.getInstance("SHA-1");
            byte[] sha1hash = new byte[40];
            md.update(text.getBytes("iso-8859-1"), 0, text.length());
            sha1hash = md.digest();
            return convertToHex(sha1hash);
        } catch (NoSuchAlgorithmException e) {
            final String errmsg = "NoSuchAlgorithmException: " + text + " " + e;
            return errmsg;
        } catch (UnsupportedEncodingException e) {
            final String errmsg = "UnsupportedEncodingException: " + text + " " + e;
            return errmsg;
        }
    }

    private static String convertToHex(byte[] data)
    {
        StringBuffer buf = new StringBuffer();
        for (int i = 0; i < data.length; i++) {
            int halfbyte = (data[i] >>> 4) & 0x0F;
            int two_halfs = 0;
            do {
                if ((0 <= halfbyte) && (halfbyte <= 9))
                    buf.append((char) ('0' + halfbyte));
                else
                    buf.append((char) ('a' + (halfbyte - 10)));
                halfbyte = data[i] & 0x0F;
            } while(two_halfs++ < 1);
        }
        return buf.toString();
    }

Charles.A
02/03/2015, 16h23
Bonjour,

Voici un exemple d'envoi généré avec la console :
POST /1.0/sms/sms-XXXXX-1/jobs HTTP/1.1

Host:
api.ovh.com
Accept:
application/json
Content-Type:
application/json;charset=utf-8
X-Ovh-Application:
XXXXX
X-Ovh-Consumer:
XXXXX
X-Ovh-Signature:
XXXXX
X-Ovh-Timestamp:
1425313098

{
"charset": "UTF-8",
"class": "phoneDisplay",
"coding": "7bit",
"message": "test ovh",
"noStopClause": false,
"priority": "high",
"senderForResponse": false,
"validityPeriod": 2880
}
Pouvez-vous essayer de rajouter le paramètre coding : "coding": "7bit" dans votre champ BODY?

Comme vous pouvez le voir tout est en effet en utf8. Le coding 7bit vous permettra de profiter des 160 caractères avec tous les caractères basiques. En 8bit vous avez plus de caractères mais n'allez avoir que 70 caractères de longueur.

smsDecision
26/02/2015, 17h31
Citation Envoyé par PierrYves L
Bonjour,

Pour nous permettre de comprendre le phénomène rencontrés, pouvez-vous nous transmettre l'ensemble de votre code?

Je peux également vous inviter à vous rendre sur le guide disponible sur le lien ci-dessous:

http://www.ovhtelecom.fr/pdf/sms_fax...pi_ovh_en_java

Bien cordialement,
PierrYves L.
Bonjour,

j'ai bien suivi le guide pour envoyer des sms en java, cela fonctionne très bien sans les caractères accentués mais je n'arrive pas à envoyer des sms avec des caractères accentués!

Voici le code utilisé (une copie de votre exemple):

Code:
public static void sendSms(String message) {
        String ServiceName = "sms-xx000000-1";
        String METHOD = "POST";
        try {
            URL    QUERY  = new URL("https://eu.api.ovh.com/1.0/sms/"+ServiceName+"/jobs/");

            //message = new String(message.getBytes("ISO-8859-1"), "UTF-8");

            String BODY   = "{\"receivers\":[\"+33621364479\"],\"message\":\"" + message + "\",\"priority\":\"high\",\"senderForResponse\":true}";

            long TSTAMP  = new Date().getTime()/1000;

            //Creation de la signature
            String toSign    = AS + "+" + CK + "+" + METHOD + "+" + QUERY + "+" + BODY + "+" + TSTAMP;
            String signature = "$1$" + HashSHA1(toSign);

            HttpURLConnection req = (HttpURLConnection)QUERY.openConnection();
            req.setRequestMethod(METHOD);
            req.setRequestProperty("Content-Type",      "application/json");
            req.setRequestProperty("X-Ovh-Application", AK);
            req.setRequestProperty("X-Ovh-Consumer",    CK);
            req.setRequestProperty("X-Ovh-Signature",   signature);
            req.setRequestProperty("X-Ovh-Timestamp",   "" + TSTAMP);

            if(!BODY.isEmpty())
            {
                req.setDoOutput(true);
                DataOutputStream wr = new DataOutputStream(req.getOutputStream());
                wr.writeBytes(BODY);
                wr.flush();
                wr.close();
            }

            String inputLine;
            BufferedReader in;
            int responseCode = req.getResponseCode();
            if ( responseCode == 200 )
            {
                //Récupération du résultat de l'appel
                in = new BufferedReader(new InputStreamReader(req.getInputStream()));
            }
            else
            {
                in = new BufferedReader(new InputStreamReader(req.getErrorStream()));
            }
            StringBuffer response   = new StringBuffer();

            while ((inputLine = in.readLine()) != null) {
                response.append(inputLine);
            }
            in.close();

            //Affichage du résultat
            System.out.println(response.toString());

        } catch (MalformedURLException e) {
            final String errmsg = "MalformedURLException: " + e;
        } catch (IOException e) {
            final String errmsg = "IOException: " + e;
        }
    }

    //calcul du SHA1
    public static String HashSHA1(String text)
    {
        MessageDigest md;
        try {
            md = MessageDigest.getInstance("SHA-1");
            byte[] sha1hash = new byte[40];
            md.update(text.getBytes("iso-8859-1"), 0, text.length());
            sha1hash = md.digest();
            return convertToHex(sha1hash);
        } catch (NoSuchAlgorithmException e) {
            final String errmsg = "NoSuchAlgorithmException: " + text + " " + e;
            return errmsg;
        } catch (UnsupportedEncodingException e) {
            final String errmsg = "UnsupportedEncodingException: " + text + " " + e;
            return errmsg;
        }
    }

    private static String convertToHex(byte[] data)
    {
        StringBuffer buf = new StringBuffer();
        for (int i = 0; i < data.length; i++) {
            int halfbyte = (data[i] >>> 4) & 0x0F;
            int two_halfs = 0;
            do {
                if ((0 <= halfbyte) && (halfbyte <= 9))
                    buf.append((char) ('0' + halfbyte));
                else
                    buf.append((char) ('a' + (halfbyte - 10)));
                halfbyte = data[i] & 0x0F;
            } while(two_halfs++ < 1);
        }
        return buf.toString();
    }
Si je n'encode pas le message en UTF-8, j'ai une erreur "Invalid JSON received", par contre, en l'encodant, j'ai une erreur "Invalid signature".
J'ai essayé plusieurs solutions, mais j'ai toujours le même problème.

Merci de bien vouloir m'aider

PierrYves L
09/02/2015, 18h10
Bonjour,

Pour nous permettre de comprendre le phénomène rencontrés, pouvez-vous nous transmettre l'ensemble de votre code?

Je peux également vous inviter à vous rendre sur le guide disponible sur le lien ci-dessous:

http://www.ovhtelecom.fr/pdf/sms_fax...pi_ovh_en_java

Bien cordialement,
PierrYves L.

1000applis
07/02/2015, 17h33
Bonjour,

Nous ne parvenons pas à envoyer correctement des SMS contenant des caractères accentués en utilisant votre API RESTful (https://eu.api.ovh.com/1.0/sms/{serviceName}/jobs) en java.

En utilisant le bout de code java fourni (http://www.ovhtelecom.fr/pdf/sms_fax...pi_ovh_en_java), cela ne fonctionne pas.
En essayant de le modifier, cela ne fonctionne pas.
Nos paramètres d'encodage sont corrects (UTF-8 partout car iso-8859-1 n'est pas supporté par l'API).

En revanche, nous constatons que cela fonctionne correctement (i.e. les caractères accentués ne sont pas remplacés par des ?) :
- en passant par l'interface d'envoi sur le manager (https://www.ovh.com/managerv3/sms-main.pl)
- en utilisant la console de l'API (https://api.ovh.com/console/)
- en utilisant email to sms (envoi d'un email à email2sms@ovh.net)

Auriez-vous des idées ?

D'avance, merci pour vos réponses.

P.S. : Notre bout de code chargé de l'envoi de la requête :
Code:
...
            HttpURLConnection req = (HttpURLConnection)query.openConnection();
            req.setRequestMethod(method);
            req.setRequestProperty("Accept",            "application/json");
            req.setRequestProperty("Content-Type",      "application/json;charset=utf-8");
            req.setRequestProperty("Accept-Charset",    "utf-8");
            req.setRequestProperty("X-Ovh-Application", APP_KEY);
            req.setRequestProperty("X-Ovh-Consumer",    CONSUMER_KEY);
            req.setRequestProperty("X-Ovh-Signature",   signature);
            req.setRequestProperty("X-Ovh-Timestamp",   "" + ts);

            if(!body.isEmpty()){
                req.setDoOutput(true);
                
                Writer w = new OutputStreamWriter(req.getOutputStream(), StandardCharsets.UTF_8);
                w.write(body.toString());
                w.flush();
                w.close();

                //Code OVH qui ne fonctionne pas non plus
//                DataOutputStream wr = new DataOutputStream(req.getOutputStream());
//                wr.writeBytes(body);
//                wr.flush();
//                wr.close();
            }
...