ডেটটাইম প্যারামিটার কীভাবে পাস করবেন?


91

কীভাবে ইউটিসি তারিখগুলি ওয়েব এপিআইতে পাস করবেন?

পাসিং ঠিকঠাক 2010-01-01কাজ করে তবে আমি যখন কোনও ইউটিসি তারিখ পাস করি 2014-12-31T22:00:00.000Z( যেমন একটি সময়ের উপাদান সহ) তখন আমি একটি এইচটিটিপি 404 প্রতিক্রিয়া পাই। তাই

http://domain/api/controller/action/2012-12-31T22:00:00.000Z

একটি 404 ত্রুটি প্রতিক্রিয়া দেয়, যখন

http://domain/api/controller/action/2012-12-31

ঠিকভাবে কাজ করে.

তারপরে কীভাবে ইউটিসি তারিখগুলি ওয়েব এপিআইতে পাস করবেন - বা কমপক্ষে তারিখ এবং সময় নির্দিষ্ট করবেন ?


4
":" তারিখে সন্দেহজনক? এড়িয়ে যাওয়ার চেষ্টা করুন। http://domain/api/controller/action/2012-12-31T22%3A00%3A00.000Z
শাহকল্পেশ

4
পালানো কোনও উপকারে আসে না। এখনও
404.

আপনি কি ডিবাগিং সক্ষম করতে পারেন তা বোঝার জন্য যে পাসিং স্ট্রিং থেকে তারিখ পর্যন্ত অনুবাদ ব্যর্থ হয়েছে? ইউআরএল ব্যবহার করে আপনি যে তারিখটি পাস করেছেন তা অনুবাদ করতে কোন পদ্ধতিটি ব্যবহার করা হচ্ছে তা ধারণাটি হ'ল DateTime- আমি ধারণা করি এটি আপনার পদ্ধতির পরামিতরের ডেটা ধরণের।
শাহকল্পেশ

4
আমি এটা করবো. পদ্ধতিটি .NET তারিখটাইম প্যারামিটার আশা করে। আমি মনে করি এটি হাস্যকর যে আমি সময় উপাদানটি পার করতে পারি না এবং কীভাবে এটি করা যায় সে সম্পর্কে ডকগুলি খুঁজে পাই না!
নিকোলোডিওন

4
আপনার কাজ শেষ হয়ে গেলে আপনার সমাধান পোস্ট করুন। এটি একই রকম সমস্যাযুক্ত অন্যান্য ব্যক্তিকে সহায়তা করতে পারে। ধন্যবাদ
শাহকল্পেশ

উত্তর:


34

সমস্যা দ্বিগুণ:

1. .পথে

ডিফল্টরূপে, আইআইএস সমস্ত ইউআরআই'র সাথে ডট যুক্ত স্ট্যাটিক সংস্থান হিসাবে বিবেচনা করে, এটি ফেরত দেওয়ার চেষ্টা করে এবং পুরো প্রক্রিয়াটি (ওয়েব এপিআই দ্বারা) পুরোপুরি এড়িয়ে যায়। এটি বিভাগে আপনার ওয়েবকনফাইগে কনফিগার করা হয়েছে system.webServer.handlers: ডিফল্ট হ্যান্ডলার হ্যান্ডলগুলি path="*."। আপনি এই pathঅ্যাট্রিবিউটে অদ্ভুত বাক্য গঠন সম্পর্কে খুব বেশি ডকুমেন্টেশন পাবেন না (রেজেক্স আরও বোধগম্য হতে পারে), তবে এর স্পষ্টতই যা বোঝায় তা হ'ল এমন কিছু যা "কোনও বিন্দু ধারণ করে না" (এবং নীচের পয়েন্ট 2 এর কোনও অক্ষর)। সুতরাং নামে 'এক্সটেনশনহীন' ExtensionlessUrlHandler-Integrated-4.0

