Я делаю веб-приложение с угловым интерфейсом и golang и mongo для базы данных. У меня есть база данных и работает, и все запросы маршрута были проверены и работают на Почтальон. Однако, когда я пытаюсь сделать запрос DELETE или запрос PUT на службу углового приложения, я получаю следующую ошибку:
"Доступ к XMLHttpRequest по '-my api url-' from origin 'http://localhost:4200' было заблокировано политикой CORS: Ответ на запрос предварительной проверки не проходит проверку контроля доступа: в запрошенном ресурсе отсутствует заголовок «Access-Control-Allow-Origin». "
Iможет делать запросы GET и POST, но не DELETE или PUT.
Как мне обойти это? Это проблема внешнего интерфейса или бэкэнда? Любая помощь будет оценена. Спасибо.
PS: я использую mongoHandlers.
Вот мой сервис на внешнем интерфейсе:
deleteShow(showId: string) {
let headers = new HttpHeaders();
headers.append("Content-Type", "application/json");
return this.http
.delete<Show>(`${environment.apiBase}/shows/${showId}`, {
headers
})
.pipe(catchError(this.handleError));
}
Код бэкенда:
Маршрут:
func RouteShows(r *mux.Router, shows handlers.ShowHandler) {
sub := r.PathPrefix("/api/shows").Subrouter()
sub.HandleFunc("", getShows(shows)).Methods(http.MethodGet)
sub.HandleFunc("/{id}", getShowById(shows)).Methods(http.MethodGet)
sub.HandleFunc("/{id}", updateShow(shows)).Methods(http.MethodPut)
sub.HandleFunc("", createShow(shows)).Methods(http.MethodPost)
sub.HandleFunc("/{id}", deleteShow(shows)).Methods(http.MethodDelete)
sub.HandleFunc("/status/{status}", getShowsByStatus(shows)).Methods(http.MethodGet)
}
API-функция:
func deleteShow(s handlers.ShowHandler) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
params := mux.Vars(r)
var show models.Show
if _, ok := params["id"]; !ok {
responses.BadRequestWrapped(w, errors.New("param not found: id"))
return
}
err := s.DeleteShow(params["id"])
if err != nil {
responses.InternalServerErrorWrapped(w, errors.FromError(err)) //TODO
return
}
responses.OK(w, show)
}
}
Интерфейс MongoHandler:
//ShowHandler handles the interface of mongo func
type ShowHandler interface {
SearchShows(values map[string][]string, pagination *models.Pagination) ([]*models.Show, error)
GetShows() ([]*models.Show, error)
GetShowById(id string) (*models.Show, error)
//GetAppointmentsCreatedByUser(username string) ([]*models.Appointment, error)
GetShowsByStatus(status string) ([]*models.Show, error)
CreateShow(show *models.Show) error
UpdateShow(show *models.Show) error
DeleteShow(id string) error
}
Обработчик Mongo:
//deleteShow removes a show based on Show ID from DB
func (s *shows) DeleteShow(id string) error {
if _, err := s.mongo.DeleteOne(db_qcq, collection_shows, ValueEquals("_id", id)); err != nil {
return err
}
return nil
}
Надеюсь, этого достаточно, чтобы дать перспективу.