otarza / serv-cst

CST web III porject
6 stars 0 forks source link

HttpReqest და HttpRequestWrapper კლასები #14

Closed ioseb closed 11 years ago

ioseb commented 11 years ago

HttpRequestWrapper კლასის იმპლემენტაცია შემდეგ ინტერფეისზე დაყრდნობით:

package edu.cst.webserver.http;

import java.util.Map;

public interface HttpRequest {
    /**
     * Returns HTTP request method name POST, GET etc...
     */
    public String getRequestMethod();

    /**
     * Returns request URI in a full form,
     * /path/to/resource?param=value
     */
    public String getRequestURI();

    /**
     * Returns HTTP version string: HTTP/1.1
     */
    public String getHttpVersion();

    /**
     * Returns key/value pairs of parsed HTTP request header fields
     */
    public Map<String, String> getAllHeaders();

    /**
     * Returns value of a HTTP header field
     * @param headerName
     */
    public String getHeader(String headerName);

    /**
     * Returns request content type specified as a value of
     * Content-Type: header field. e.g. application/x-form-www-urlencoded
     */
    public String getContentType();

    /**
     * Returns key/value pairs of query string or submitted form
     */
    public Map<String, String> getParams();

    /**
     * Returns path portion of request URI. If request URI was
     * /path/to/resource?param1=value1&param2=value2
     * method returns /path/to/resource
     */
    public String getPath();
}
ioseb commented 11 years ago

@vaxop ამ დავალებით მინდა გააგრძელო, კიდევ თუ აპირებ მუშაობას დღეს შეგვიძლია განვიხილოთ.

vaxop commented 11 years ago

ki vapireb dges ravi gvianobamde chavujdebi .... exla shevxedav ra aris am davalebis shinaarsi da tu kitxva damebada shegekitxebi @ioseb .

ioseb commented 11 years ago

@vaxop შესანიშნავია! მოკლედ პატარა დეტალებს მოგაწვდი:

ზოგადი დანიშნულება მდგომარეობს იმაში რომ როდესაც სერვერი დაასრულებს მოთხოვნის დამუშავებას ანუ:

უნდა მოხდეს ამ ინფორმაციის განთავსება HttpRequest ტიპის ობიექტში ერთხელ რომელიც მოგვიანებით გადაეცემა აპლიკაციის დანარჩენ ნაწილს.

ioseb commented 11 years ago

მოდიფიცირებული HttpRequest ინტერფეისი:

package edu.cst.webserver.http;

import java.util.Map;

public interface HttpRequest {
    /**
     * Returns HTTP request method name POST, GET etc...
     */
    public HttpMethod.Type getRequestMethod();

    /**
     * Returns parsed HTTP Request Line object
     */
    public HttpRequestLine getHttpRequestLine();

    /**
     * Returns request URI in a full form,
     * /path/to/resource?param=value
     * MUST use requestLine object
     */
    public String getRequestURI();

    /**
     * Returns HTTP version string: HTTP/1.1
     * MUST use requestLine object
     */
    public String getHttpVersion();

    /**
     * Returns key/value pairs of parsed HTTP request header fields
     */
    public Map<String, String> getAllHeaders();

    /**
     * Returns value of a HTTP header field
     * @param headerName
     */
    public String getHeader(String headerName);

    /**
     * Returns request content type specified as a value of
     * Content-Type: header field. e.g. application/x-form-www-urlencoded
     */
    public String getContentType();

    /**
     * Returns key/value pairs of query string or submitted form
     * MUST use requestLine
     * retrieve query string from requestLine object
     * perform lazy parsing of query string
     */
    public Map<String, String> getParams();

    /**
     * Returns path portion of request URI. If request URI was
     * /path/to/resource?param1=value1&param2=value2
     * method returns /path/to/resource
     * MUST use requestLine object
     */
    public String getPath();
}
ioseb commented 11 years ago

@vaxop მგონი რაღაცა იკითხე Map - ის შესახებ?