একাধিক সমাধান সম্ভব, 'সঠিকতা' ক্রমে আমার মতে:

  • রুটগুলির জন্য বিশেষত একটি নতুন হ্যান্ডলার যুক্ত করুন যা অবশ্যই কোনও বিন্দুর অনুমতি দেয়। এটি ডিফল্টর আগে অবশ্যই যুক্ত করুন । এটি করার জন্য, নিশ্চিত করুন যে আপনি করতে অপসারণ ডিফল্ট হ্যান্ডেলার প্রথম, এবং এটি পুনরায় জুড়তে পুলিশের পর।
  • path="*."বৈশিষ্ট্যটি এতে পরিবর্তন করুন path="*"। এটি তখন সব কিছু ধরবে। নোট করুন যে তখন থেকে আপনার ওয়েব এপিআই আর বিন্দু দিয়ে আগত কলগুলিকে স্থিতিশীল সংস্থান হিসাবে ব্যাখ্যা করবে না! আপনি যদি নিজের ওয়েব এপিআই তে স্থিতিশীল সংস্থান হোস্ট করছেন তবে এটির পরামর্শ দেওয়া হয়নি!
  • নিঃশর্তভাবে সমস্ত অনুরোধগুলি পরিচালনা করতে আপনার ওয়েবকনফিগটিতে নিম্নলিখিতগুলি যুক্ত করুন: এর অধীন <system.webserver>:<modules runAllManagedModulesForAllRequests="true">

২. :পথে

পূর্বনির্ধারিতভাবে উপরেরটি পরিবর্তন করার পরে আপনি নিম্নলিখিত ত্রুটিটি পেয়ে যাবেন:

একটি সম্ভাব্য বিপজ্জনক অনুরোধ.পথের মানটি ক্লায়েন্ট (:) এর কাছ থেকে পাওয়া গেছে।

আপনি আপনার ওয়েবকনফাইগে পূর্বনির্ধারিত অনুমোদিত / অবৈধ অক্ষরগুলি পরিবর্তন করতে পারেন। অধীনে <system.web>নিম্নলিখিত যোগ করুন: <httpRuntime requestPathInvalidCharacters="&lt;,&gt;,%,&amp;,*,\,?" />। আমি :অবৈধ অক্ষরের মানক তালিকা থেকে সরিয়েছি ।

আরও সহজ / নিরাপদ সমাধান

যদিও আপনার প্রশ্নের উত্তর না হলেও, একটি নিরাপদ এবং সহজ সমাধান হ'ল অনুরোধটি পরিবর্তন করা যাতে এই সমস্ত কিছুর প্রয়োজন হয় না। এটা দুইভাবে সম্পাদন করা যেতে পারে:

  1. একটি কোয়েরি স্ট্রিং প্যারামিটার হিসাবে তারিখটি পাস করুন ?date=2012-12-31T22:00:00.000Z
  2. .000প্রতিটি অনুরোধ থেকে স্ট্রিপ । আপনাকে এখনও :(সিএফআর পয়েন্ট 2) এর অনুমতি দেওয়া দরকার ।

আপনার "ইজিজার সলিউশন" মূলত এটি আমার জন্য করেছিল কারণ আমার সেকেন্ডের প্রয়োজন নেই।
নেভিল

আপনি একটি জীবন রক্ষাকারী :)
ময়েজ

4
আপনার "সহজ সমাধান" তে এর অনুমতি দেওয়ার পরিবর্তে :, আমি মনে করি আপনি কেবল এটির %3Aজায়গায় ব্যবহার করতে পারেন :এবং এটি ঠিক হওয়া উচিত।
মায়ার স্পিজিটর

22

আপনার প্রোডাক্ট ওয়েব এপিআই কন্ট্রোলারে:

[RoutePrefix("api/product")]
public class ProductController : ApiController
{
    private readonly IProductRepository _repository;
    public ProductController(IProductRepository repository)
    {
        this._repository = repository;
    }

    [HttpGet, Route("orders")]
    public async Task<IHttpActionResult> GetProductPeriodOrders(string productCode, DateTime dateStart, DateTime dateEnd)
    {
        try
        {
            IList<Order> orders = await _repository.GetPeriodOrdersAsync(productCode, dateStart.ToUniversalTime(), dateEnd.ToUniversalTime());
            return Ok(orders);
        }
        catch(Exception ex)
        {
            return NotFound();
        }
    }
}

ফিডলারের মধ্যে getProductPeriodOrders পদ্ধতি পরীক্ষা করুন - সুরকার:

http://localhost:46017/api/product/orders?productCode=100&dateStart=2016-12-01T00:00:00&dateEnd=2016-12-31T23:59:59

ডেটটাইম ফর্ম্যাট:

yyyy-MM-ddTHH:mm:ss

জাভাস্ক্রিপ্ট পাস প্যারামিটার moment.js ব্যবহার করুন

const dateStart = moment(startDate).format('YYYY-MM-DDTHH:mm:ss');
const dateEnd = moment(endDate).format('YYYY-MM-DDTHH:mm:ss');

18

