Java-код, преобразовывающий специальный символ в мусорный - PullRequest
0 голосов
/ 03 октября 2019

Я столкнулся с проблемой, заключающейся в том, что, когда я публикую сообщение json со специальным символом из Java-программы, этот специальный символ (скажем, в O'Reilly) заменяется на?. Если я отправлю такое же сообщение от POSTMAN, я получу правильный ответ. Не могли бы вы предложить, как решить эту проблему?

Спасибо.

Ниже приведены код и json, который я использую:

{"lastName": "O'Reilly "," firstName ":" Shaun "}

package rest_apis;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

public class IDQ_tranformation_cd {

    public static void main(String args[]){
        String json_req="{"lastName":"O’Reilly","firstName":"Shaun"}";

        try{
          CloseableHttpClient httpclient = HttpClients.createDefault();
          String instanceUrl = "https://my-end-point";
          URIBuilder builder = new URIBuilder(instanceUrl);

          StringEntity params =new StringEntity(json_req);
          HttpPost post_data = new HttpPost(builder.build());

          post_data.addHeader("Content-Type","application/json");
          post_data.addHeader("Accept", "application/json");

          post_data.setEntity(params);

          HttpResponse queryResponse = httpclient.execute(post_data);
                    int Out_RespCd = queryResponse.getStatusLine().getStatusCode();
          HttpEntity httpEntity = queryResponse.getEntity();

          System.out.println(Out_RespCd +":"+EntityUtils.toString(httpEntity));
        } catch (Exception e) {
          System.out.println("Exception :"+e.toString());
        } 
    }
}

Я ожидаю правильного вывода как (я могу получить это, когда использую почтальона):

{"lastName":"O’Reilly","firstName":"Shaun"}

Но я получаю это, когда использую код Java ('заменен на?)

{"lastName":"O?Reilly","firstName":"Shaun"}

Ответы [ 2 ]

0 голосов
/ 04 октября 2019

Спасибо всем за помощь. Это сработало после изменения строки ниже в коде:

StringEntity params =new StringEntity(json_req,"UTF-8");

Данная статья была очень полезной.

HttpPost с StringEntity, имеющим специальные символы, такие как ®, видящий ® ½` вместо ®

0 голосов
/ 03 октября 2019

Попробуйте изменить свою строку:

post_data.addHeader("Content-Type","application/json");

на

post_data.addHeader("Content-Type","application/json; charset=utf-8");

Кроме того, возможно, что вы получаете данные в порядке, и только дисплей отображается неправильно. То, что мне неоднократно помогало диагностировать подобные проблемы, - это преобразование «проблемной» строки в последовательность юникодов. Там вы можете увидеть, верны ли сами данные, и только отображение повреждено или повреждены сами данные. Существует библиотека Java с открытым исходным кодом MgntUtils, в которой есть утилита, которая преобразует строки в последовательность Unicode и наоборот:

result = "Hello World";
result = StringUnicodeEncoderDecoder.encodeStringToUnicodeSequence(result);
System.out.println(result);
result = StringUnicodeEncoderDecoder.decodeUnicodeSequenceToString(result);
System.out.println(result);

Вывод этого кода:

\u0048\u0065\u006c\u006c\u006f\u0020\u0057\u006f\u0072\u006c\u0064
Hello World

Библиотека можетможно найти в Maven Central или Github Он поставляется в виде артефакта maven с исходными кодами и JavaDoc

Вот JavaDoc для класса StringUnicodeEncoderDecoder . Также в этой библиотеке есть очень простой Http клиент .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...