[JS Applications] Домашно Consuming Web Services - Задача 3


3

Условие:

3. Using the REST API at 'localhost:3000/students' create a web application for managing students.
­The REST API provides methods as follows:
­POST creates a new student
­GET returns all students
­DELETE deletes a student by Id
­You may extend the demo for jQuery.ajax().
 
   Срещнах няколко проблема, опитвайки се да реша задачата.
   Първият е, че така конфигуриран, сървърът не приема DELETE request-и. Връща следната грешка: Method Delete is not allowed by Access-Control-Allow-Methods, независимо какъв DELETE request му е пратен. Аз намерих 2 решения - или да променя Access-Control-Allow-Headers настройките, или да трия студенти чрез POST заявка. Чрез втория просто се сменя в app.js на сървъра app.post('/students/:id', students.remove). 
   Вторият е, че в метода addNewStudent в students.js на сървъра, той търси .body.name на параметъра req, който приема, докато в removeStudent метода търси .params.id. След като го промених и там на .body.id, започна да се държи коректно и да трие студенти при всяка заявка.
  Третият е, че така конфигуриран сървърът си помни последното зададено id и при изтрит студент не връщаше с 1 този показател. Така студент, който вече не съществува, си пазеше id-то и новият добавен не беше с коректно id. Затова в метода removeStudent връщам до момента дадените id-та с едно и добавям променлива, която да задава новите id-та на студентите всеки път, когато е изтрит такъв.
 
  Дано някой е успял да го подкара и в сегашния вариант, но аз лично ще кача в архива с домашната си и променените настройки на сървъра.
 
Source code - ТУК и ТУК
Сървър с промените - ТУК
Изглед - ТУК



Отговори



4

Здравей колега,

API-то на сървъра работи коректно.

  • GET localhost:3000/students -> връща всички студенти
  • POST localhost:3000/students -> добавя нов студент
  • DELETE locahost:3000/{ID} -> изтрива студент по даденото ID.

и трите работят коректно и няма нужда се променя нищо.

ID-тата на студентите не е хубаво да се променят. Един път студент получи ли дадено ID, то трябва да си остане същото, докато студентът съществува. Промяната на ID е некоректно.

Поздрави,

Дончо Минков

 


от DonchoMinkov (12706 точки)


0
Здравей. На мен сървърът продължава да ми връща същата грешка: XMLHttpRequest cannot load http://localhost:3000/1. Method DELETE is not allowed by Access-Control-Allow-Methods. Как мога да направя коректно ajax request-a?

от SStoyanov1 (1324 точки)

0
На мен също не ми дава да изтрия студент без да направя промени в сървъра. Според мен няма друг начин, ако някой знае как да сподели.




5

Дончо е прав, че работи правилно.

Заявката, която трябва да му пратиш е следната и тя трябва да е без хедърс:

var delete = function (url, success, error) {

        $.ajax({
            url: url,
            type: 'POST',
            success: success,
            error: error,
            timeout: 5000,
            data: {_method: 'delete'}
        });
};

delete('http://localhost:3000/students/' + id+'/', success, error);

 


от lithical (992 точки)


0
Това ми прилича по-скоро workaround, отколкото очаквано поведение.

от dani_ddd (346 точки)

0
Това не работи. Ще покажeш ли код в който правиш заявката по този начин?




0

Здравейте,

това е моето решение.  Имам само един проблем, require функцията на requirejs ми е в html-а понеже като я поставя в app.js (и съответно сложа data-main="app" при зареждането на requirejs) не я намира. Явно имам пропуски с това API и ще се радвам, ако някой сподели защо не ми намира функцията, като я преместя в app.js.

Благодаря предварително!

Поздрави!




0
Функцията в app.js не тръгва. Сложи на края (); или ()); или .call()...сега не се изпълнява.

от d.kostov88 (1086 точки)

0
Е не... сериозно ли това ми е проблема... :D Мерси много...




1

Здравейте, колеги

Изгубих доста време по този проблем и наистина не мога да разбера къде бъркам. При заявка през Postman изтриването на студент се извършва коректно. Като url задавам http://localhost:3000/students/{id на студент} и като обект задавам обект с key: id и value: id на съответен студент, но когато го правя през JS в node ми дава, че заявката връща статус 200, но в конзолата ми изписва вече известната грешка:

XMLHttpRequest cannot load http://localhost:3000/students/{id на студент}. Method DELETE is not allowed by Access-Control-Allow-Methods.

Кодът ми е следния:

deleteStudent = function (data) {
        return $.ajax({
            url: resourceUrl + '/' + data.id,
            type: 'DELETE',
            data: JSON.stringify(data),
            contentType: 'application/json',
            success: function (data) {
                $successMessage.html('Student with id ' + data.id + ' successfully deleted')
                               .show()
                               .fadeOut(2000);
            },
            error: function (err) {
                $errorMessage.html('Error happened: ' + err)
                             .show()
                             .fadeOut(2000);
            }
        });
    };
 
Като data подавам обекта {id: {id на студент}}. От няколко часа търся къде може да е проблемът, без да променям server-а, както Дончо е писал, но не мога да разбера какво толкова бъркам. Някой да е успял да реши този проблем?

 




0
Type не трябва ли да ти е POST? На първо четене това виждам аз...


0
Ами дори и на type да сложа POST, вместо DELETE, пак ми дава грешка. Даже смених и data на обект { _method: 'delete' }, както си го направил при твоето решение и на някои места по интернет го има така, но отново ми дава грешка.




3

Аз го направих както е написал колегата pavelh. Ако имате пуснат сървъра, може да го тествате, използвал съм Handlebars за визуализация:

demo

source


от neutrino (3376 точки)