第一類報錯:字符串轉換錯誤和版本問題
在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時才會分配更多的空間,從而減少無謂的內存空間浪費。