۳۰ شهریور ۱۴۰۳

Techboy

اخبار و اطلاعات روز تکنولوژی

عملی با API های Dropwizard REST

مقدمه ای بر چارچوب ناب REST که تعدادی از کتابخانه های محبوب جاوا را به جایگزینی ساده تر برای Spring تبدیل می کند.

مقدمه ای بر چارچوب ناب REST که تعدادی از کتابخانه های محبوب جاوا را به جایگزینی ساده تر برای Spring تبدیل می کند.

Dropwizard یک چارچوب REST گرا است که چندین بسته جاوا را در یک کل منسجم گرد هم می آورد. این یک جایگزین برای Spring (و بسته WebMVC Spring) است. Dropwizard تجربه کارآمدتری را ارائه می دهد. حتی پیکربندی‌های بیشتری را بر اساس قرارداد نسبت به Spring اتخاذ می‌کند و بیشتر سطح API را که به طور خاص به ارائه APIهای REST مرتبط نیست حذف می‌کند.

یک پروژه جدید Dropwizard را شروع کنید

بیایید با داربست پروژه جدید از طریق کهن الگوی رسمی Dropwizard Maven شروع کنیم. یک مکان راحت در سیستم محلی خود پیدا کنید و از خط فرمان، دستور را در لیست ۱ وارد کنید.

فهرست ۱. کهن الگو را اجرا کنید

mvn archetype:generate -DarchetypeGroupId=io.dropwizard.archetypes -DarchetypeArtifactId=java-simple -DarchetypeVersion=2.0.0

این در حالت تعاملی اجرا خواهد شد. من از شناسه گروهی com.infoworld و شناسه مصنوع دمو استفاده کردم. من همچنین برای نام از Demo استفاده کردم.

وقتی کهن الگو به کار خود پایان داد، می‌توانید cd را وارد فهرست راهنمای خود کنید (در مورد من، cd Demo). اکنون وابستگی ها را با mvn clean package نصب می کنید.

اکنون می توان برنامه را با

اجرا کرد

java -jar target/Demo-1.0-SNAPSHOT.jar server 

(به خاطر داشته باشید که از نام برنامه ای که به آن داده اید اگر با نسخه نمایشی متفاوت است استفاده کنید.)

اگر اکنون از localhost:8080 بازدید کنید، با یک خطای پیش‌فرض با فرمت JSON “یافت نشد” مواجه خواهید شد:

{"code":404,"message":"HTTP 404 Not Found"}

نقطه پایانی را نقشه برداری کنید

تا کنون، برنامه فقط ۴۰۴s را برمی گرداند زیرا هیچ نقطه پایانی ترسیم نشده است. من می خواهم به شما درک روشنی از نحوه انجام این کار با Dropwizard بدهم. ما فرآیند را با نگاشت یک نقطه پایان رشته ساده جدا می‌کنیم.

مرحله ۱ ایجاد کلاسی است که به عنوان کنترل کننده مسیر عمل می کند. به یاد داشته باشید، درخواست Dropwizard در زندگی این است که چندین کتابخانه برتر در کلاس را در یک بسته با کاربری آسان متحد کند. برای پشتیبانی از نقاط پایانی RESTful، Dropwizard از Jersey استفاده می کند. برنامه شما قبلاً Jersey را به طور کامل تنظیم کرده است. نگاشت مسیر با نحو جرسی انجام می شود .

مرحله ۲ ثبت کلاس handler در برنامه است. بیایید این دو مرحله را به ترتیب انجام دهیم.

Docker، Maven در بسته‌ها پیشتاز هستند

یک کلاس کنترل کننده مسیر ایجاد کنید

بر اساس قرارداد، کنترل‌کننده‌های نقطه پایانی Dropwizard به پوشه /src/main/java/com/infoworld/resources (یا هر شناسه گروهی که انتخاب می‌کنید) می‌روند. ما یک کنترل کننده نقطه پایانی برای بازگرداندن لیستی از ترانه سراها اضافه می کنیم. همانطور که در فهرست ۲ می بینید، ما فقط بهترین ها را برمی گردانیم. یک فایل SongWriters.java جدید در فهرست /resources ایجاد کنید.

فهرست ۲. نقطه پایانی SongWriters

package com.infoworld.resources;

import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
import java.util.List;
import java.util.Optional;

@Path("/songwriters")
@Produces(MediaType.APPLICATION_JSON)
public class SongWriters {
    public SongWriters() {
    }

    @GET
    public String getBrands() {
        return "{'name':'Roger Waters','name':'Tom Petty'}";
    }
}

