JavaRush /Java Blog /Random-JA /春は怖くない。クッキーとヘッダー
Павел
レベル 11

春は怖くない。クッキーとヘッダー

Random-JA グループに公開済み
記事のサイクルの内容 繰り返しは学習の母です。したがって、以前の記事に基づいて、新しい Web スプリングブート プロジェクト「MobilePhonePayment Connect h2, Lombok」を作成しましょう。エンティティ レイヤーを作成します: BalancePhoneEntity Integer id; 整数電話番号; 文字列名Customer; 整数バランス。 次のメソッドを使用してサービス層を作成します。 - データベース内のすべてのレコードを検索 - ID でレコードを検索 - 電話番号でレコードを検索 - ユーザー名でレコードを検索 (レコードのシートが返される必要がありますが、名前は同じであろう)
public List<BalanceEntity> findByNameCustomer(String nameCustomer){
    return balanceRepository.findAllByNameCustomer(nameCustomer);
}
- データベースへのレコードの追加 - ID によるデータベースからのレコードの削除 - ビジネス メソッド: 電話残高の補充 - このメソッドは電話番号、金額 (整数型) を受け取り、対応する番号の残高を指定された値だけ増やす必要があります。額。
public void addingMoneyToBalance(Integer phoneNumber, Integer sum) {
    BalanceDto byPhoneNumber = findByPhoneNumber(phoneNumber);
    byPhoneNumber.setBalance(byPhoneNumber.getBalance() + sum);
    save(byPhoneNumber);//метод save() – добавление, реализован в сервисе
}
DTO からエンティティへのマッピング、およびその逆のマッピングを実装することを忘れないでください。Dto は、Entity: BalancePhoneDto 整数 IDに似ています 。整数電話番号; 文字列名Customer; 整数バランス。 DTO レイヤーを作成し、InitiateUtils クラスを作成し、データベースにデータを入力します: ID 1、numberPhone 555000、残高 100、顧客 Ivan ID 2、numberPhone 444000、残高 250、顧客 Marya ID 3、numberPhone 111000、残高 60、顧客 Ivan Create残りのコントローラーですが、急いでメソッドを埋め込まないでください。前の記事に従えば、すべてのレコードを表示する方法は次のようになっているはずです (記事へのコメント、特に Vasily Babin によるコメントを参照することをお勧めします)。
//поиск записи по id - старая version
@GetMapping(value = "/find-phone/{id}")
public ResponseEntity<BalanceDto> findPhone(@PathVariable Integer id) {
    BalanceDto balanceDto = balanceService.findById(id);
    return balanceDto != null
            ? new ResponseEntity<>(balanceDto, HttpStatus.OK)
            : new ResponseEntity<>(HttpStatus.NOT_FOUND);
}
コンストラクターを使用せずに ResponseEntity を使用する別の方法もあります。これからも利用させていただきます。ResponseEntity は、HeadersBuilder とそのサブインターフェイスである BodyBuilder という 2 つのネストされたビルダー インターフェイスを公開します。したがって、ResponseEntity の静的メソッドを通じてその機能にアクセスできます。詳細については、この記事をご覧ください。残りのコントローラー メソッドは次のように実装できます。 1) ID によるレコードの表示
//поиск записи по id
@GetMapping(value = "/find-number-phoneById/{id}")
public ResponseEntity<?> findNumberPhoneById(@PathVariable Integer id) {
    BalanceDto balanceDto = balanceService.findById(id);
    return balanceDto != null
            ? ResponseEntity.ok(balanceDto)
            : ResponseEntity.ok().body(HttpStatus.NOT_FOUND);
}
Postman でテストします (これについては前の記事で説明しました。このプログラムに関する別の小さなガイドはこちらです)。起動し、GET リクエスト タイプを選択し、URL 行に次のように書き込みます: http://localhost:8080/find-number-phoneById/1 – リクエスト行に id パラメータを渡しました。出力では、次のエントリを受け取ります。 id は 1 に等しい。新しいコードを追加した後、忘れずにプロジェクトを再起動してください😇 2) レコードを名前で表示します
//поиск записи по имени пользователя
@GetMapping(value = "/find-number-phoneByName/{name}")
public ResponseEntity<?> findNumberPhone(@PathVariable String name) {
    List<BalanceDto> balanceDto = balanceService.findByNameCustomer(name);
    return balanceDto != null &&  !balanceDto.isEmpty()
            ? ResponseEntity.ok(balanceDto)
            : ResponseEntity.ok().body(HttpStatus.NOT_FOUND);
}
新しいリクエストを作成し、GET リクエスト タイプを選択し、URL 行に次のように書き込みます。 http://localhost:8080/ find-number-phoneByName/Ivan - クエリ行に name パラメータを渡し、出力では次のようになります。 nameCustomer が Ivan に等しいレコードのリストを取得します。おそらく出力では、次のような内容が得られるでしょう: %D1%8D%D1%82%D0%BE%20%D0%BD%D0%B5%20%D0%BE%D1%88%D0%B8%D0 %B1%D0%BA%D0%B0 これはエラーではありません。これらはリクエストのエンコーディングの機能です。詳細をお読みくださいそして、ここでは、これが起こらないようにPostmanを設定する方法が書かれています。 3) すべてのレコードの出力:
//поиск всех записей
@GetMapping(value = "/findAll")
public ResponseEntity<?> findAll() {
    List<BalanceDto> balanceDto = balanceService.findAll();
    return balanceDto != null &&  !balanceDto.isEmpty()
            ? ResponseEntity.ok(balanceDto)
            : ResponseEntity.ok().body(HttpStatus.NOT_FOUND);
}
新しいリクエストを作成し、GET リクエスト タイプを選択し、URL 行に http://localhost:8080/findAll を書き込みます。ここではパラメータを渡しません。4) 新しいエントリを追加します。
//добавление новой записи
@PostMapping(value = "/entry")
public ResponseEntity<?> entryNumber(@RequestBody BalanceDto dto){
    balanceService.save(dto);
    return ResponseEntity.ok().body(HttpStatus.CREATED);
}
新しいリクエストを作成し、POST リクエスト タイプを選択して、URL 行に http://localhost:8080/entry を書き込みます。このリクエストでは、オブジェクトを JSON 形式で渡す必要があります。リクエスト ウィンドウで、[本文] タブに移動し、フラグを raw に設定し、[テキスト] の横の矢印をクリックして、[JSON] を選択します。次の JSON をウィンドウにコピーします。
{
        "numberPhone": 767676,
        "nameCustomer": "Sasha",
        "balance": 100
}
リクエストの実行をクリックすると、レスポンスのステータスは CREATED になります。次に、findAll を再度クエリして、新しいエントリが表示されることを確認します。5) ID によるエントリの削除
//удаление записи по id
@DeleteMapping(value = "/delete-phoneById/{id}")
public ResponseEntity<?> delete(@PathVariable Integer id) {
    balanceService.delete(id);
    return ResponseEntity.ok().body(HttpStatus.OK);
}
新しいリクエストを作成し、DELETE リクエスト タイプを選択し、URL 行に書き込みます: http://localhost:8080/delete-phoneById/4 – リクエスト行に id パラメータを渡し、出力で OK ステータスを取得します。 。次に、findAll への別のリクエストを実行し、Sasha が行方不明であることを確認します。6) IDによる番号の変更
//изменение номера телефона по id
@PutMapping(value = "/change")
public ResponseEntity<?> changeNumberPhone(
//можно добавлять несколько параметров в request
        @RequestParam(value = "id") Integer id, //добавor один параметр
        @RequestParam(value = "phoneNumber") Integer phoneNumber) //добавor второй параметр
 {
    BalanceDto byId = balanceService.findById(id);
    byId.setNumberPhone(phoneNumber);
    balanceService.save(byId);
    return ResponseEntity.ok().body(HttpStatus.OK);
}
新しいリクエストを作成し、PUT リクエスト タイプを選択して、URL 行に http://localhost:8080/change を書き込みます。このリクエストにはいくつかのパラメータがあり、ご覧のとおり、以前のようにクエリ行でパラメータを渡しません。@RequestParam アノテーションはメソッド内のパラメータに使用されます。Postman 経由でパラメータを転送するには、リクエスト ウィンドウの [Params] タブに移動し、[Key] 列にパラメータの名前 (id) を指定し、[Value] 列に値 (1) を指定する必要があります。2 番目のパラメーター、Key =phoneNumber、Value = 888000 についても同じことを行います。クエリ文字列に注意してください。Postman はパラメーターを正しく渡すようにクエリ文字列を変更しました。出力にはステータス OK が表示されます。次に、findAll を再度クエリして、最初のエントリの電話番号が変更されていることを確認します。7) 携帯電話の残高を補充する
@PutMapping(value = "/add")
public ResponseEntity<?> addingMoney(
        //можно добавлять несколько параемров в request
        @RequestParam(value = "phoneNumber") Integer phoneNumber,//добавor один параметр
        @RequestParam(value = "sum") Integer sum) //добавor второй параметр
{
    balanceService.addingMoneyToBalance(phoneNumber, sum);
    return ResponseEntity.ok().body(HttpStatus.OK);
}
新しいリクエストを作成し、PUT リクエスト タイプを選択して、URL 行に http://localhost:8080/add を書き込みます。PhoneNumber 値を 888000 に設定し、合計を 130 に設定します。出力には OK ステータスが表示されます。ここで、findAll リクエストを再度実行し、最初のレコードの残高が変更されていることを確認します。8) リクエストボディを介して PUT - 送信されたデータを開かないようにこれを行うことが望ましい
@PutMapping(value = "/add")
public ResponseEntity<?> addingMoney(@RequestBody BalanceDto dto){
    balanceService.addingMoneyToBalance(dto.getPhoneNumber, dto.getSum);
    return ResponseEntity.ok().body(HttpStatus.OK);
}
JSONを送信します
{
        "numberPhone": 888000,
       //  "nameCustomer" можно вообще не указывать
        "balance": 130
}
最後にクッキーに移ります。クッキーと は何ですか?簡単に言うと、Cookie はブラウザーがアプリケーションから一度受信したデータを保存し、その後そのデータをサイト上で繰り返し使用できます。Cookie の書き方と読み方という 2 つの基本的なことを知っておく必要があります。 書き方: Spring Web MVC 全体は、2 つのオブジェクトを中心に構築されたサーブレット API 上に実装されます。クライアントからのリクエストは HttpSerlvetRequest でラップされ、レスポンスはコードが埋め込まれた HttpServletResponse から生成されます。これらのオブジェクトにアクセスできると、HTTP セッション全体を完全に制御できます。Spring Web を使用すると、これらのオブジェクトに直接アクセスできます。通常はCookieですが、コントローラーにメソッドを作成しましょう
//записать куки
 @GetMapping(value = "/set-cookie")
