জ্যাকস-আরএস @ পাথপারামে আমার কি তারিখের প্রকারটি ব্যবহার করা উচিত?


9

আমি জার্সি ব্যবহার করে একটি JEE গ্লাসফিশ সার্ভারে এটি করার কথা ভাবছি।

@GET
@Path("/{name}/{date}")
public String getMessages(@PathParam("name") String name, @PathParam("date") Date date)

আমি এই RESTful Webservice গ্রাসকারী লোকদের বলতে সক্ষম হবার ধারণাটি পছন্দ করি যে "এখানে তারিখটি জাভাতে তারিখ শ্রেণীর সাথে কাজ করে এমন কিছু হয়"। এটি দৃষ্টিকোণ থেকে খুব সহজ যে তারা কেবল তারিখের স্পষ্ট দেখতে পাবে, এবং ইতিমধ্যে তাদের একটি কার্যকরী মডেল থাকবে যা তারা পরীক্ষা করতে পারে।

আমি যে সমস্যাটি নিয়ে উদ্বিগ্ন তা হ'ল আমি যখন এটি করি তখন জ্যাক্স-আরএস খুব সুন্দর হয় না যখন তারিখ () কনস্ট্রাক্টরের কাছে যা পায় তা পছন্দ করে না। যেহেতু তারিখ () কোনও ত্রুটি ছুড়ে দেয় যদি এটি দেওয়া কিটিকে পার্স করতে না পারে (যেমন আপনি যদি এটি একটি আসল তারিখের পরিবর্তে "আজ" স্ট্রিংটি পাস করেন), জেইই সার্ভার একটি 404 ত্রুটি প্রদান করে।

এটি কি একটি ভাল অনুশীলন? এটি করার কী আরও ভাল উপায় আছে যা আমি ভাবি না?

উত্তর:


8

খারাপ ধারণা মত শোনাচ্ছে। একটি জিনিসের জন্য, আপনি যে তারিখটির উপর নির্ভর করছেন তার তারিখ জাভা ১.১ থেকে তারিখফর্ম্যাট.পার্সডেট () এর পক্ষে নিখুঁতভাবে করা হয়েছে, কারণ এটি স্পষ্টভাবে অস্পষ্ট নয় যে তারিখগুলিতে স্ট্রিংগুলি কীভাবে ভাগ করা উচিত, কারণ বিভিন্ন অঞ্চলের নিয়মগুলি আলাদা are

আমার সুপারিশটি হ'ল নির্দিষ্ট বিন্যাসের সাথে লেগে থাকবে, বিশেষত আন্তর্জাতিকভাবে বুঝে যাওয়া yyyy-MM-dd, এবং আপনার পরিষেবার অভ্যন্তরে একটি স্ট্রিং থেকে তারিখটি পার্স করার জন্য একটি ডেটফর্ম্যাট ব্যবহার করা হবে, যা ওয়েব পরিষেবাটি কীভাবে গ্রাস করতে হবে তা পরিষ্কার করে দেয় এবং আপনাকে অনুমতি দেয় ত্রুটি বার্তাগুলি ফিরিয়ে দেওয়ার জন্য যে মানক কনভেনশনটি আপনার ওয়েব পরিষেবার জন্য যা কিছু হয় তা অনুসরণ করা।


11

আমি একটি কাস্টম ক্লাস ব্যবহার করছি DateParam:

@GET
@Path("/{name}/{date}")
public String getMessages(@PathParam("name") String name, @PathParam("date") DateParam date)
  Date date = date.getDate();

শ্রেণি হিসাবে সংজ্ঞায়িত করা হয়:

public class DateParam {
  private final Date date;

  public DateParam(String dateStr) throws WebApplicationException {
    if (isEmpty(dateStr)) {
      this.date = null;
      return;
    }
    final DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
    try {
      this.date = dateFormat.parse(dateStr);
    } catch (ParseException e) {
      throw new WebApplicationException(Response.status(Status.BAD_REQUEST)
        .entity("Couldn't parse date string: " + e.getMessage())
        .build());
    }
  }

  public Date getDate() {
    return date;
  }
}

যদি প্যারামিটারটি খালি থাকে তবে আপনি একটি নাল তারিখ পাবেন। DateParamঅপরিজ্ঞাত তারিখের মানগুলির জন্য আপনি সর্বজনীন স্ট্যাটিক চূড়ান্ত ক্ষেত্র দ্বারা প্রসারিত করতে পারেন । এটি অপরিজ্ঞাত তারিখের প্যারামগুলি পরিষ্কার করার জন্য পরীক্ষা করবে।

এখানে একটি অপূর্ণতা হ'ল প্রতিটি তারিখপরামের জন্য, সিম্পলডেট ফরমেটের একটি নতুন উদাহরণ তৈরি করা হয়। তবে সিম্পলডেটফর্ম্যাট যেহেতু থ্রেড-নিরাপদ নয়, তাই আমরা সহজেই এটি পুনরায় ব্যবহার করতে পারি না।


3
1+। জাভা 8 একটি থ্রেড নিরাপদ পরিচয় করিয়েছে DateTimeFormatter। জাভা <= 7 এর জন্য, আমি একটি ব্যবহার করবThreadLocal
অ্যান্টনি অ্যাকসিওলি

3

কে আপনার পরিষেবা ব্যবহার করবে? তারা কি Dateক্লাসের স্পেসিফিকেশন সন্ধান করতে বিরক্ত করবে এবং কী ধরণের স্ট্রিংকে পার্স করবে তা নির্ধারণ করবে? জাভা প্রোগ্রামার হওয়া সত্ত্বেও আমি কোথায় দেখতে হবে তা জানতে পারতাম না ;-)

আমি মনে করি আপনার ইউআরআই দেখতে কেমন হবে তা আপনার ব্যবহারকারীদের প্রথমে জানিয়ে দেওয়া উচিত, যেমন

.../your-resource-name/yyyy-MM-dd

এবং তারপরে আপনার পছন্দ অনুযায়ী যে কোনও তারিখের ফর্ম্যাটটি পার্সিংয়ে জার্সি আপনাকে সহায়তা করার একটি উপায় অনুসন্ধান করুন। এর অর্থ Dateপ্যারামিটারের ধরণ ব্যবহার করা এবং সম্ভবত আপনার @Pathটীকাতে যেমন নিয়মিত অভিব্যক্তি নির্দিষ্ট করা যায়

@Path(/{name}/{date: [0-9][0-9][0-9][0-9]-[0-1][0-9]-[0-3][0-9]/)

বা আপনার ফর্ম্যাটে একটি তারিখ পার্স করতে সক্ষম অন্য কোনও শ্রেণি ব্যবহার করে। ইউআরআইগুলি কীভাবে পরিচালনা করবেন যেগুলি আপনি আপনার ব্যবহারকারীদের যে নির্দিষ্ট প্রস্তাবটি দিয়েছিলেন তার সাথে মেলে না এবং এটি উপরের যে কোনও একটি থেকে কীভাবে স্বতন্ত্রভাবে পরিচালনা করবেন তা সিদ্ধান্ত নেওয়া উচিত (কোনও ডিফল্ট সংস্থান ফেরত দেবেন? একটি 404 ত্রুটি ফেরান?)।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.