草庐IT

feign调用不通问题,JSON parse error: Illegal character ((CTRL-CHAR, code 31)): only regular white space (\r

嗯哼哈吼嘻 2023-07-15 原文

1、 ​​​​​​feign不指定url调用不通,
        新知识:原来url:http://172.29.126.162:1010/hc-system/platform/organization/person/10001

使用微服务调用:http://hc-system/platform/organization/person/10001,去掉ip和端口也能调用通。

(ribbon负载均衡)feign指定ip和端口时,会把ip和端口拼在url前,不指定的话会把服务名拼接在url前。

        背景:开始写松兰山项目时,使用feign调用hc那边服务的接口,因为不指定url(ip和端口)时调用不通,所以指定了url,这时是能够调通的。

        ①最开始指定ip、端口时,

 这时候因为指定了url,所以不会把服务名拼接在url前,只会把ip、端口拼在url前,打开feign日志查看url。

完整url: http://172.29.126.162:1010/hc-system/platform/organization/person/10001 能够调通。

        ②后面去掉了url,直接部署,发现报错,

完整url变成: http://hc-system/hc-system/platform/organization/person/10001。

这时我才怀疑不指定url时会自动把服务名拼接在url前,然后发起请求。

       ③后面因为正式环境要开始上了,所以必须把url去掉,这时候去掉了url无法调用,后来才知道貌似feign会不指定ip时,会自动把服务名拼接在url前面(还不知道为什么),因此导致错误。

        不指定url时:

这时就能请求成功!!!!!

        ps:还有个小问题,我之前的项目,不指定ip和端口,但是还是在url前加上了服务名,不知道为什么还是能请求成功,还需要进一步思考。

  2、 背景:feign调用不通,报错,困了我快一个月!!!可恶,中间花了两天解决,把百度都试了一遍,都没有用,都快哭了,现在说下解决过程。

        开始我打开了日志进行进一步查看报错信息,需要在feign使用配置文件中加入日志级别,日志级别是FULL,并在配置文件中也加入日志级别。

 

 

3、然后发现报错404 not found,开始以为是参数不够,被调用为三个参数,调用时传两个参数,加上了之后还是报错,然后发现是注解用错了,之前用的是@PathVariable(复制过来没有改),使用@RequestParam后错误改变(低级错误)。

4、报错: nested exception is com.fasterxml.jackson.core.JsonParseException: Illegal character ((CTRL-CHAR, code 31)): only regular white space (\r, \n, \t) is allowed between tokens
 at [Source: (ByteArrayInputStream); line: 1, column: 2]。

5、然后feign调用接口,使用String接收,把字符串打印出来, 发现乱码了???

         还发现传回来是二进制数据??

        然后开始了疯狂的百度中,中间试了无数次,各种加什么配置,去掉压缩之类的都不行,还有加过滤器什么的也不行。

        最后终于在一个大哥的文章中发现了答案,他和我一样是打印出来发现乱码,这个问题就是gzip接收到的还是压缩数据,所以乱码,还是试了一下他说没用的配置,结果对我有用!!!!!(他下面真正对她有用的方法对我没用,也是加拦截器)

线上问题处理-feign调用报错(Illegal character ((CTRL-CHAR, code 31)): only regular white space (\r, \n, \t) )_im_ayday的博客-CSDN博客_feign调用报错处理

 答案:在配置文件中加入feign.compression.response.useGzipDecoder为true即可。

  6、乱码的事情没了,发现只有中文乱码了,靠!!!!!!又整了我好久好久,百度的所有方案都试过了,还看了feign日志所有参数,好像也没问题的,人都快哭了,终于找到了解决方案。

@Configuration
public class FeignConfig implements RequestInterceptor {
    @Autowired
    private ObjectFactory<HttpMessageConverters> messageConverters;

    @Bean
    public Encoder feignFormEncoder() {
        return new SpringFormEncoder(new SpringEncoder(messageConverters));
    }

    @Bean
    public Decoder feignDecoder() {
        return new ResponseEntityDecoder(new SpringDecoder( () -> {
            FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter() {
                @Override
                public Object read(Type type, Class<?> contextClass, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException {
                    Object result=null;
                    if ("java.lang.String".equals(type.getTypeName())) {
                        result= StreamUtils.copyToString(inputMessage.getBody(), Charset.forName("utf8"));
                    } else {
                        result=super.read(type, contextClass, inputMessage);
                    }
                    return result;
                }
            };
            return new HttpMessageConverters(fastConverter);
        }));
    }

    @Override
    public void apply(RequestTemplate requestTemplate) {
        try {
            ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder
                    .getRequestAttributes();
            if (null != servletRequestAttributes) {
                HttpServletRequest request = servletRequestAttributes.getRequest();
                // 获取所有头文件信息的key
                Enumeration<String> headerNames = request.getHeaderNames();
                if (null != headerNames) {
                    while (headerNames.hasMoreElements()) {
                        // 获取头文件的key和value
                        String headerName = headerNames.nextElement();
                        String headerValue = request.getHeader(headerName);
                        // 跳过content-length,不然可能会报too many bites written问题
                        if ("content-length".equalsIgnoreCase(headerName)) {
                            continue;
                        }
                        // 将令牌数据添加到头文件中,当用feign调用的时候,会传递给下一个微服务
                        requestTemplate.header(headerName, headerValue);
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Bean
    public Logger.Level feignLoggerLevel() {
        return Logger.Level.FULL;
    }

}

参考:Feign乱码 - 知乎

答案:加了个解码器,转成utf8就可以了。 

7、本来前面的feign调用都能够在线上正常运行了,突然很多feign调用报错,还都是同一个错。

feign.codec.DecodeException: Error while extracting response for type [com.entity.Result<com.baomidou.mybatisplus.extension.plugins.pagination.Page<com.emergency.pojo.HcUser>>] and content type [application/json]; nested exception is org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: syntax error, expect {, actual [, pos 685, fieldName roles, fastjson-version 1.2.83; nested exception is com.alibaba.fastjson.JSONException: syntax error, expect {, actual [, pos 685, fieldName roles, fastjson-version 1.2.83

        说是转换问题,主要我feign调好之后就没动过代码了,咋突然坏了??

        然后我进行了大量百度,试了很多也改不好,我以为是nacos配置的修改了的问题或者又要重写解码器,实际情况就是一个服务是的接口是好的,另一个服务的几个接口是报错的。后面让一个同事看了一下,原来是被调用方把数据结构给改了,靠,导致转换错误,是中间一个字段从对象改成了对象的数组,导致json转换错误。

 答案:还是先好好看看错误,不用一开始就把问题想的太复杂,先看看被调用方有没有修改。

有关feign调用不通问题,JSON parse error: Illegal character ((CTRL-CHAR, code 31)): only regular white space (\r的更多相关文章

  1. ruby - 通过 RVM 安装 Ruby 1.9.2 永远行不通! - 2

    当我执行>rvminstall1.9.2时一切顺利。然后我做>rvmuse1.9.2也很顺利。但是当涉及到ruby​​-v时..sam@sjones:~$rvminstall1.9.2/home/sam/.rvm/rubies/ruby-1.9.2-p136,thismaytakeawhiledependingonyourcpu(s)...ruby-1.9.2-p136-#fetchingruby-1.9.2-p136-#downloadingruby-1.9.2-p136,thismaytakeawhiledependingonyourconnection...%Total%Rece

  2. ruby-on-rails - Rails 2.3.5 : How does one access code inside of lib/directory/file. rb? - 2

    我创建了一个文件,这样我就可以在lib/foo/bar_woo.rb中的许多模型之间共享一个方法。在bar_woo.rb中,我定义了以下内容:moduleBarWoodefhelloputs"hello"endend然后在我的模型中我正在做类似的事情:defMyModel解释器提示它期望bar_woo.rb定义Foo::BarWoo。《使用Rails进行敏捷Web开发》一书指出,如果文件包含类或模块,并且文件使用类或模块名称的小写形式命名,那么Rails将自动加载文件。因此我不需要它。定义代码的正确方法是什么,在我的模型中调用代码的正确方法是什么? 最佳答案

  3. ruby 单元测试 : run some code after each failed test - 2

    在Test::Unit中的ruby​​单元测试断言失败后,在执行teardown之前,是否有一些简洁优雅的方法来立即执行我的代码?我正在做一些自动化的GUI测试,并希望在出现问题后立即截图。 最佳答案 如果您使用的是1.9,请不要使用Test::Unit::TestCase作为您的基类。对其进行子类化并覆盖#run_test以进行救援,截取屏幕截图并重新提出:classMyAbstractTestCase或者,我认为这实际上是最简洁的方法,您可以使用before_teardownHook:classMyTestCase这不适用于1.

  4. ruby - 如何将字符串格式的毫秒数转换为 HH :MM:SS format in Ruby in under 3 lines of code? - 2

    @scores_raw.eachdo|score_raw|#belowiscodeiftimewasbeingsentinmillisecondshh=((score_raw.score.to_i)/100)/3600mm=(hh-hh.to_i)*60ss=(mm-mm.to_i)*60crumbs=[hh,mm,ss]sum=crumbs.first.to_i*3600+crumbs[1].to_i*60+crumbs.last.to_i@scoressum,:hms=>hh.round.to_s+":"+mm.round.to_s+":"+ss.round.to_s}@score

  5. ruby-on-rails - 如何防止错误 "code converter not found (UTF-8)"? - 2

    我在生产环境(CentOS5.6)中遇到此错误,但在开发环境(Ubuntu11.04)中运行良好。在这两种环境中,该应用程序都使用Ruby1.9.3和Rails3.0.9,并由passenger和nginx提供服务。我的Mechanizegem版本是2.3。未找到代码转换器(UTF-8)此代码的最后一行触发它:mech=Mechanize.newpage=mech.get("http://myurl.com/login.php?login_name=a&password=b")form=page.form_with(:name=>"loginForm")form.field_with(

  6. ruby-on-rails - 运行 Heckle 时出错? `current_code' : undefined method `translate' for Ruby2Ruby - 2

    我正在尝试运行Heckle,但一直出现错误:>specspec/controllers/my_controller_spec.rb--heckleMyController!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!exception=hasathickskin.There'snothingtoheckle.!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!(Runsthroughseveralmu

  7. ruby-on-rails - 如何从 Visual Studio Code 运行和调试 Ruby on Rails? - 2

    如何使用内置的VisualStudioCode启动/调试功能启动RubyonRails?如何修复Debuggerterminalerror:Processfailed:spawnrdebug-ideENOENT错误? 最佳答案 设置和启动安装VSCodeRubyplugin(在macOS上按⌘+⇧+P或ctrl+⇧+P别处并在提示中输入extinstall,然后搜索ruby)安装一些必需的Rubygemgeminstallruby-debug-idegeminstalldebase添加launchconfiguration在Visu

  8. Feign传递文件以及MultipartFile对象 - 2

    Feign微服务调用传递文件以及MultipartFile多媒体参数对象上游服务提供者测试服务提供者下游消费者异常原因错误解决方案通过Feign调用接口,来到jdk动态代理的invoke方法,拿到分发器,执行invoke逻辑。invoke方法:构建ReuqestTemplate以及请求报文,执行并解密,执行请求拦截器。可行的解决方案寻找SpringEncoder来源注册自定义Encoder编写自定义Encoder自定义文件上传接口标识注解编写encode逻辑测试总结上游服务提供者使用spring接收文件可以使用MultipartFile对象,并同时使用RequestPart注解标识这个一个多媒

  9. ruby-on-rails - 有没有 "Code Complete"的 Ruby 书? - 2

    我开始阅读“代码完整”第2版这本书,但当我注意到大多数解决方案都可以使用Ruby惯用法在Ruby中轻松解决时,我停止了阅读。有没有类似的Ruby书籍?这是我开始阅读的版本:http://www.amazon.com/Code-Complete-Practical-Handbook-Construction/dp/0735619670 最佳答案 把那本书拿回来,从你离开的地方开始。作为阅读第一版并且最近以编写Ruby为生的人,我可以自信地说CodeComplete的类(class)是通用的。那本书中关于良好代码构造的智慧-质量命名、解

  10. ruby - 为什么在 Ruby 中使用类变量被视为 'code smell' ? - 2

    根据Reek,创建类变量被认为是“代码味道”。这背后的解释是什么? 最佳答案 您可以在他们关于ClassVariables的文档中找到:Classvariablesformpartoftheglobalruntimestate,andassuchmakeiteasyforonepartofthesystemtoaccidentallyorinadvertentlydependonanotherpartofthesystem.Sothesystembecomesmorepronetoproblemswherechangingsomet

随机推荐