vaxop commented 11 years ago

@ioseb gavarkvie cota odeni ram

ioseb commented 11 years ago

@vaxop ყოველი შემთხვევისთვის გადაიკითხე: http://docs.oracle.com/javase/7/docs/api/java/util/Map.html აუცილებელია რომ კარგად გესმოდეს.

vaxop commented 11 years ago

@ioseb ki cavikitxav

ioseb commented 11 years ago

შედეგის მაგვარს როდის ველოდოთ?

On Tuesday, March 5, 2013 at 10:38 PM, Vaxtang Pataraia wrote:

@ioseb (https://github.com/ioseb) ki cavikitxav

— Reply to this email directly or view it on GitHub (https://github.com/reflooding/serv-cst/issues/14#issuecomment-14457028).

vaxop commented 11 years ago

ravici cota gaurkvevlobashi var da amat kodebs vkitxulob exla da verkvevi ragaceebshi

ioseb commented 11 years ago

მოიწერე რამე თუ არ გესმის დაგაკვალიანებ :-)

On Tuesday, March 5, 2013 at 10:42 PM, Vaxtang Pataraia wrote:

ravici cota gaurkvevlobashi var da amat kodebs vkitxulob exla da verkvevi ragaceebshi

— Reply to this email directly or view it on GitHub (https://github.com/reflooding/serv-cst/issues/14#issuecomment-14457265).

vaxop commented 11 years ago

kargit

ioseb commented 11 years ago

@vaxop ეჭვი მაქვს რომ გაურკვევლობაში ხარ, არ გინდა მოგეხმარო(თ)? შეკითხვები არ გაქვს?

vaxop commented 11 years ago

@ioseb zalian merideba magram ver davzari garda imisa rom gavakete HttpRequest interface da HttpRequestWrapper klasshi implements gavukete da chakara kodebi exla var udides sttresshi ver mivxvdi sad raunda chavcero:((

ioseb commented 11 years ago

@vaxop

  1. შეეცადე ქართული შრიფტით წერო;
  2. მოსარიდებელი არაფერია, მე რისთვის ვარ?
  3. მოდი გავამარტივებ საკითხს და მაგალითებით მივიდეთ შედეგამდე, იმუშავებ 1/2 საათი ახლა ჩემთან ერთად?
vaxop commented 11 years ago

@ioseb არ ვიცი HttpRequest -შიც უნდა ჩავწერო რამე თუ არა და ასევე HttpRequestWrapper კლასში რა კოდით შევავსო:( ან როგორ დავიწყო რას გადავხედო და ა.შ. სამწუხაროდ იმასაც ვერ ვფიქრობ კითხვა როგორ და რაზე დამესვა:(

vaxop commented 11 years ago

კი ვიმუშავებ თქვენ თუ არ შეგაწუხებთ

ioseb commented 11 years ago

@vaxop ვხვდები რაშიც არის პრობლემა. მოკლედ ასე დავიწყოთ და მომყევი ნაბიჯ-ნაბიჯ, თუ რამეს ვერ გაიგებ შეკითხვა შემომიბრუნე:

  1. ინტერფეისში გარდა მეთოდის აღწერისა არაფერს არ ვწერთ(სახელი, პარამეტრები და მორჩა. არავითარი ფიგურული ფრჩხილები მეთოდის აღწერის მერე);
  2. ინტერფეისით განვსაზღვრავთ მხოლოდ იმას თუ რისი გაკეთება უნდა შეეძლოს ობიექტს;
  3. ინტერფეისით არ განვსაღვრავთ თუ როგორ გააკეთებს ამას ობიექტი;
  4. დაინტერესებული მხარისთვის(მაგალითად კოდის ნებისმიერი ნაწილი), ობიექტის გამოსაყენებლად აუცილებელი და საკმარისია მხოლოდ ინტერფეისი ცოდნა(აქ იგულისმება იმ მეთოდების ცოდნა რომლებიც აღწერილია ინტერფეისში)

დამიმოწმე თუ ეს დეტალები გესმის.

P.S. არა, არ შემაწუხებ :-)

vaxop commented 11 years ago

მეთოდის აღწერა ამას გულისხმობს მაგალითად? : public HttpMethod.Type getRequestMethod();

ioseb commented 11 years ago

@vaxop ზუსტად. მეტს არაფერს არ გულისხმობს. და რამდენადაც მეთოდი(ან ფუნქცია) თავსისი არსითა და დანიშნულებით აღწერს გარკვეულ ქმედებას. მაგ. getRequestMethod() შეგვიძლია ვთარგმნოთ ქართულად როგორც მომეცი მოთხოვნის მეთოდი, არის ცალსახა ქმედება იმიტომ რომ ობიექტს გააჩნია HTTP მოთხოვნის მეთოდის დაბრუნების უნარი.

ამას თუ ჩაეძიები აღმოაჩენ, რომ ჩვენ განვსაზღვრეთ ის თუ რისი(!) გაკეთება შეუძლია ობიექტს. მაგრამ ამითი არ განვსაზღვრავთ იმას თუ როგორ იმუშავებს ეს მეთოდი. მაგალითად მე თუ ვიქნები მაგ ობიექტის მომხმარებელი და მჭირდება HTTP მეთოდი, უბრალოდ საკმარისია ვიცოდე:

  1. არის თუ არა ეგეთი მეთოდი;
  2. რა ტიპის მონაცემს(ან რა ფორმატში) დამიბრუნებს ეს მეთოდი;
  3. უნდა გადავცე თუ არა პარამეტრები.

ხვდები?

ioseb commented 11 years ago

@vaxop ძალიან ბევრი რომ არ "ვიბუქსავოთ" მოდი ახლა უცბად გააკეთე ასეთი რამ:

გააკეთე ინტერფეისი და მისი რეალიზაცია(რაიმე ახალ სუფთა პროექტში):

public interface HttpRequest {
    public int getStatusCode();
}

public class HttpRequestWrapper implements HttpRequest {
    @Override
    public int getStatusCode() {
        return 200;
    }
}

და ამის მერე დაწერე ასეთი სატესტო კლასი:

class Test {
    public static void acceptRequest(HttpRequest request) {
        int statusCode = request.getStatusCode();
        System.out.println(statusCode);
    }   

    public static void main(String[] args) {
        HttpRequest request = new HttpRequestWrapper();
        acceptRequest(request);
    }
}

ამას როგორც კი გააკეთებ მოიწერე მაშინათვე შევეცადოთ გავაანალიზოთ. ყურადღება მიაქციე ამ მეთოდს acceptRequest(HttpRequest request) ამ მეთოდმა უბრალოდ იცის რომ ვინც მას გამოიძახებს უნდა გადასცეს HttpRequest ტიპის ობიექტი რადგან მან იცის მისი ქმედებების შესახებ და არის დაინტერესებული მხარე. თუმცა მეორეს მხრივ წარმოდგენა არ გააჩნია კონკრეტულად რომელი რეალიზაცია გადაეცემა.

vaxop commented 11 years ago

ტესტ კლასს რა დავარქვა? HttpRequestWrapperTest?

ioseb commented 11 years ago

@vaxop თუნდაც AnzorErkomaishvili მაგრამ ეგ სახელი რაც დადე კარგია :-)

ioseb commented 11 years ago

@vaxop პაკეტების მითითება არ დაგავიწყდეს, გააკეთე რამე პაკეთი და იმ პაკეტში შექმენი კლასები(ანუ მარჯვენა ღილაკით კლიკი პაკეთის სახელზე -> new class)

vaxop commented 11 years ago

:))) კი ვაკთებ ეგრე

vaxop commented 11 years ago

გავაკეთე ყველაფერი რაც მითხარი

ioseb commented 11 years ago

წერილი მომივიდა არ მაკეთებინებს მაგ სახელით კლასსო და აქ არ ჩანს ეგ მესიჯი, გამოდის თუ არა? ბოლო ბოლო სხვა სახელი დაარქვი ვერ ვხვდები რატომ არ გაქმნევინებს და რას გეუბნებ ზოგადად?

ioseb commented 11 years ago

@vaxop თუ გააკეთე ყველაფერი მაშინ გაუშვი ეგ შენი სატესტო კლასი(მარჯვენა ღილაკი Run...) და შეხედე შედეგს. და შეეცადე გაანალიზო რა ხდება.

vaxop commented 11 years ago

კი დავარქვი რაღაც გაჭედილი ქონდა ინტელიჯეას... გავუშვი და დამიბრუნა 200 ნუ კველაფერი კარგად გაკეთდა

ioseb commented 11 years ago

@vaxop რაც მთავარია იმას თუ ხვდები რა ხდება და რატომ მუშაობს ეგ კოდი?

vaxop commented 11 years ago

კიი მივხვდი ყველაფერს რაც მანდ ხდება

ioseb commented 11 years ago

შესანიშნავი, ახლა ცოტა დავამძიმოთ ამოცანა და ვთქვათ ასეთი რამ:

ახლა ჩვენი ამოცანაა ეგ 200 გადავაგდოთ და მაგის ნაცვლად ვასწავლოთ რომ მაგ სტატუსის კოდის მნიშვნელობა ვიღაცამ მისცეს გარედან და დააბრუნოს რაიმე ცვლადის მნიშვნელობა ნაცვლად მაგ სტატიკურად გაწერილი 200 - ისა.

მოდიფიცირებული ვერსია:

public interface HttpRequest {
    public int getStatusCode();
}

public class HttpRequestWrapper implements HttpRequest {
    private int statusCode;

    @Override
    public int getStatusCode() {
        return this.statusCode;
    }

    public void setStatusCode(int statusCode) {
        this.statusCode = statusCode;
    }
}

მოდიფიცირებული სატესტო კლასი:

class HttpRequestWrapperTest {
    public static void acceptRequest(HttpRequest request) {
        int statusCode = request.getStatusCode();
        System.out.println(statusCode);
    }   

    public static void main(String[] args) {
        HttpRequestWrapper request = new HttpRequestWrapper();

        request.setStatusCode(404);
        acceptRequest(request);

        request.setStatusCode(300);
        acceptRequest(request);

        request.setStatusCode(200);
        acceptRequest(request);
    }
}

შეეცადე გააკეთო ეს ყველაფერი და მითხრა თუ ხვდები რა ხდება?

ioseb commented 11 years ago

ამ ყველაფერს რომ მორჩები შეეცადე acceptRequest მეთოდში შეიტანო ასეთი ცვლილება:

public static void acceptRequest(HttpRequest request) {
        int statusCode = request.getStatusCode();
        System.out.println(statusCode);
        request.setStatusCode(700);
        System.out.println(statusCode);
}

და გააცნობიერო რას იწვევს ეს ცვლილება და რატომ ხდება ის რაც ხდება და როგორც ხდება.

ioseb commented 11 years ago

@vaxop რა ხდება აბა?

ioseb commented 11 years ago

@vaxop არ მითხრა ახლა ბრძოლის ველზე დავეციო :S

vaxop commented 11 years ago

არა არ დავცემულვარ ვარჩევ 10 წუთი დამაკავგვინა შეყვარებულთან ბრძოლამ ბოდიში დიდი პერესტრელკა იყო... გავაკეთე ესე და ეხლა ვუყურებ რას იზამს და მოგწერ რა გავიგე

ioseb commented 11 years ago

@vaxop ჰო წმინდა საქმით ყოფილხარ დაკავებული :D :D :D კაი მე ჯერ ვმუშაობ და მოიწერე როგორც კი შეძლებ...

vaxop commented 11 years ago

ესეიგი გვაქვს ერთი პირვატული ცვლადი statusCode , კონსტრუქტორი აბრუნებს ამ ცვლადს და გვაქვს მეთოდი რომელიც ამ ცვლადს ინახავს ლოკალურად.

vaxop commented 11 years ago

ტესტ კლასსში გვაქვს ესეთი მეთოდი acceptRequest რომელსაც გადაეცემა HttpRequest ტიპის request ცვლადი და იმ statusCode-ს ანიჭებს request ის getStatusCode() მეთოდს და ბეჭდავს ამ statusCode--ს

ioseb commented 11 years ago

@vaxop კონსტრუქტორი არ აბრუნებს არაფერს. მარტივი მიდგომაა:

მაგ კლასში გვაქვს ორი მეთოდი:

აქედან დასკვნა ასეთია:

vaxop commented 11 years ago

აააა გასაგებია... ეხლა

public static void acceptRequest(HttpRequest request) {
        int statusCode = request.getStatusCode();
        System.out.println(statusCode);
        request.setStatusCode(700);
        System.out.println(statusCode);
}

ამ ცვლილებას შევიტან და ამ შეკითხვაზე მოგწერ პასუხს:

და გააცნობიერო რას იწვევს ეს ცვლილება და რატომ ხდება ის რაც ხდება და როგორც ხდება.

ioseb commented 11 years ago

სატესტო კლასში ვაკეთებთ შემდეგს:

vaxop commented 11 years ago

ერთი კითხვა (არ მცემოთ:)) )