فهرست ۲ نسبتاً ساده است. به خود کلاس یک مسیر از طریق حاشیه نویسی @Path داده می شود و JSON به عنوان نوع رسانه از طریق حاشیه نویسی @Produces مشخص می شود. سپس، روش getBrands() که یک رشته را برمی گرداند، از طریق حاشیه نویسی @GET به روش GET HTTP نگاشت می شود. این روش فقط یک رشته رمزگذاری شده را برمی گرداند که مجموعه ای از ترانه سراها را نشان می دهد.

مدیر کننده را ثبت کنید

اکنون کنترل کننده را ثبت کنید. فایل /src/main/java/com/infoworld/DemoApplication.java را باز کنید و روش run() را به شکل لیست ۳ تغییر دهید.

فهرست ۳. ثبت کنترل کننده SongWriters

import com.infoworld.resources.SongWriters;
// ...
public void run(final DemoConfiguration configuration, final Environment environment) {
        SongWriters songWriters = new SongWriters();
        environment.jersey().register(songWriters);
    }

باز هم، نسبتاً ساده است. لیست ۳ کلاسی را که ایجاد کرده اید وارد می کند، سپس از شی محیط برای دسترسی به Jersey و ثبت کنترل کننده استفاده می کند. توجه داشته باشید که روش run یک شی DemoConfiguration را نیز دریافت می کند که به صورت لحظه ای آن را در عمل مشاهده خواهید کرد.

کنترل کننده را آزمایش کنید

اکنون اگر از localhost:8080/Songwriters بازدید کنید، JSON را دریافت خواهید کرد که سخت کدنویسی کرده اید. توجه داشته باشید که سیستم به‌طور یکپارچه با بازگرداندن رشته به‌عنوان JSON کار کرده است.

دامنه را مدل کنید

اکنون می خواهید از یک رشته کدگذاری شده به سمت استفاده از اشیاء دامنه واقعی حرکت کنید. با ایجاد یک فایل /src/main/java/com/infoworld/domain/SongWriter.java شروع کنید و محتوای فهرست ۴ را به آن بدهید.

فهرست ۴. کلاس مدل دامنه SongWriter

package com.infoworld.domain;

import java.util.ArrayList;
import java.util.List;

public class SongWriter {
    private final String name;
    private List songs = new ArrayList<>();

    public SongWriter(final String name, final List songs) {
        this.name = name;
        this.songs = songs;
    }

    public String getName() {
      return name;
    }

    public List getSongs(){
      return this.songs;
    }
}

یک کلاس مخزن اضافه کنید

اکنون یک کلاس مخزن برای نمایش لایه دسترسی به داده اضافه می کنیم. یک پوشه و فایل جدید ایجاد کنید: /src/main/java/com/infoworld/repo/SongWriterRepo.java.

4 مدل برای افزایش مجوزهای دسترسی در مواقع اضطراری

فهرست ۵. کلاس SongWriterRepo

package com.infoworld.repo;

import com.infoworld.domain.SongWriter;
import java.util.List;
import java.util.ArrayList;
import java.util.Optional;
import java.util.stream.Collectors;

public class SongWriterRepo {
  private final List songWriters;
  public SongWriterRepo(){
    this.songWriters = new ArrayList();     
  }

  public SongWriterRepo(List songWriters){
    this.songWriters = songWriters;
  }

  public List findAll(){
    return songWriters;
  }

  public Optional getByName(final String name){
    return songWriters.stream().filter(sw -> sw.getName().equals(name)).findFirst();
  }
}

همانطور که در لیست ۵ مشاهده می کنید، SongWriterRepo مسئول برگرداندن تمام اشیاء SongWriter در یک List از طریق روش findAll() است، در حالی که getByName روش () ترانه سرای تعیین شده توسط نام رشته را می گیرد.

از لایه دامنه استفاده کنید

اکنون از لایه جدید برای درایو JSON برگردانده شده توسط نقطه پایانی منبع استفاده خواهیم کرد. com.infoworld.resource.SongWriters را طوری تغییر دهید که شبیه لیست ۶ باشد.

فهرست ۶. کلاس SongWriters اصلاح شده

package com.infoworld.resources;

import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
import java.util.List;
import java.util.Optional;

import com.infoworld.repo.SongWriterRepo;
import com.infoworld.domain.SongWriter;

@Path("/songwriters")
@Produces(MediaType.APPLICATION_JSON)
public class SongWriters {
   private final SongWriterRepo repo;
    public SongWriters(SongWriterRepo repo) {
      this.repo = repo;
    }

    @GET
    public List getBrands() {
        return repo.findAll();
    }
}

فهرست ۶ رشته سخت کد شده را به نفع ارجاع به کلاس SongWriterRepo که در سازنده تنظیم شده است حذف کرده است. اکنون به لیست ۷ نگاهی بیندازید، جایی که این کلاس ها در کلاس DemoApplication به هم متصل شده اند.

