Обработка ошибок с http.NewRequest в Go - PullRequest
3 голосов
/ 17 марта 2019

Я использовал http.NewRequest, чтобы сделать запрос GET.

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

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

    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 := &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>

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

Ответы [ 2 ]

4 голосов
/ 17 марта 2019

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 && response.StatusCode < 300
if !statusOK {
    fmt.Println("Non-OK HTTP status:", response.StatusCode)
    // You may read / inspect response body
    return
}
1 голос
/ 17 марта 2019

вы должны использовать код состояния, вы также можете написать небольшой обработчик для каждого 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)
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...