zoukankan      html  css  js  c++  java
  • HTTP 400 错误

    第一类报错:字符串转换错误和版本问题

    在ajax请求后台数据时有时会报 HTTP 400 错误 - 请求无效 (Bad request);出现这个请求无效报错说明请求没有进入到后台服务里;

    原因:

       1)前端提交数据的字段名称或者是字段类型和后台的实体类不一致,导致无法封装;

            2)前端提交的到后台的数据应该是json字符串类型,而前端没有将对象转化为字符串类型;

    解决方案:

      1)对照字段名称,类型保证一致性

      2)使用stringify将前端传递的对象转化为字符串    data: JSON.stringify(param)  ;

    具体案例:

    Http Get 或 Http Post都不能传包含 "(引号)、"{"、"}"(花括号)这样的参数,需要对特殊字符进行转义,把 " 转成%22,把 { 转成%7b,把 } 转成%7d
    
       String url = "http://127.0.0.1:9000/signal/Resource?param={"name":"service1","param":{"id":"1"}}";
       url = url.replace(""", "%22").replace("{", "%7b").replace("}", "%7d"); 
    注意:参数里面如果有 空格的话,也需要转义,否则会有问题。

    从本地继续测试,跟踪tomcat console后台,发现后台报错:

    java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986
    
        at org.apache.coyote.http11.InternalInputBuffer.parseRequestLine(InternalInputBuffer.java:189)
    
        at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1000)
    
        at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:637)
    
        at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:318)
    
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    
        at java.lang.Thread.run(Thread.java:745)

    原因:tomcat 版本问题

    Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986
    
    Tomcat换一个低一点的版本可以!这是因为高一点的Tomcat版本对URL有更严格的要求,当你的URL中包含了超出RFC 7230和RFC 3968所定义的字符时,就会报错。
    
    本地使用的是tomcat7.0.73,正常运行的使用的是toamcat7.0.47
    
    回测后,页面返回正常。

    原文链接:https://blog.csdn.net/juan0901/java/article/details/82415612

    第二类报错:请求体过大

    存储超大HTTP头部的内存buffer大小

    语法:large_client_header_buffers number size;
    
    默认:large_client_header_buffers 48k;
    
    配置块:http、server

    large_client_header_buffers定义了Nginx接收一个超大HTTP头部请求的buffer个数和每个buffer的大小。如果HTTP请求行(如GET/index HTTP/1.1)的大小超过上面的单个buffer,则返回"Request URI too large"(414)。请求中一般会有许多header,每一个header的大小也不能超过单个buffer的大小,否则会返回"Bad request

    (400)。当然,请求行和请求头部的总和也不可以超过buffer个数*buffer大小。

    也就是:

    1.如果你的请求中的header都很大,那么应该使用client_header_buffer_size,这样能减少一次内存分配。

    2.如果你的请求中只有少量请求header很大,那么应该使用large_client_header_buffers,因为这样就仅需在处理大header时才会分配更多的空间,从而减少无谓的内存空间浪费。

  • 相关阅读:
    Android数据存储之File
    Openfiler使用说明
    nginx的upstream目前支持5种方式的分配
    centOS 6.5关闭防火墙步骤
    yum下载文件的存放位置
    ubuntu如何开启root,如何启用Ubuntu中root帐号
    ubuntu下的apt-get内网本地源的搭建
    [转]StarWind模拟iSCSI设备
    ORACLE删除某用户下所有对象
    [转]oracle导入提示“IMP-00010:不是有效的导出文件,头部验证失败”的解决方案
  • 原文地址:https://www.cnblogs.com/zh-dream/p/12742550.html
Copyright © 2011-2022 走看看