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

মডেল বাইন্ডিং এবং ভ্যালিডেশন

অনুরোধ বডি কে একটি ধরনের সাথে বাইন্ড করার জন্য, মডেল বাইন্ডিং ব্যবহার করুন। বর্তমানে, আমরা JSON, JSONProtobuf, Protobuf, MsgPack, XML, YAML, এবং স্ট্যান্ডার্ড ফর্ম ভ্যালু (foo=bar&boo=baz) এর মতো বিভিন্ন ফরম্যাটে ডাটা বাইন্ডিং সাপোর্ট করি।

// নিম্নলিখিত ফাংশন সংজ্ঞানা: বিভিন্ন ফরম্যাটের অনুরোধ প্যারামিটারকে স্ট্রাক্টে বাইন্ড করার জন্য
ReadJSON(outPtr interface{}) error
ReadJSONProtobuf(ptr proto.Message, opts ...ProtoUnmarshalOptions) error
ReadProtobuf(ptr proto.Message) error
ReadMsgPack(ptr interface{}) error
ReadXML(outPtr interface{}) error
ReadYAML(outPtr interface{}) error
ReadForm(formObject interface{}) error
ReadQuery(ptr interface{}) error

ReadBody ব্যবহার করা হলে, Iris কনটেন্ট-টাইপ হেডারের উপর ভিন্ন বাইন্ডার ইনফার করবে। আপনি যদি নিশ্চিত হন যে আপনি কোন কন্টেন্ট বাইন্ড করতে চান, তবে স্পেসিফিক ReadXXX মেথডগুলি ব্যবহার করতে পারেন, এমনকি ReadJSON বা ReadProtobuf

ReadBody(ptr interface{}) error

আইরিসে সামঞ্জস্যপূর্ণ প্রাথমিক ডেটা ভ্যালিডেশন সহবাস করে। তবে, এটি আপনাকে go-playground/validator/v10 ব্যবহার করে রিকুয়াইর বডি ভ্যালিডেট করার সুযোগ দেয়। এই উদাহরণে, আমরা শিখব কীভাবে রিকুয়াইর বডি ভ্যালিডেট করতে go-playground/validator/v10 ব্যবহার করব।

দয়া করে মনে রাখবেন, বাইন্ড করার সব ফিল্ডে সম্পর্কিত বাইন্ডিং ট্যাগ সেট করতে হবে। উদাহরণস্বরূপ, JSON থেকে বাইন্ডিং করার সময় json:"fieldname" সেট করুন।

আপনি এছাড়াও নির্দিষ্ট কিছু ফিল্ডকে আবশ্যক ফিল্ড হিসাবে নির্দেশ করতে পারেন। যদি ফিল্ডের উপর binding:"required" ডেকোরেশন থাকে এবং বাইন্ডিং সময় কোনও মান প্রদান না করা হয়, তাহলে একটি ত্রুটি প্রদান করা হবে।

package main

import (
    "fmt"

    "github.com/kataras/iris/v12"
    "github.com/go-playground/validator/v10"
)

func main() {
    app := iris.New()
    app.Validator = validator.New()

    userRouter := app.Party("/user")
    {
        userRouter.Get("/validation-errors", resolveErrorsDocumentation)
        userRouter.Post("/", postUser)
    }
    app.Listen(":8080")
}

// ব্যবহারকারী ব্যক্তিগত তথ্য সংযুক্ত করে।
type ব্যবহারকারী struct {
    প্রথমনাম      string     `json:"fname" validate:"required"` // প্রথম নাম, প্রয়োজন
    শেষনাম       string     `json:"lname" validate:"required"` // শেষ নাম, প্রয়োজন
    বয়স            uint8      `json:"age" validate:"gte=0,lte=130"` // বয়স, ০ থেকে ১৩০ রেঞ্জে
    ইমেল          string     `json:"email" validate:"required,email"` // ইমেল, প্রয়োজন
    প্রিয়রঙ         string     `json:"favColor" validate:"hexcolor|rgb|rgba"` // প্রিয় রঙ, বৈধ হেক্সাডেসিমাল, আরজিবি, বা আরজিবিআর রঙ মান হতে হবে
    ঠিকানাগুলি       []*ঠিকানা `json:"addresses" validate:"required,dive,required"` // ঠিকানা তালিকা, খালি না হওয়া আবশ্যক এবং প্রতিটি ঠিকানা আইটেম প্রয়োজন
}

// ঠিকানা ব্যবহারকারীর ঠিকানা তথ্য সংযুক্ত করে।
type ঠিকানা struct {
    রাস্তা string `json:"street" validate:"required"` // রাস্তা, প্রয়োজন
    শহর   string `json:"city" validate:"required"` // শহর, প্রয়োজন
    গ্রহ   string `json:"planet" validate:"required"` // গ্রহ, প্রয়োজন
    ফোন  string `json:"phone" validate:"required"` // ফোন, প্রয়োজন
}

