Recentemente, ocorreu um erro na interface remota ao usar httpclient para postagem
Mensagem de erro:
org.springframework.http.converter.HttpMessageNotReadableException: Erro de análise JSON: Token não reconhecido 'Alarm': estava esperando (JSON String, Number, Array, Object ou token 'null', 'true' ou 'false'); exceção aninhada é com.fasterxml.jackson.core.JsonParseException: Token não reconhecido 'Alarm': estava esperando (JSON String, Number, Array, Object ou token 'null', 'true' ou 'false')
Razões e soluções:
O motivo é que o formato do parâmetro da requisição não está correto, não é o formato json padrão, basta converter o parâmetro em uma string json através do objeto JSONObject, ou seja, modificar o código de construção do corpo da mensagem.
Erro de código:
public HttpEntity httpPost(String url, Alarm data){
try{
CloseableHttpClient httpClient = HttpClients.createDefault();
// 创建httpPost实例
HttpPost post = new HttpPost(url);
//构造消息头
post.setHeader("Content-type", "application/json; charset=utf-8");
// 构造消息体
StringEntity entity = new StringEntity(data.toString(), ContentType.create("application/json", "utf-8"));
post.setEntity(entity);
CloseableHttpResponse response = httpClient.execute(post);
HttpEntity responseEntity = response.getEntity();
int statusCode = response.getStatusLine().getStatusCode();
//最后关闭HttpClient资源.
httpClient.close();
return responseEntity;
}catch (Exception e){
e.printStackTrace();
return null;
}
}
Código modificado:
public HttpEntity httpPost(String url, Alarm data){
try{
CloseableHttpClient httpClient = HttpClients.createDefault();
// 创建httpPost实例
HttpPost post = new HttpPost(url);
//构造消息头
post.setHeader("Content-type", "application/json; charset=utf-8");
// 构造消息体
StringEntity entity = new StringEntity(new JSONObject(data).toString(), ContentType.create("application/json", "utf-8"));
post.setEntity(entity);
CloseableHttpResponse response = httpClient.execute(post);
HttpEntity responseEntity = response.getEntity();
int statusCode = response.getStatusLine().getStatusCode();
//最后关闭HttpClient资源.
httpClient.close();
return responseEntity;
}catch (Exception e){
e.printStackTrace();
return null;
}
}
JSONObject depende de:
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20211205</version>
</dependency>