1. 程式人生 > >http響應總結:常見http響應錯誤總結

http響應總結:常見http響應錯誤總結

工作中經常會被同事問這個http請求為什麼調不通,我雖然能解釋清楚錯誤是什麼,但是沒有總結過,想到剛開始時,也是看了別人的文章才會的,所以總結一下,貢獻一下自己的經驗。

http 404 響應

404響應可以說是,在java web中最常見的錯誤了,基本上大家都理解問題產生的原因,即找不到這個資源。

  • 路徑匹配錯誤導致的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響應的經驗,希望能幫到他人,也算一個總結。