工作中經常會被同事問這個http請求為什么調不通,我雖然能解釋清楚錯誤是什么,但是沒有總結過,想到剛開始時,也是看了別人的文章才會的,所以總結一下,貢獻一下自己的經驗。
http 404 響應
404響應可以說是,在java web中最常見的錯誤了,基本上大家都理解問題產生的原因,即找不到這個資源。
- 路徑匹配錯誤導致的404
比如說請求的訪問路徑為http://localhost:8080/project/test,但是訪問路徑確實http://localhost:8080/project/tset, 這樣就會報404錯誤,這是最常見的;
如果,項目名寫錯了呢?
測試結果如下:
Request URL:http://localhost:8080/projects/test
Request Method:OPTIONS
Status Code:404 Not Found
Remote Address:[::1]:8080
Referrer Policy:no-referrer-when-downgrade
仍然是404錯誤。
- 如果路徑端口或ip寫錯誤
如果把端口寫錯了,測試結果如下:
Request URL:http://localhost:8090/project/test
Referrer Policy:no-referrer-when-downgrade
Request Headers
Provisional headers are shown
Access-Control-Request-Headers:content-type
Access-Control-Request-Method:POST
Origin:http://localhost:8010
Referer:http://localhost:8010/
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36
沒有狀態值,也沒有錯誤信息,所以看到這樣的請求,可以查看一下是否端口寫錯了。
如果把ip寫錯了,測試結果如下:
Request URL:http://www.baidu.com:8090/project/test
Referrer Policy:no-referrer-when-downgrade
Request Headers
Provisional headers are shown
Access-Control-Request-Headers:content-type
Access-Control-Request-Method:POST
Origin:http://localhost:8010
Referer:http://localhost:8010/
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36
還是這樣的錯誤,所以遇到這樣的錯誤,不僅要查看端口,還要查看ip是不是對的。
- 總結
路徑寫錯了,一般會導致404錯誤,還有可能導致無法調通,遇到以上錯誤,可查找對應的原因,解決錯誤。遇到404了,不要總想着自己沒錯。總有同事會說,怎么可能寫錯,我復制過來的,可能你確實是復制的接口文檔的內容,但是后台開發的同事改了或者寫錯了,與其糾結到底誰的責任,不如早點查到問題原因。
http 400響應
http 400錯誤,也算是一個比較常見的錯誤,這種錯誤的原因非常明確,就是請求的數據和接受的數據無法匹配,有一下兩種常見情況:
- 數據格式錯誤
我初期經常遇到這種錯誤,比如說,我的后台接口接受參數的代碼如下:
public Message getTestInfo(@RequestBoday Test test) {
Message message = new Message();
`````省略
return message
}
基本上,用過的一看就明白,這是接受一個json字符串格式的數據,把數據映射到Test類上。而那時候,我用jquery ajax提交數據經常這么寫:
$.ajax({
type: "POST",
url: "test",
contentType: "application/json; charset=utf-8",
data: form.serialize(),
dataType: "json",
success: function (message) {
if (message > 0) {
alert("請求已提交!我們會盡快與您取得聯系");
}
},
error: function (message) {
$("#request-process-patent").html("提交數據失敗!");
}
});
當時還不懂這東西,都是跟着別人寫,記得當時同事都下班,自己寫的時候遇到這種錯誤,想的頭都疼了都不知道怎么改。
返回的錯誤信息如下:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
<title>Error 400 Bad Request</title>
</head>
<body><h2>HTTP ERROR 400</h2>
<p>Problem accessing /project/test. Reason:
<pre> Bad Request</pre></p><hr><a href="http://eclipse.org/jetty">Powered by Jetty:// 9.4.1.v20170120</a><hr/>
</body>
</html>
錯誤很明顯,數據實際格式表單格式,后台接受json字符串格式,怎么可能對?(這里有一個前提條件,前后的請求類型要一致,后台只接收post請求,前台發的也是post請求,如果發的是get請求,就會報Error 405 Request method 'GET' not supported 錯誤)。
- 字段數據類型不一致
這種問題很常見,比如給數值字段傳了一個含有非數值的字符串,給數組或者集合傳了字符串;
下面是接收數據的對象,接收的數據格式為json字符串:
public class Test{
private int test;
}
我發送的參數的格式
{
"test":"abc" }
測試結果:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
<title>Error 400 Bad Request</title>
</head>
<body><h2>HTTP ERROR 400</h2>
<p>Problem accessing /cybx-core-service/role/test. Reason:
<pre> Bad Request</pre></p><hr><a href="http://eclipse.org/jetty">Powered by Jetty:// 9.4.1.v20170120</a><hr/>
</body>
</html>
出現400錯誤了。
- 總結
所以遇見400錯誤,只要從這兩方面找問題,基本都能解決問題。
http 415響應
遇見415響應的問題相對較少一些,而且這個響應的問題也非常明確,前后台媒體類型不一致,可以簡單理解為content-type不一致。
@RequestMapping(value = "test", method = RequestMethod.POST)
public Message test(@RequestBody Test test) {
Message message = new Message();
System.out.println("參數是==" + test.getRname());
return message;
}
上面這種寫法,是在spring mvc框架的項目中常見的寫法,接收post請求,接收json字符串參數,下面是請求:
Request URL:http://localhost:8010/project/role/test
Request Method:POST
Status Code:415 Unsupported Media Type
Remote Address:127.0.0.1:8010
Referrer Policy:no-referrer-when-downgrade
Accept:application/json, text/plain, */* Accept-Encoding:gzip, deflate, br Accept-Language:zh-CN,zh;q=0.8 Connection:keep-alive Content-Length:29 Content-Type:application/x-www-form-urlencoded;charset=UTF-8 {"test":"123"}:
這是返回的響應:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
<title>Error 415 Unsupported Media Type</title>
</head>
<body><h2>HTTP ERROR 415</h2>
<p>Problem accessing /cybx-core-service/role/test. Reason:
<pre> Unsupported Media Type</pre></p><hr><a href="http://eclipse.org/jetty">Powered by Jetty:// 9.4.1.v20170120</a><hr/>
</body>
</html>
由此可知,即使實體中的數據是json字符串格式,請求也是post請求,只要content-type不一致,就會報415錯誤。
- 總結
遇到415錯誤,首先要確定接口到底要接收什么格式的數據,然后再看一下請求發送的是什么格式,問題基本上就解決了。
但是當你不知道自己調用的接口是需要什么格式的數據的時候,請先確定接口類型;如果是調用第三方接口,就向第三方接口索要接口對接文檔,如果是同事寫的,就向同事確認接口類型;我的同事對接第三方接口時,經常遇到不明不白的接口,做的第一件事就是打電話和qq向他們要資料。
http 320響應
302響應遇到相當少的一個錯誤,大概只遇到不到10次,但是有點詭異的一個錯誤,只要去網上搜,基本都會看到臨時重定向這個解釋。我的同事告訴我這是網絡的問題,和代碼沒有關系,只能怪運氣不好,刷新一下就好了。
但是,我遇到了幾次,全都是因為后台代碼執行出現了錯誤導致的,有人會說代碼出錯,不應該報500響應么,怎么會是302。
這就是我說的詭異的情況,代碼執行出錯卻報了302錯誤。可惜的是我沒有保留當時的日志文件,我現在無法重現這個錯誤。
所以,我建議,如果遇到302錯誤,先不要把錯誤推給重定向,也有可能是代碼出錯了,找到詳細的執行日志,看看有沒有錯誤,有可能就是錯誤導致的。
http 500響應
500響應,這是最常見額錯誤,一般都是后台代碼執行出錯了,只要找到錯誤代碼修改就行,沒什么好說的。
總結
以上就是我處理http響應的經驗,希望能幫到他人,也算一個總結。
原文地址:https://blog.csdn.net/u010173095/article/details/77652107