我现在使用HTTPClient框架进行POST调用,这个方法不是我们的,我发现了一个有趣的特殊字符问题。
调用是发送一个JSON对象,而不是使用parameters.
我几乎完全肯定,我的问题是,我错过了一些关于我的编码头,但我不知道我必须包括在我的电话,我发现很少的信息。
打电话的例子。(我将删除一些用于数据安全的内容)。
这是邮递员呼叫的标题:

这就是我的HTTPClient电话:
headers={Authorization=Bearer XXXXXXXXXXXXXXXX, Accept-Encoding=gzip, deflate, br, Content-Type=application/json}
正如你所看到的,我确信问题就在这里,但我不知道我必须通知哪个参数,更重要的是,为什么。
警察:我以前检查过,但在这里没有发现类似的问题。
谢谢你的帮助
编辑以清除:
当我说“在混合中放置一些特殊字符”时,我向iinside发送的多个变量之一--我的JSON对象--是一个可以包含特殊字符的字符串,更确切地说,我们发送的是名字和姓氏,而实际的问题是字符‘n’。
谢谢你的问题可怕的袋熊。
Edit2:
我日志中的api调用:
2022-05-11 10:20:45,118错误es.fiatc.http_client.GenericOperation.execute-信息: javax.net.ssl.trustStore = null 2022-05-11 10:20:45,495 INFO es.fiatc.http_client.dao.HTTPDao.Execution-执行方法:post with uri:https://XXXXXXXXXXXXXXXXXXXXXXXX 2022-05-11 10:20:45,498 INFO es.fiatc.http_client.dao.HTTPDao.Execu-params: null 2022-05-11 10:20:45 501 INFO es.fiatc.http_client.dao.HTTPDao.Executed-Header:{Authorization=Bearer XXXXXXXXXXXXXXXXX,内容-Type=application/json} 2022-05-11 10:20:45,503 INFO es.fiatc.http_client.dao.HTTPDao.Execu-timeout= 30000 2022-05-11 10:20:45,506 INFO es.fiatc.http_client.dao.HTTPDao.Execu-user- User: null 2022-05-11 10:20:45,508 INFO es.fiatc.http_client.dao.HTTPDao.Execu-PWD: null 2022-05-1110:20:45,511 INFO es.fiatc.http_client.dao.HTTPDao.EXECETSET执行- TrustCertificate: null 2022-05-11 10:20:45,516 INFO es.fiatc.http_client.dao.HTTPDao.execute- TrustCertificatePwd: null 2022-05-11 10:20:45,521 INFO es.fiatc.http_client.dao.HTTPDao.Execu-TrustCertificatePwd:null 2022-05-11 10:20:45,519 INFO es.fiatc.http_client.dtPDao.Execu-FiatcClientCertificate: false 2022-05-11 10:20:45,521 INFO es.fiatc.http_client.dao.HTTPDaoo-实体(类类)):java.lang.String 2022-05-11 10:20:45,524 INFO es.fiatc.http_client.dao.HTTPDao.execute- EntityCharset: null 2022-05-11 10:20:45,526 INFO es.fiatc.http_client.dao.HTTPDao.Execu-EntityMimeType:application/json2022-05-11 10:20:45,529 INFO es.fiatc.http_client.dao.HTTPDao.Execu-Preemptive_authentication: false 2022-05-11 10:20:52,141 INFO es.fiatc.http_client.dao.HTTPDao es.fiatc.http_client.dao.HTTPDao执行-执行请求后传输编码=分组编码,expires=Thu,1981年11月19日08:52:00GMT,缓存控制=无缓存,务实=无缓存,set-cookie=lang=es;expires=Fri,2022-2022 08:21:01 GMT;最大年龄=2592000;路径=/;date=Wed,2022年5月11日:21:01 GMT,严格传输-安全=最大年龄=31536000;includeSubDomains;预加载,xss保护=1;内容类型-选项=nosniff,connection=close},status_code=200,reason_phrase=OK,content=,[B@166a7559} 2022-05-11 10:20:53,756错误connection=close{headers=内容-类型=应用/json,传输-编码=分组,vary=接受-编码,expires=Thu,1981年11月19日:52:00 GMT,缓存控制=无缓存,语用=无缓存,set-cookie=lang=es;expires=Fri,10-6月-2022 08:21:01 GMT;最大年龄=2592000;安全,date=Wed,2022年5月11日08:21:01 GMT,严格传输-安全=最大年龄=31536000;预加载,x-xss-保护=1;模式=块,x-内容-类型-选项=nosniff,connection=close},status_code=200,reason_phrase=OK,content=[B@166a7559} 2022-05-11 10:20:54,935 INFO status_code=200
{“结果”:“错误”,“消息”:“需要有效的用户标识”,“会话is”:null,"execution_time":506,"net_execution_time":506}
我发送的JSONObject示例:
{“电子邮件”:“”、“用户”:“008368790204”、"idnumber":"XXXXXXX“、"idtype":"1”、"mobile_number":"666666666“、”隐私“:”1“、"fname":"MARIA DEL CARMEN”、"lname":"OSUNA“、”性别“:”F“、"date_of_birth":"1969-07-02”、“lname2”:“NU EZ”、"language":"es"}
如果lname2中的特殊字符消失,则api调用可以正常工作。
编辑3:
虽然我不能为调用发布我所有的java,但下面是编码相关的部分:
public static Map execute(String method, String url, Map<String, String> params, Map<String, String> headers,
String user, String pwd, String trustCertificate, String trustCertificateClave, String charset,
Integer timeout, Object entityRequest, String entityCharset, String entityMimeType,
boolean preemtiveAuth, boolean fiatcCertificate) throws Exception {
// Default values
if (charset == null) charset = "UTF-8";
if (timeout == null) timeout = 30000;
// URI
URI uri = new URI(url); // Creamos get o post
if (StringUtils.equals(StringUtils.trim(method), "post"))
{
// Creamos post
HttpPost httpPost = new HttpPost(url);
// Insertamos params en post
if (formparams != null)
{
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(formparams, charset);
httpPost.setEntity(entity);
}
// Insertamos entity en post (también multiparts,...)
insertEntity(httpPost, null, entityRequest, entityMimeType, entityCharset);
// Ponemos en uriRequest
httpPost.setConfig(requestConfig);
uriRequest = httpPost;
} private static void insertEntity(HttpPost httpPost, HttpPut httpPut, Object entityRequest, String entityMimeType, String entityCharset) throws UnsupportedEncodingException
{
// Miramos si existe entidad
if (entityRequest == null) return;
// Creamos contentType
ContentType contentType = null;
if (entityMimeType != null)
{
if (entityCharset == null) contentType = ContentType.create(entityMimeType);
else contentType = ContentType.create(entityMimeType, entityCharset);
}邮递员打电话:

同样,对于我提出问题的方式中的任何格式错误,我也很抱歉。
发布于 2022-05-12 09:50:38
我终于解决了。
这个问题在我们的框架中很深,但一旦发现,这是一个很容易解决的问题:
当您发送一个实体作为一个Post呼叫,它有特殊的字符,你通常编码它。正如ewramner建议我检查的那样,我确认实体编码良好,但现在要将实体发送到API,我们丢失了字符集配置(不是全局配置,而是实体配置)。
解决方案是在实体类型中添加实体的特定字符集,如下所示:
data.put("entity", paramsCrear.toString());
data.put("entity_mime_type", "application/json");
data.put("entity_charset", "UTF-8");似乎邮递员会自动将这个entity_charset添加到每个表单数据中,这就是为什么我在寻找这个特定点时遇到问题的原因。
非常感谢@ewramner和@Scary_wombat
各位,请记住,如果您在java和实体中使用post调用,您可能需要在您编码实体的时候指定字符集(如果它也放在标头中的话)。
https://stackoverflow.com/questions/72210844
复制相似问题