type যাচাইকরণত্রুটি struct {
    বর্তমানট্যাগ string `json:"tag"` // বর্তমান ট্যাগ
    নেস্টনেম     string `json:"namespace"` // নেস্টনেম
    ধরণ      string `json:"kind"` // ধরণ
    ধরন      string `json:"type"` // ধরন
    মান     string `json:"value"` // মান
    প্যারাম     string `json:"param"` // প্যারাম
```json
{
    "শিরোনাম": "যাচাই সমস্যা",
    "বিস্তারিত": "একাধিক ফিল্ড যাচাই ব্যর্থ হয়েছে",
    "ধরন": "http://localhost:8080/user/validation-errors",
    "অবস্থা": 400,
    "ক্ষেত্রসমূহ": [
        {
            "ট্যাগ": "প্রয়োজন",
            "নামকোষ্ঠ": "User.FirstName",
            "ধরন": "string",
            "ধরন": "string",
            "মান": "",
            "প্যারাম": ""
        },
        {
            "ট্যাগ": "প্রয়োজন",
            "নামকোষ্ঠ": "User.LastName",
            "ধরন": "string",
            "ধরন": "string",
            "মান": "",
            "প্যারাম": ""
        }
    ]
}

বাইন্ডিং URL কুয়েরি প্যারামিটার

ReadQuery মেথড কেবলমাত্র কুয়েরি প্যারামিটারগুলি বাইন্ড করে, অনুরোধ বডি ডেটার সাথে না। অনুরোধ বডি ডেটা বাইন্ড করতে 'ReadForm' ব্যবহার করুন।

package main

import "github.com/kataras/iris/v12"

type Person struct {
    Name    string `url:"name,required"`
    Address string `url:"address"`
}

func main() {
    app := iris.Default()
    app.Any("/", index)
    app.Listen(":8080")
}

func index(ctx iris.Context) {
    var person Person
    if err := ctx.ReadQuery(&person); err != nil {
        ctx.StopWithError(iris.StatusBadRequest, err)
        return
    }

    ctx.Application().Logger().Infof("Person: %#+v", person)
    ctx.WriteString("Success")
}

বাইন্ডিং যে কোনও ডেটা

অনুরোধ বডি "ptr" এর সাথে বাইন্ড করুন যার ভিত্তি ক্লায়েন্ট দ্বারা প্ঠোষিত ডেটার ধরণের অনুযায়ী, উদাহরণস্বরূপ JSON, XML, YAML, MessagePack, Protobuf, ফর্ম, এবং URL কুয়েরি।

package main

import (
    "time"
    "github.com/kataras/iris/v12"
)

type Person struct {
    Name       string    `form:"name" json:"name" url:"name" msgpack:"name"`
    Address    string    `form:"address" json:"address" url:"address" msgpack:"address"`
    Birthday   time.Time `form:"birthday" time_format:"2006-01-02" time_utc:"1" json:"birthday" url:"birthday" msgpack:"birthday"`
    CreateTime time.Time `form:"createTime" time_format:"unixNano" json:"create_time" url:"create_time" msgpack:"createTime"`
    UnixTime   time.Time `form:"unixTime" time_format:"unix" json:"unix_time" url:"unix_time" msgpack:"unixTime"`
}

func main() {
    app := iris.Default()
    app.Any("/", index)
    app.Listen(":8080")
}

func index(ctx iris.Context) {
    var person Person
    if err := ctx.ReadBody(&person); err != nil {
        ctx.StopWithError(iris.StatusBadRequest, err)
        return
    }

    ctx.Application().Logger().Infof("Person: %#+v", person)
    ctx.WriteString("Success")
}

আপনি নিম্নলিখিত কমান্ড দিয়ে পরীক্ষা করতে পারেন:

$ curl -X GET "localhost:8085/testing?name=kataras&address=xyz&birthday=1992-03-15&createTime=1562400033000000123&unixTime=1562400033"

বাইন্ডিং URL পাথ প্যারামিটার

package main

import "github.com/kataras/iris/v12"

type myParams struct {
    Name string   `param:"name"`
    Age  int      `param:"age"`
    Tail []string `param:"tail"`
}

func main() {
    app := iris.Default()
    app.Get("/{name}/{age:int}/{tail:path}", func(ctx iris.Context) {
        var p myParams
        if err := ctx.ReadParams(&p); err != nil {
            ctx.StopWithError(iris.StatusInternalServerError, err)
            return
        }

        ctx.Writef("myParams: %#v", p)
    })
    app.Listen(":8088")
}

অনুরোধ

$ curl -v http://localhost:8080/kataras/27/iris/web/framework

বাইন্ডিং হেডার অনুরোধ প্যারামিটার

package main

import "github.com/kataras/iris/v12"

type myHeaders struct {
    RequestID      string `header:"X-Request-Id,required"`
    Authentication string `header:"Authentication,required"`
}

func main() {
    app := iris.Default()
    r.GET("/", func(ctx iris.Context) {
        var hs myHeaders
        if err := ctx.ReadHeaders(&hs); err != nil {
            ctx.StopWithError(iris.StatusInternalServerError, err)
            return
        }

        ctx.JSON(hs)
    })
    
    app.Listen(":8080")
}

অনুরোধ

curl -H "x-request-id:373713f0-6b4b-42ea-ab9f-e2e04bc38e73" -H "authentication: Bearer my-token" \
http://localhost:8080

প্রত্যুত্তর

{
  "RequestID": "373713f0-6b4b-42ea-ab9f-e2e04bc38e73",
  "Authentication": "Bearer my-token"
}