فهرست ۷. سیم کشی کلاس دامنه در DemoApplication

package com.infoworld;

import io.dropwizard.Application;
import io.dropwizard.setup.Bootstrap;
import io.dropwizard.setup.Environment;

import com.infoworld.resources.SongWriters;
import com.infoworld.repo.SongWriterRepo;

public class DemoApplication extends Application {
// ...
    @Override
    public void run(final DemoConfiguration configuration, final Environment environment) {
        SongWriterRepo swRepo = new SongWriterRepo();
        SongWriters songWriters = new SongWriters(swRepo);
        environment.jersey().register(songWriters);
    }
}

به کلاس DemoApplication برگردید و آن را همانطور که در لیست ۷ نشان داده شده است تغییر دهید. توجه داشته باشید که اکنون شی SongWriterRepo را نمونه سازی کرده و SongWriters شی منبع قبل از تحویل آن به Jersey.

اکنون اگر پروژه را بازسازی کنید و از localhost:8080/songwriters بازدید کنید، یک آرایه خالی پیدا خواهید کرد. بیایید همانطور که در فهرست ۸ نشان داده شده است، یک ترانه سرا با کد سخت اضافه کنیم.

فهرست ۸. افزودن یک ترانه سرا

public void run(final DW2Configuration configuration,
                    final Environment environment) {

        List preload = new ArrayList();
        preload.add(new SongWriter("Mark Knopfler", new ArrayList()));

        SongWriterRepo swRepo = new SongWriterRepo(preload);
        SongWriters songWriters = new SongWriters(swRepo);
        environment.jersey().register(songWriters);
    }

اکنون وقتی به نقطه پایانی رسیدید، نتیجه خواهید گرفت.

از فایل پیکربندی

استفاده کنید

یک فایل پیکربندی جدید در src/main/resources/Demo-Config.yml اضافه کنید و محتوای لیست ۹ را در آن قرار دهید.

فهرست ۹. پیکربندی YAML

---
songWriters:
  - John Lennon
  - Jeff Lynne

اکنون فایل com.infoworld.DemoConfiguration.java را به شکل لیست ۱۰ تغییر دهید. این فایل برای مدل سازی فایل پیکربندی از طریق جکسون استفاده می شود.

فهرست ۱۰. پیکربندی جاوا

package com.infoworld;

import io.dropwizard.Configuration;
import com.fasterxml.jackson.annotation.JsonProperty;
import org.hibernate.validator.constraints.*;
import javax.validation.constraints.*;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;

import java.util.List;
import java.util.ArrayList;

public class DW2Configuration extends Configuration {
  private List<String> songWriters;
  @JsonCreator
  public DW2Configuration(@JsonProperty("songWriters") List<String> songWriters){
          this.songWriters = songWriters;
  }
  public List<String> getSongWriters(){
          return this.songWriters;
  }
}

اکنون از فایل در DemoApplication استفاده کنید، همانطور که در فهرست ۱۱ نشان داده شده است.

فهرست ۱۱. استفاده از فایل پیکربندی برای از پیش بارگذاری آهنگسازان در DemoApplication.java

    @Override
    public void run(final DemoConfiguration configuration,
                    final Environment environment) {

        List preload = new ArrayList();

        configuration.getSongWriters().forEach(sw -> preload.add(new SongWriter(sw, new ArrayList())));
        SongWriterRepo swRepo = new SongWriterRepo(preload);
        SongWriters songWriters = new SongWriters(swRepo);
        environment.jersey().register(songWriters);
    }

نکته اصلی تغییر در لیست ۱۱ این است که فایل پیکربندی در کلاس DemoConfiguration هیدراته می شود و متد getSongWriters() را پر می کند که برای بارگذاری از قبل استفاده می شود. کلاس مخزن.

برنامه را با فایل پیکربندی اجرا کنید

برای اجرای این برنامه با فایل پیکربندی یک تغییر کوچک لازم است. در فهرست ۱۲ توجه کنید که فایل پس از تماس با سرور ارجاع داده می شود.

فهرست ۱۲. اجرای برنامه با فایل پیکربندی

java -jar target/DW2-1.0-SNAPSHOT.jar server src/main/resources/DW2-config.yml

اکنون وقتی از برنامه در localhost:8080/songwriters بازدید می‌کنید، آهنگ‌سرایان از پیش بارگذاری‌شده را خواهید دید.

Dropwizard یک جایگزین ناب برای APIهای RESTful مبتنی بر Spring است. همانطور که در اینجا مشاهده کردید، روی ارائه یک پشته ساده اما کافی برای رسیدگی به این خواسته ها تمرکز دارد.

منابع برنامه آزمایشی اینجا موجود است.

شاید به این مطالب علاقمند باشید