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


7

Условие:

1. Create a module that exposes methods for performing HTTP requests by given URL and headers
- getJSON and postJSON
Both methods should work with promises.
 
   Използвал съм requireJS и библиотеката за promises RSVP. Доста е лесна за работа и отговаря на изискванията. Използва се по следния начин:
 
var promise = new RSVP.Promise(function(resolve, reject) {
  // on success
  resolve(value);

// on failure reject(reason); });
 
   Модулът, в който се съдържа HTTPRequester-а има два метода - getJSON и postJSON, които приемат URL. В себе си те създават promise, който праща ajax request към сървъра. При успешен request, се изпълняват функциите resolve и reject. Те се подават върху върнатия от RSVP promise чрез .then.
  Requester-ът е доста лесен за работа и би бил полезен за изпита. Използва се по следния начин:
 
httpRequester.getJSON("url")
                     .then(function(data) { // on success },
                              function(error) { // on failure });
  
       
HTTPRequester - ТУК
Demo - ТУК
Solution - ТУК
RSVP - ТУК



Отговори



2

Нямаш имплементирано подаване на хедъри на 1-ва задача. Модулът взима само url и обект(ако е post), никъде не можеш да задаеш custom хедъри (тъй като горния пост се явява първи за темата не мога да го коментирам, а мога само да напиша отговор)

EDIT: Пример как може да се направи с jQuery -> ЛИНК

EDIT2: Надявам се някой по-знаещ от мен да ми отговори. Според jQuery документацията, когато се използва $.ajax, заявката се извиква асинхронно и съотвено функциите success/error/complete се изпълняват, когато тя приключи успешно/fail-не. Това, което искам да попитам е дали с използването на $.ajax и success/error/complete означава, че имаме асинхроност до толкова,че няма нужда от promise-и ?

EDIT ПОСЛЕДЕН: Отговорих си сам на въпроса. Просто го тествах :) Направих една $.ajax заявка, като във функциите за success и error сложих едни фор цикли да се врътнат 10 (или беше 100) млн пъти. Под кода, който викаше get заявка сложих javascript, който да промени текст по страницата. Когато стартирах, текстът се промени веднага и след няколко секунди получих съобщението от заявката(след като се е извъртял цикълът). Т.е. ползването на $.ajax success/error/complete е доста умно и спестява още писане


от Vazzzz (1380 точки)


0
При стандартна ajax заявка се задават url, type, data (ако е post) и функции за success и error. Не мисля, че ще ни се налага да ползваме други хедъри.

от SStoyanov1 (1324 точки)

0
Просто така е написано по условието на задачата - by given URL and headers. Не че казвам, че е нужно и трябва, но така е формулирана задачата

от Vazzzz (1380 точки)


0
Какъв е срокът за това домашно - не го виждам на сайта?

от ellapt (6303 точки)


0
Не си само ти, все още няма срок

от Vazzzz (1380 точки)

0
ok :)))))))))))))))))

от ellapt (6303 точки)



3

Ето моето решение на задачата реализирано без jQuery:

HTTPRequester - http://tinyurl.com/lxhvnc2

Solution - http://tinyurl.com/lz5hlg8

Използвал съм RequireJS, Q за promise-те, сървъра от демата плюс демото от http-request.js с леки промени. Променил съм модула така, че само двата метода getJSON и postJSON да са видими. Тях пък съм ги променил да приемат като 1ви параметър URL-а, към който ще се прави заявката, обект от headerOptions, който го подаваме при извикване.


от triplexsa (60 точки)


0
Аз като ползвам сървъра от демата имам проблем с 'Same Origin Policy' - проекта пускам от VS и вероятно защото със сървъра са на различен порт нямам достъп. Ти как го преодоля това? Мерси

от yana_yankova (107 точки)

