BufferedReader UTF-8 BOM - PullRequest
       25

BufferedReader UTF-8 BOM

0 голосов
/ 18 мая 2018

У меня есть метод в Java, где я пытаюсь получить одно целое число (идентификатор пользователя) через запрос JSON POST, это метод:

public static Integer getUserIdOwnerOfMsg(Message msg) {
        Integer idUser = null;
        try {
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("textMsg", msg.getTextMsg());
            jsonObject.put("hourMsg", msg.getHourMsg());

            List list = new LinkedList();
            list.addAll(Arrays.asList(jsonObject));
            String jsonString = list.toString();

            String urlStr = SERVER_PATH + "getUserIdOwnerOfMsgJSON.php";
            URL url = new URL(urlStr);

            HttpURLConnection con = (HttpURLConnection) url.openConnection();
            con.setRequestMethod("POST");
            con.setRequestProperty("User-Agent", "your user agent");
            con.setRequestProperty("Accept-Language", "sp,SP;q=0.5");
            //con.setRequestProperty("Content-Type", "text/html; charset=UTF-8");

            String urlParameters = "json=" + jsonString;

            con.setDoOutput(true);
            DataOutputStream wr = new DataOutputStream(con.getOutputStream());
            wr.writeBytes(urlParameters);
            wr.flush();
            wr.close();

            InputStream instream;

            int status = con.getResponseCode();

            if (status != HttpURLConnection.HTTP_OK)
                instream = con.getErrorStream();
            else
                instream = con.getInputStream();

            BufferedReader in = new BufferedReader(new InputStreamReader(instream, "UTF-8")); // ISO-8859-1
            in.mark(1);
            if(in.read() != 0xFEFF)
                in.reset();
            String inputLine;
            StringBuilder response = new StringBuilder();

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

            in.close();

            JSONObject object = new JSONObject(response.toString());
            Boolean correct = object.getBoolean("correct");
            if (correct) {
                idUser = object.getInt("id");

            }

        } catch (Exception e) {
            e.printStackTrace();
        }
        return  idUser;
    }

Проблема заключается в том, что ответ содержит UTF-8 BOM персонаж, на почтальоне, результат в порядке, и я вижу идентификатор: (* {"id":"7","correct":true})

Postman

Но отладка на Android Studio я получилзначение "" или null для idUser, я не знаю почему, я пробовал так много способов решить эту проблему без успеха.

Также на php серверной стороне яЯ выполнил echo mb_detect_encoding($idUsuario);, и я получил кодировку ASCII на случай, если это поможет найти решение.

Любая помощь будет оценена, спасибо!

1 Ответ

0 голосов
/ 19 мая 2018

Итак, наконец, я получил решение, я выкладываю его здесь на тот случай, если у кого-то возникнет та же проблема, что и у меня, проблема была с параметрами JSON, потому что они включали UTF-8 символов, таких как , поэтому вместо чтенияпараметры как это:

wr.writeBytes (urlParameters);

Я должен сделать это:

byte[] buf = urlParameters.getBytes("UTF-8");
wr.write(buf, 0, buf.length);

Я также публикую полную функцию на случай, если кому-то понадобится:

public static Integer getUserIdOwnerOfMsg(Message msg) {
    Integer idUser = null;
    try {
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("textMsg", msg.getTextMsg());
        jsonObject.put("hourMsg", msg.getHourMsg());

        List list = new LinkedList();
        list.addAll(Arrays.asList(jsonObject));
        String jsonString = list.toString();

        String urlStr = SERVER_PATH + "getUserIdOwnerOfMsgJSON.php";
        URL url = new URL(urlStr);

        HttpURLConnection con = (HttpURLConnection) url.openConnection();
        con.setRequestMethod("POST");
        con.setRequestProperty("User-Agent", "your user agent");
        con.setRequestProperty("Accept-Language", "sp,SP;q=0.5");

        String urlParameters = "json=" + jsonString;

        con.setDoOutput(true);
        DataOutputStream wr = new DataOutputStream (con.getOutputStream());
        byte[] buf = urlParameters.getBytes("UTF-8");
        wr.write(buf, 0, buf.length);
        wr.flush();
        wr.close();

        InputStream instream;

        int status = con.getResponseCode();

        if (status != HttpURLConnection.HTTP_OK)
            instream = con.getErrorStream();
        else
            instream = con.getInputStream();

        BufferedReader in = new BufferedReader(new InputStreamReader(instream, Charset.forName("UTF-8")),8192);
        String inputLine;
        StringBuilder response = new StringBuilder();

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

        JSONObject object = new JSONObject(response.toString());
        Boolean correct = object.getBoolean("correct");
        if (correct) {
            try {
                String idUserText = object.getString("id");
                idUser = Integer.valueOf(idUserText);
            } catch (NumberFormatException e) {
                e.printStackTrace();
            }
        }
        in.close();

    } catch (Exception e) {
        e.printStackTrace();
    }
    return  idUser;
}

Вот и все, счастливого кодирования!

...