Завершение или прерывание HTTP-запроса

Как можно прервать обслуживание моего API с сообщением об ошибке?

Ссылка для вызова моей службы:

http://creative.test.spoti.io/api/getVastPlayer?add=
    {"Json":Json}&host=api0.spoti.io&domain=domain&userAgent=userAgent&mobile=true

Чтобы вызвать мою службу, клиенту необходимо отправить Json и некоторые параметры.

Я хочу проверить правильность получаемых мной параметров, если нет, я хочу отправить сообщение об ошибке.

Ответ должен быть кодом Json {"Result":"Result","Error":"error message"}

Я пробовал log.fatal и os.Exit(1) они останавливают службу, а не только запрос вызова. panic прерывает вызов, но не позволяет мне отправить http.ResponseWriter, что является моим сообщением об ошибке.

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

return работает:

mobile :=query.Get("mobile")
if mobile=="mobile" {
            str:=`{"Resultt":"","Error":"No valide Var"}`
            fmt.Fprint(w, str)      
            fmt.Println("No successfull Operation!!")
            return}  

Но я могу использовать его только в основной функции, потому что в других функциях он выходит только из функции, а не из функции вызывающего абонента (запроса).


person abdel    schedule 08.07.2015    source источник


Ответы (1)


Прекращение обслуживания HTTP-запроса - это не что иное, как возврат из метода ServeHTTP(), например:

http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
    // examine incoming params
    if !ok {
        str := `{"Result":"","Error":"No valide Var"}`
        fmt.Fprint(w, str)
        return
    }

    // Do normal API serving
})

panic(http.ListenAndServe(":8080", nil))

Примечания:

Если входные параметры вашей службы API недействительны, вам следует рассмотреть возможность возврата кода ошибки HTTP вместо предполагаемого значения по умолчанию 200 OK. Для этого вы можете использовать функцию http.Error(), например:

http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
    // examine incoming params
    if !ok {
        http.Error(w, `Invalid input params!`, http.StatusBadRequest) 
        return
    }

    // Do normal API serving
})

Для более сложного примера, когда вы отправляете обратно данные JSON вместе с кодом ошибки:

http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
    // examine incoming params
    if !ok {
        w.Header().Set("Content-Type", "application/json")
        w.WriteHeader(http.StatusBadRequest)
        str := `{"Result":"","Error":"No valide Var"}`
        fmt.Fprint(w, str)
        return
    }

    // Do normal API serving
})

Пример, показывающий, как распространять "возвращение"

Если ошибка обнаружена за пределами ServeHTTP(), например в функции, вызываемой из ServeHTTP(), вы должны вернуть это состояние ошибки, чтобы ServeHTTP() мог вернуться.

Предположим, у вас есть следующий настраиваемый тип для требуемых параметров и функция, которая отвечает за их декодирование из запроса:

type params struct {
    // fields for your params 
}

func decodeParams(r *http.Request) (*params, error) {
    p := new(params)
    // decode params, if they are invalid, return an error:

    if !ok {
        return nil, errors.New("Invalid params")
    }

    // If everything goes well:
    return p, nil
}

Используя эти:

http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
    p, err := decodeParams(r)
    if err != nil {
        http.Error(w, `Invalid input params!`, http.StatusBadRequest)
        return
    }

    // Do normal API serving
})

Также см. Этот связанный вопрос: Golang, как вернуться в func FROM еще одна функция?

person icza    schedule 08.07.2015
comment
да, я сказал, что для основной функции все в порядке, но для других функций это не работает, потому что return выходит только из функции, а не из HTTP-запроса. - person abdel; 08.07.2015
comment
@Aziz Затем вы должны вернуть это состояние ошибки в ServeHTTP(), чтобы оно могло вернуться. См. Отредактированный ответ, в котором показан пример этого. - person icza; 08.07.2015