0
При мен ми даваше следната грешка: “No 'Access-Control-Allow-Origin' header is present on the requested resource” и го оправих като в httpRequestModule.js в метода/функцията postJSON направих data-та, която ще изпращаме да я stringify-не преди това: postJSON = function (url, data, headers) { var options = { url: url, type: 'POST', contentType: headers.contentType, accept: headers.accept, data: JSON.stringify(data), }; return makeRequest(options); }; След това всичко си работеше наред.

от triplexsa (60 точки)



0

Едно решение и от мен. Връшам promise при post и при get методите на модула, като всеки от тях се обръша към една обща функция getPromise, която според подадените параметри извършва съответната заявка. 




0
Така направена, getPromise() функцията, при липса на header, прави дефолтна "POST" заявка, а би трябвало дефолтната да е "GET" тъй като е най-безопасна откъме ипане по данните :)

от m.tonkov (161 точки)

0
При липса на header прави по-скоро delete, понеже тя не изисква header-и...



6

Аз съм го направил с jQuery.ajax(), като подавам за dataType: "json" и има възможност за headers. Тъй като jQuery.ajax() връща Promise, условието на задачата е изпълнено. Мога да го използвам така:

JSONrequest
    .postJSON(resourceUrl, data)
    .done(successHandler)
    .fail(errorHandler);
 

от neutrino (3376 точки)


0
Добро решение. Доста ми помогна. Не разбирам обаче какъв е смисълът от параметрите "callback" и "headers" при методи getJSON и postJSON. Пробвах да ги изтрия и всичко си работи както идеално...не се задават никъде (подава се само url-a или data...)

от Rub (0 точки)

0
Идеята е да можеш да подадеш success: callback директно като параметър, вместо със done(). Примерно така: JSONrequest .postJSON(resourceUrl, data, successHandler) .fail(errorHandler); Интерфейса може да се разшири и да приема errorHandler, но по-добрата практика е да се регистрират тези функции със chaining отделно от самия request със .done(), .fail() и .always(). Аз съм се придържал към интерфейса на jQuery.getJSON(), който не приема errorCallback.

от neutrino (3376 точки)



0

Здравейте, аз искам да попитам за малко съдействие. Не мога да разбера защо при изпращане на заявка при мен се получава така, че само id се записва като данни. В смисъл - подавам си аз като данни на метода postJSON някакъв студент с име и клас, но като погледна Network виждам, че реално се е записало само id-то на студента. Ето код: ТУК


от ksevery (439 точки)


0
data: JSON.stringify(data) пробвай това което е в postJSON да е само data: data

от TeodorTunev (3061 точки)

0
аха, с това заработи, но по някаква причина в момента не прави само един POST, ами записва всеки студент по няколко пъти... сега ще видя защо е така, благодаря за насоката
EDIT: Мисля, че го разбрах - за всяко презареждане на страницата чисто и просто са ми се записали отново същите студенти, благодаря за помощта :)

от ksevery (439 точки)


0
Здравейте, колеги. Аз пък не разбрах, че трябва с jQuery и го направих с httpRequester на vanilla js. Но и при мен както и на колегата нещо не потръгва, създава ми се студент само с id, без name и grade. Не разбирам защо. Ако някой може да погледне кода. Други забележки също са добре дошли.

http://pastebin.com/gaLgcCPN



0
Добре , защо не пробваш да го оправиш както съм писал и на колегата по горе :D makeRequest.postJSON({ url: 'http://localhost:3000/students', data: JSON.stringify(student) makeRequest.postJSON({ url: 'http://localhost:3000/students', data: student

от TeodorTunev (3061 точки)

0
Още една грешка url = params.url || url; ако нямаш в парамс url слагаш url , да ама url никъде не е дефиниран или по точно никъде не му е сложена стойност.

от TeodorTunev (3061 точки)



0

http://pastebin.com/n2HQr7Zc

Това направих аз, реших да не ползвам jQuery наготово за промиси и т.н.

Май работи правилно... :)

 


от georgiwe (720 точки)