আমি আপনার ব্যথা অনুভব করি ... আরও একটি তারিখের সময়ের ফর্ম্যাট ... ঠিক আপনার যা প্রয়োজন!

ওয়েব এপিআই 2 ব্যবহার করে আপনি প্যারামিটারগুলি নির্দিষ্ট করতে রুট বৈশিষ্ট্যগুলি ব্যবহার করতে পারেন।

সুতরাং আপনার শ্রেণীর বৈশিষ্ট্য এবং আপনার পদ্ধতির সাথে আপনি এই ইউটিসি ফর্ম্যাটটি ব্যবহার করে একটি আরআরএল ইউআরএল কোড আপ করতে পারেন যা আপনার সাথে সমস্যা হচ্ছে (স্পষ্টতই এর আইএসও 8601, সম্ভবত স্টার্টডেট.টোআইএসএসটিং ()) ব্যবহার করে এসে পৌঁছেছে

[Route(@"daterange/{startDate:regex(^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3}Z$)}/{endDate:regex(^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3}Z$)}")]
    [HttpGet]
    public IEnumerable<MyRecordType> GetByDateRange(DateTime startDate, DateTime endDate)

.... তবে যদিও এটি এক তারিখের সাথে (স্টার্টডেট) কাজ করে, কোনও কারণে এটি শেষ হয় না যখন শেষ তারিখটি এই ফর্ম্যাটে থাকে ... কয়েক ঘন্টা ডিবাগ করা হয়, কেবল ক্লু ব্যতিক্রম বলে যে এটি কোলনের মতো করে না ":" (এমনকি যদিও ওয়েবকনফিগটি এতে সেট করা রয়েছে:

<system.web>
    <compilation debug="true" targetFramework="4.5.1" />
    <httpRuntime targetFramework="4.5.1" requestPathInvalidCharacters="" />
</system.web>

সুতরাং, আসুন অন্য তারিখের ফর্ম্যাটটি তৈরি করুন (আইএসও তারিখের ফর্ম্যাটের জন্য পলিফিল থেকে নেওয়া) এবং এটি জাভাস্ক্রিপ্টের তারিখে যুক্ত করুন (ব্রেভিটির জন্য, কেবল কয়েক মিনিটের মধ্যে রূপান্তর করুন):

if (!Date.prototype.toUTCDateTimeDigits) {
    (function () {

        function pad(number) {
            if (number < 10) {
                return '0' + number;
            }
            return number;
        }

        Date.prototype.toUTCDateTimeDigits = function () {
            return this.getUTCFullYear() +
              pad(this.getUTCMonth() + 1) +
              pad(this.getUTCDate()) +
              'T' +
              pad(this.getUTCHours()) +
              pad(this.getUTCMinutes()) +
              'Z';
        };

    }());
}

তারপরে আপনি যখন ওয়েব এপিআই 2 পদ্ধতিতে তারিখগুলি প্রেরণ করেন, আপনি সেগুলি স্ট্রিং থেকে তারিখে রূপান্তর করতে পারেন:

[RoutePrefix("api/myrecordtype")]
public class MyRecordTypeController : ApiController
{


    [Route(@"daterange/{startDateString}/{endDateString}")]
    [HttpGet]
    public IEnumerable<MyRecordType> GetByDateRange([FromUri]string startDateString, [FromUri]string endDateString)
    {
        var startDate = BuildDateTimeFromYAFormat(startDateString);
        var endDate = BuildDateTimeFromYAFormat(endDateString);
    ...
    }

    /// <summary>
    /// Convert a UTC Date String of format yyyyMMddThhmmZ into a Local Date
    /// </summary>
    /// <param name="dateString"></param>
    /// <returns></returns>
    private DateTime BuildDateTimeFromYAFormat(string dateString)
    {
        Regex r = new Regex(@"^\d{4}\d{2}\d{2}T\d{2}\d{2}Z$");
        if (!r.IsMatch(dateString))
        {
            throw new FormatException(
                string.Format("{0} is not the correct format. Should be yyyyMMddThhmmZ", dateString)); 
        }

        DateTime dt = DateTime.ParseExact(dateString, "yyyyMMddThhmmZ", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal);

        return dt;
    }

ইউআরএল হবে

http://domain/api/myrecordtype/daterange/20140302T0003Z/20140302T1603Z

হ্যানসেলম্যান এখানে কিছু সম্পর্কিত তথ্য দেয়:

http://www.hanselman.com/blog/OnNightmareThatIsJSONDatesPlusJSONNETAndASPNETWebAPI.aspx


ওয়েবএপিআই পদ্ধতিতে আপনার ডালটাইম প্যারামিটারগুলি নালযোগ্য ডেটটাইম (ডেটটাইম? স্টার্টডেট্রিং, ডেটটাইম? শেষ তারিখের তারিখ) হিসাবে থাকতে পারে
ডটনেট ফ্যান

আইওএসএসটিরিং-এর উল্লেখের জন্য ধন্যবাদ - যা আমাকে বাঁচিয়েছে। আমার আরএসএফুল ডাব্লুসিএফ পরিষেবাটি ইউআরআই-তে দুটি তারিখের সাথে সূক্ষ্মভাবে কাজ করে, সুতরাং আপনার জটিল তারিখের রূপান্তরগুলির দরকার নেই। ওয়েব এপিআই এর সাথে এটি একটি কোলকুলি কনফিগার সেটিং সত্ত্বেও কলোনগুলি পছন্দ করছে না ... যদিও অদ্ভুত।
নেভিল

@ সিমন, endDateঅনুরোধটি উরলে একটি পিছনে ফেলার্ড স্ল্যাশ অন্তর্ভুক্ত করা হলে কাজ করবে। দুর্ভাগ্যক্রমে আমি এই তথ্যটি কোথায় পেলাম তা স্মরণ করতে পারি না এবং আমি এগুলির কোনও উপায় সম্পর্কেও জানি না।
পোভেন

২৪ ঘন্টা ঘড়ি ব্যবহারকারী যারা এটি ব্যবহার করতে চান তাদের ডেট ফর্ম্যাটে এইচএইচ পরিবর্তন করতে হবে to
স্নেটস

4
এটা সঠিক উত্তর. স্ট্যাকওভারফ্লো, উত্তর উত্তর বাতিল করুন!
মিলাগাউউই

9

স্ক এর উত্তরের অনুরূপ বিকল্প হিসাবে, আমি ক্যোরি Date.prototype.toISOString()স্ট্রিংয়ের দ্বারা ফর্ম্যাট করা একটি তারিখটি পাস করতে সক্ষম হয়েছি । এটি স্ট্যান্ডার্ড আইএসও 8601 ফর্ম্যাট এবং এটি রুট বা ক্রিয়াকলাপের কোনও অতিরিক্ত কনফিগারেশন ছাড়াই। নেট ওয়েব এপিআই নিয়ন্ত্রণকারীরা স্বীকার করেছেন accepted

যেমন

var dateString = dateObject.toISOString(); // "2019-07-01T04:00:00.000Z"

4
তাই কি? আপনি কোন উদাহরণ প্রদান করতে পারেন যেখানে এটি কাজ করে? আমি একই কাজ করেছি এবং এটি কাজ করে না।
এনাটল

@ এনাটল আপনি কী ফলাফল পাবেন? প্রদত্ত কোডটি dateObjectএকটি শুরুর Dateদিকের শর্ত সহ একটি কার্যকরী উদাহরণ ।
বন্ডলিন

এটি সম্ভবত কিছুটা ভোট দেওয়া উচিত। এটি ইউটিসিকে আইএসওতে পরিবর্তন করে আমার সমস্যার সমাধান করেছে। Simples
Regianni

4
@ রিজিয়ান্নি এতে আনন্দিত:
বন্ডোলিন

এটি আমার জন্য কাজ করেন ব্যবহার stackoverflow.com/a/115034/1302730 ISO ফর্ম্যাটে তারিখ পেতে
BugLover

7

এটি একটি সমাধান এবং সম্ভাব্য সমাধানগুলির জন্য একটি মডেল। তারিখগুলি ফর্ম্যাট করতে, ইউনিক্স সময়ে রূপান্তর করতে আপনার ক্লায়েন্টে মোমেন্ট.জে ব্যবহার করুন।

 $scope.startDate.unix()

দীর্ঘ হওয়ার জন্য আপনার রুটের পরামিতিগুলি সেটআপ করুন।

[Route("{startDate:long?}")]
public async Task<object[]> Get(long? startDate)
{
    DateTime? sDate = new DateTime();

        if (startDate != null)
        {
            sDate = new DateTime().FromUnixTime(startDate.Value); 
        }
        else
        {
            sDate = null;
        }
         ... your code here!
  }

ইউনিক্স সময়ের জন্য একটি এক্সটেনশন পদ্ধতি তৈরি করুন। ইউনিক্স ডেটটাইম পদ্ধতি


4

এটি একটি বেদনাদায়ক কাজ হিসাবে ব্যবহৃত হত, তবে এখন আমরা টুএসটিস্ট্রিং () ব্যবহার করতে পারি:

উদাহরণ:

[HttpPost]
public ActionResult Query(DateTime Start, DateTime End)

নীচে Ajax পোস্ট অনুরোধ মধ্যে রাখুন

data: {
    Start: new Date().toUTCString(),
    End: new Date().toUTCString()
},

3

প্রকৃতপক্ষে, প্যারামিটারগুলিকে স্পষ্টভাবে নির্দিষ্ট করে? ডেট = 'ফুলডেটটাইম' মনোযোগের মতো কাজ করেছিল। সুতরাং এটি আপাতত একটি সমাধান হবে: কমা ব্যবহার করবেন না, তবে পুরানো জিইটি পদ্ধতির ব্যবহার করুন।


0

যেহেতু আমি আইএসও -8859-1 অপারেটিং সিস্টেমকে এনকোড করেছি, তারিখ ফর্ম্যাট "dd.MM.yyyy এইচএইচ: মিমি: এসএসএস" স্বীকৃত ছিল না যা কাজটি ইনভায়ারান্টকালচার স্ট্রিংটি ব্যবহার করার জন্য ছিল।

string url = "GetData?DagsPr=" + DagsProfs.ToString(CultureInfo.InvariantCulture)

0

আপনার কোডটি দেখে, আমি ধরে নিয়েছি যে ডেটটাইম অবজেক্টের 'সময়' সম্পর্কে আপনার কোনও উদ্বেগ নেই। যদি তা হয় তবে আপনি সংখ্যার পরামিতি হিসাবে তারিখ, মাস এবং বছরটি পাস করতে পারেন। দয়া করে নীচের কোডটি দেখুন। এটি আমার বর্তমান প্রকল্পের একটি কাজের উদাহরণ।

সুবিধাটি হ'ল; এই পদ্ধতিটি আমাকে ডেটটাইম ফর্ম্যাট সংক্রান্ত সমস্যা এবং সংস্কৃতির অসঙ্গতিগুলি এড়াতে সহায়তা করে।

    /// <summary>
    /// Get Arrivals Report Seven Day Forecast
    /// </summary>
    /// <param name="day"></param>
    /// <param name="month"></param>
    /// <param name="year"></param>
    /// <returns></returns>
    [HttpGet("arrivalreportsevendayforecast/{day:int}/{month:int}/{year:int}")]
    public async Task<ActionResult<List<ArrivalsReportSevenDayForecastModel>>> GetArrivalsReportSevenDayForecast(int day, int month, int year)
    {
        DateTime selectedDate = new DateTime(year, month, day);
        IList<ArrivalsReportSevenDayForecastModel> arrivingStudents = await _applicationService.Value.GetArrivalsReportSevenDayForecast(selectedDate);
        return Ok(arrivingStudents);
    }

আপনি যদি ফ্রন্ট-এন্ডটিও দেখতে আগ্রহী হন তবে নীচের কোডটি নিখরচায় পড়তে পারেন। দুর্ভাগ্যক্রমে, এটি কৌণিক লেখা হয়। এইভাবে আমি সাধারণত কৌণিক জিইটি অনুরোধে কোয়েরি প্যারামিটার হিসাবে একটি ডেটটাইম পাস করি।

public getArrivalsReportSevenDayForecast(selectedDate1 : Date): Observable<ArrivalsReportSevenDayForecastModel[]> {
const params = new HttpParams();
const day = selectedDate1.getDate();
const month = selectedDate1.getMonth() + 1
const year = selectedDate1.getFullYear();

const data = this.svcHttp.get<ArrivalsReportSevenDayForecastModel[]>(this.routePrefix +
  `/arrivalreportsevendayforecast/${day}/${month}/${year}`, { params: params }).pipe(
  map<ArrivalsReportSevenDayForecastModel[], ArrivalsReportSevenDayForecastModel[]>(arrivingList => {
    // do mapping here if needed       
    return arrivingList;
  }),
  catchError((err) => this.svcError.handleError(err)));

return data;
}

0

একটি সম্ভাব্য সমাধান হ'ল টিক্স ব্যবহার করা:

পাবলিক লম্বা টিক্স {পেতে; }

তারপরে নিয়ন্ত্রকের পদ্ধতিতে:

পাবলিক ডেটটাইম (দীর্ঘ টিক্স);

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