ვქმნით HttpRequestWrapper ობიექტს და ვაკონფიგურირებთ მას(setStatusCode(xxx)). <<<< ეს დაკონფიგურება რას ნიშნავს

ioseb commented 11 years ago

ვქმნით HttpRequestWrapper ობიექტს და ვაკონფიგურირებთ მას(setStatusCode(xxx)). <<<< ეს დაკონფიგურება რას ნიშნავს

  • დაკონფიგურირება ნიშნავს რომ მას გადავცემთ საწყის მნიშვნელობებს.
  • ზოგადად ობიექტი განისაზღვრება მისი მდგომარეობით.
  • მდგომარეობა პროგრამირებაში აღიწერება ცვლადებითა და ამ ცვლადების მნიშვნელობებით.
  • პრივატულ ცვლადებს ვიყენებთ ზუსტად მაგ მიზნით - მათში ვინახავთ მნიშვნელობებებს რომლებიც განსაზღვრავენ ობიექტის მდგომარეობას.

უფრო მოკლედ: დაკონფიგურირება = ობიექტის ცვლადებისთვის მნიშვნელობების მინიჭება

vaxop commented 11 years ago

მადლობა

ioseb commented 11 years ago

@vaxop იმ ცვლილებებს რომ განახორციელებ რაც მოიწერე მერე შემატყობინე, იმედია "პერესტრელკას" გადაურჩები :P

vaxop commented 11 years ago

შევიტანე ცვლილება და გამიწითლა setStatusCode(700) იმიტომ რომ HttpRequest ინტერფეისში არ მაქვს აღწერილი ხო?

ioseb commented 11 years ago

@vaxop you nailed it!

ეგ არის მთავარი მორალი. ანუ სადღაც სხვაგან სხვა საშუალებით ვახდენთ რეალურად request ობიექტის ფორმირებას თავისი მდგომარეობითურთ, ხოლო დაინტერესებულ მხარეებს ვაწვდით მხოლოდ იმას რაც HttpRequest ინტერფეისში გვაქვს აღწერილი(დაშვებული). მნიშვნელოვანია რომ ეს კარგად გააცნობიერო.

ახლა ამ დეტალებიდან გამომდინარე, რას ფიქრობ შეძლებ რომ შენი საწყისი დავალების იმპლემენტაციას(რეალიზაციას) მიხედო?

ioseb commented 11 years ago

@vaxop ჰე ან კი მითხარი ან არა, ეძინება სენსეის :sleepy:

vaxop commented 11 years ago

ki xval dilidan davcxeb ragaceebs da shegaxedebt xolme dro da dro kargit?