Обработка ошибок с помощью http.NewRequest в Go

#http #go

#http #Вперед

Вопрос:

Я использовал http.NewRequest для отправки запроса GET.

Я намеренно попытался изменить URL API, просто чтобы проверить, работает ли моя обработка ошибок.

Но это работает не так, как ожидалось. Возвращается значение ошибки, и я не могу его сравнить.

     jsonData := map[string]string{"firstname": "Nic", "lastname": "Raboy"}
    jsonValue, _ := json.Marshal(jsonData)    
request, err := http.NewRequest("POST", "http://httpbin.org/postsdf", bytes.NewBuffer(jsonValue))


        request.Header.Set("Content-Type", "application/json")
        client := amp;http.Client{}
        response, err := client.Do(request)

        if err != nil {
            fmt.Println("wrong")

        } else {
            data, _ := ioutil.ReadAll(response.Body)
            fmt.Println(string(data))
        }
  

Результат выглядит следующим образом:

 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<title>404 Not Found</title>
<h1>Not Found</h1>
<p>The requested URL was not found on the server.  If you entered the URL manually please check your spelling and try again.</p>
  

Но я ожидаю напечатать «Неправильно».

Ответ №1:

HTTP-вызов выполнен успешно (вызов прошел на сервер, и ответ пришел обратно), вот почему err это nil . Просто код состояния HTTP не является http.StatusOK (но, судя по документу ответа, это http.StatusNotFound ).

Вы должны проверить код состояния HTTP следующим образом:

 response, err := client.Do(request)
if err != nil {
    fmt.Println("HTTP call failed:", err)
    return
}
// Don't forget, you're expected to close response body even if you don't want to read it.
defer response.Body.Close()

if response.StatusCode != http.StatusOK {
    fmt.Println("Non-OK HTTP status:", response.StatusCode)
    // You may read / inspect response body
    return
}

// All is OK, server reported success.
  

Также обратите внимание, что некоторые конечные точки API могут возвращать данные, отличные от http.StatusOK для успешного выполнения, такие как HTTP 201 - Created , или HTTP 202 - Accepted и т.д. Если вы хотите проверить все коды статуса успешного выполнения, вы можете сделать это следующим образом:

 // Success is indicated with 2xx status codes:
statusOK := response.StatusCode >= 200 amp;amp; response.StatusCode < 300
if !statusOK {
    fmt.Println("Non-OK HTTP status:", response.StatusCode)
    // You may read / inspect response body
    return
}
  

Ответ №2:

вы должны использовать код состояния, вы также можете написать небольшой обработчик для каждого создаваемого вами http-запроса.

 response, err := client.Do(request)
        switch response.StatusCode {
        case 200:
            fmt.Println("work!")
            break
        case 404:
            fmt.Println("not found!")
            break
        default:
            fmt.Println("http", response.Status)
        }
  

Комментарии:

1. Я получаю следующую ошибку с этим решением: паника: ошибка времени выполнения: недопустимый адрес памяти или разыменование нулевого указателя. Когда я удостоверяюсь, что запрос выполнен с ошибкой, объект ответа недоступен??

2. Если установлена ошибка и ответ равен нулю, это приведет к сбою