首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有特殊字符的Java调用

带有特殊字符的Java调用
EN

Stack Overflow用户
提问于 2022-05-12 06:13:34
回答 1查看 1.2K关注 0票数 -1

我现在使用HTTPClient框架进行POST调用,这个方法不是我们的,我发现了一个有趣的特殊字符问题。

调用是发送一个JSON对象,而不是使用parameters.

  • The调用在我的代码和邮递员中工作得很好,但是,如果我在混合中添加一些特殊字符,HTTPClient就会失败(但是邮递员仍然工作得很好)。

我几乎完全肯定,我的问题是,我错过了一些关于我的编码头,但我不知道我必须包括在我的电话,我发现很少的信息。

打电话的例子。(我将删除一些用于数据安全的内容)。

这是邮递员呼叫的标题:

这就是我的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,但下面是编码相关的部分:

代码语言:javascript
复制
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);

代码语言:javascript
复制
    // 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;
    }

代码语言:javascript
复制
  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);
        }

邮递员打电话:

同样,对于我提出问题的方式中的任何格式错误,我也很抱歉。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-12 09:50:38

我终于解决了。

这个问题在我们的框架中很深,但一旦发现,这是一个很容易解决的问题:

当您发送一个实体作为一个Post呼叫,它有特殊的字符,你通常编码它。正如ewramner建议我检查的那样,我确认实体编码良好,但现在要将实体发送到API,我们丢失了字符集配置(不是全局配置,而是实体配置)。

解决方案是在实体类型中添加实体的特定字符集,如下所示:

代码语言:javascript
复制
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调用,您可能需要在您编码实体的时候指定字符集(如果它也放在标头中的话)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72210844

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档