public ResponseEntity<?> setCookie(HttpServletResponse response) throws IOException {
     Cookie cookie = new Cookie("data", "Come_to_the_dark_side");//создаем an object Cookie,
     //в конструкторе указываем значения для name и value
     cookie.setPath("/");//устанавливаем путь
     cookie.setMaxAge(86400);//здесь устанавливается время жизни куки
     response.addCookie(cookie);//добавляем Cookie в request
     response.setContentType("text/plain");//устанавливаем контекст
     return ResponseEntity.ok().body(HttpStatus.OK);//получилось How бы два раза статус ответа установor, выбирайте Howой вариант лучше
 }
Postman でアドレス http://localhost:8080/set-cookie で GET リクエストを作成しましょう。出力は OK です。ウィンドウの上に Cookie(1) という文字が表示されます。これをクリックすると、送信された Cookie が表示されます。名前: データ、値: Come_to_the_dark_side。Java の Cookie クラスの主な機能に関する情報 読み方: さらに読みやすくなりました
//прочитать куки
@GetMapping(value = "/get-cookie")
public ResponseEntity<?> readCookie(@CookieValue(value = "data") String data) {
    return ResponseEntity.ok().body(data);
}
@CookieValue には、値を読み取る Cookie の名前を指定し、読み取った値を応答に表示します。 Come_to_the_dark_side さあ、最高の時間がやって来ました。 ヘッダー(ヘッダー、PHP に関する記事は見ないでください。読むと非常に役立ちます): まず、ヘッダーを読み取る方法を見てみましょう。
//прочитать заголовки
@GetMapping(value = "/get-headers")
public ResponseEntity<?> getHeaders(@RequestHeader Map<String, String> headers){//представляет заголовки ввиде мапы,
    //где ключ это наименование заголовка, а meaning мапы - это meaning заголовка
    return ResponseEntity.ok(headers);
}
主な作業は@RequestHeader Map<String, String>によって行われ、マップの形式でヘッダーを表します。ここで、キーはヘッダーの名前、マップの値はヘッダーの値です。さらに興味深いのは、ブラウザを使用してこのメ​​ソッドをテストすることです。ブラウザを開き、検索バーに http://localhost:8080/get-headers と入力すると、ヘッダーの広範なリストが得られます。各タイトルを Google で検索して、そのタイトルが必要な理由を理解してください。Wikipediaにもタイトルのリストがあります。 「誰かが何かを読んだら、誰かがそれを書き留める」というのはプログラミングの古い格言です。 タイトルを書いてみましょう
//записать заголовок
@GetMapping(value = "/set-header")
public ResponseEntity<?> setHeader(){
    return ResponseEntity.ok().header("name-header","value-header").body(HttpStatus.OK);
}
ここでは、 ResponseEntityクラスの特別なヘッダーメソッド を使用しました。ここで、「name-header」はヘッダーの名前、「value-header」はヘッダーの値です。ヘッダーを操作するための他のオプションもあります
//еще варианты работы с заголовками
@GetMapping(value = "/set-headers")
public ResponseEntity<?> setHeaders() {
    HttpHeaders httpHeaders = new HttpHeaders();//создаем an object
    //который имплементирует мапу MultiValueMap<String, String>
    //наполняем ее парами ключ-meaning
    //можно наполнить своими заголовками через метод add
    httpHeaders.add("customer-header", "value-header1");
    //HttpHeaders так же предлагает большой выбор стандартных заголовков
    //Посмотрите на них набрав в IDEA HttpHeaders.
    httpHeaders.add(HttpHeaders.FROM, "russia");
    //можно изменить существующий заголовок, вызвав для него сет-метод
    httpHeaders.setDate(0);
    //or получить meaning конкретного заголовка
    Long date = httpHeaders.getDate();
    System.out.println(date);
    return ResponseEntity
            .ok().headers(httpHeaders)//здесь метод принимающий MultiValueMap<String, String>
            .body(HttpStatus.OK);
}
ここでは、 MultiValueMap<String, String>型の値を取るResponseEntity クラス の別のメソッドを使用します。ブラウザーでどのように動作するかを確認すると、さらに有益になります。アドレス http://localhost:8080/set-headers にアクセスすると、ステータスが OK であるという応答を受け取ります。Google Chrome をよく使用している場合は、Ctrl + Shift + Iキーの組み合わせを押して「開発者ツール」に移動し、トップ パネルで [ネットワーク]タブを探し、クリックしてエントリを探します。 set-headers (そこにない場合は、ページを更新してください) そこをクリックし、開いたウィンドウで[ヘッダー]タブを選択すると、ResponseHeadersにヘッダーが表示されます。見出しを理解するには、今のところはこれで十分です。ここで読んでください: ResponseEntity<!--?--> の研究と Spring コントローラーでの削除 これで、休暇をとらせていただきます 🤓、またお会いしましょう...
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION