প্রকল্প সম্পর্কে

# Go REST ক্লায়েন্ট লাইব্রেরি এই প্রজেক্টটি একটি Go লাইব্রেরি এবং কমান্ড-লাইন টুল সরবরাহ করে যা `.http` ফাইলে সংজ্ঞায়িত HTTP অনুরোধ চালানোর জন্য, যা JetBrains IDE এবং VS Code REST ক্লায়েন্ট এক্সটেনশন দ্বারা জনপ্রিয়। এটি এই টুলগুলির সাথে সম্পূর্ণ সামঞ্জস্যের লক্ষ্য রাখে, যাতে ডেভেলপাররা একই অনুরোধ ফাইল IDE-তে ম্যানুয়াল পরীক্ষা এবং Go-তে স্বয়ংক্রিয় এন্ড-টু-এন্ড (E2E) পরীক্ষা উভয়ের জন্য ব্যবহার করতে পারেন। ## মূল বৈশিষ্ট্য - **JetBrains/VS Code সামঞ্জস্য**: `.http` ফাইল একই সিনট্যাক্স, ভেরিয়েবল এবং আচরণ ব্যবহার করে পার্স করে যা জনপ্রিয় IDE এক্সটেনশনগুলির মতো। - **ভেরিয়েবল প্রতিস্থাপন**: কাস্টম ভেরিয়েবল, এনভায়রনমেন্ট ভেরিয়েবল এবং সিস্টেম ভেরিয়েবল যেমন `{{$guid}}`, `{{$randomInt}}`, `{{$timestamp}}` এবং `{{$datetime}}` সমর্থন করে। - **রেসপন্স চেইনিং**: একই ফাইলের অন্যান্য অনুরোধ থেকে রেসপন্স উল্লেখ করুন, যেমন `{{authenticate.response.body.token}}`। - **অনুরোধ রেফারেন্সিং**: পূর্বশর্ত অনুরোধ চালানোর জন্য `@ref` (প্রতি রানে ক্যাশ করা) বা `@forceRef` (সর্বদা পুনরায় চালায়) ব্যবহার করুন এবং ফাইল জুড়ে নামযুক্ত অনুরোধ শেয়ার করতে `@import` ব্যবহার করুন। - **অনুরোধ নিয়ন্ত্রণ**: `@disabled` দিয়ে অনুরোধ এড়িয়ে যান, `@sleep <ms>` দিয়ে পাঠানোর আগে বিরতি দিন এবং `@loop` দিয়ে অনুরোধ লুপ করুন। - **রেসপন্স যাচাইকরণ**: `{{$any}}`, `{{$regexp}}` এবং `{{$anyGuid}}` এর মতো প্লেসহোল্ডার সহ `.hresp` ফাইলের সাথে রেসপন্স তুলনা করুন। - **প্রতি ফাইলে একাধিক অনুরোধ**: `###` দিয়ে অনুরোধ আলাদা করুন। - **E2E পরীক্ষার জন্য প্রস্তুত**: স্বয়ংক্রিয় ইন্টিগ্রেশন পরীক্ষার জন্য ডিজাইন করা হয়েছে। ## HTTP ফাইল ফরম্যাট `.http` ফাইল হল প্লেইন টেক্সট ফাইল যা HTTP অনুরোধ সংজ্ঞায়িত করে। একটি অনুরোধে ঐচ্ছিক নাম, পদ্ধতি, URL, হেডার এবং বডি থাকে। ```http ### অনুরোধের নাম METHOD URL Header1: value1 বডি কন্টেন্ট ``` ### উদাহরণ ```http @baseUrl = https://api.example.com @userId = 123 ### ব্যবহারকারীর প্রোফাইল পান GET {{baseUrl}}/users/{{userId}} Authorization: Bearer {{authToken}} X-Request-ID: {{$guid}} ``` ## লাইব্রেরি ব্যবহার ### ইনস্টলেশন ```bash go get github.com/bmcszk/go-restclient ``` ### Go-তে অনুরোধ চালান ```go package main import ( "context" "log" "github.com/bmcszk/go-restclient" ) func main() { client, _ := restclient.NewClient( restclient.WithVars(map[string]interface{}{ "authToken": "your-token-here", }), ) responses, _ := client.ExecuteFile(context.Background(), "requests.http") for i, resp := range responses { if resp.Error != nil { log.Printf("Request %d failed: %v", i+1, resp.Error) } else { log.Printf("Request %d: %d %s", i+1, resp.StatusCode, resp.Status) } } } ``` ### ক্লায়েন্ট অপশন ```go client, err := restclient.NewClient( restclient.WithBaseURL("https://api.example.com"), restclient.WithDefaultHeader("X-API-Key", "secret"), restclient.WithHTTPClient(customHTTPClient), restclient.WithVars(variables), ) ``` ## CLI ব্যবহার `restclient` CLI কমান্ড লাইন থেকে `.http` ফাইল চালায়। ### ইনস্টলেশন ```bash go install github.com/bmcszk/go-restclient/cmd/restclient@latest ``` ### মৌলিক কমান্ড ```bash restclient -f requests.http --all restclient -f requests.http -n "get user" restclient -f requests.http -i 0 restclient --version ``` ### অনুরোধ তালিকা ```bash restclient -f requests.http --list ``` ### একটি একক অনুরোধ চালান নাম দিয়ে (কেস-সংবেদনশীল নয়): ```bash restclient -f requests.http -n "create user" ``` 0-ভিত্তিক সূচক দিয়ে: ```bash restclient -f requests.http -i 0 ``` ### কমান্ড-লাইন ভেরিয়েবল ```bash restclient -f requests.http -D token=abc123 -D env=prod ``` ### পূর্বশর্ত অনুরোধ ```bash restclient -f requests.http -n "get protected" -A authenticate ``` ### ত্রুটিতে ব্যর্থ হন HTTP 4xx/5xx রেসপন্সে কোড 1 দিয়ে প্রস্থান করুন: ```bash restclient -f requests.http -E ``` ### আউটপুট ফরম্যাট ```bash # শুধুমাত্র বডি restclient -f requests.http -o body # JSON পাথ এক্সট্রাকশন restclient -f requests.http -o jsonpath "data.users[0].name" # এনভায়রনমেন্ট ভেরিয়েবল ফরম্যাট restclient -f requests.http -o env "token" ``` ### CLI ফ্ল্যাগ | সংক্ষিপ্ত | দীর্ঘ | বিবরণ | | ----- | ---- | ----------- | | `-f` | `--file` | অনুরোধ ফাইল পাথ (আবশ্যক) | | `-n` | `--name` | নাম দিয়ে অনুরোধ চালান | | `-i` | `--index` | সূচক দিয়ে অনুরোধ চালান | | | `--all` | ফাইলের সব অনুরোধ চালান | | `-e` | `--expected` | প্রত্যাশিত রেসপন্স ফাইল | | | `--e-name` | প্রত্যাশিত রেসপন্স নাম | | | `--e-index` | প্রত্যাশিত রেসপন্স সূচক | | `-l` | `--list` | অনুরোধ তালিকা | | `-E` | `--fail-on-error` | 4xx/5xx-তে ব্যর্থ হন | | `-o` | `--output` | আউটপুট ফরম্যাট | | `-A` | `--after` | পূর্বশর্ত অনুরোধ | | `-D` | `--define` | ভেরিয়েবল সংজ্ঞায়িত করুন (পুনরাবৃত্তিযোগ্য) | ## রেসপন্স যাচাইকরণ রেসপন্স যাচাই করতে `.hresp` ফাইল তৈরি করুন। **responses.hresp:** ```http HTTP/1.1 200 OK Content-Type: application/json { "id": "{{$anyGuid}}", "name": "{{$any}}", "createdAt": "{{$anyTimestamp}}" } ``` **Go-তে যাচাই করুন:** ```go err := client.ValidateResponses("responses.hresp", responses...) if err != nil { log.Fatal("Validation failed:", err) } ``` ### যাচাইকরণ প্লেসহোল্ডার - `{{$any}}` - যেকোনো টেক্সটের সাথে মেলে - `{{$regexp ``pattern``}}` - রেজেক্স প্যাটার্ন (ব্যাকটিকের মধ্যে) - `{{$anyGuid}}` - UUID ফরম্যাট - `{{$anyTimestamp}}` - ইউনিক্স টাইমস্ট্যাম্প - `{{$anyDatetime 'format'}}` - ডেটটাইম (rfc1123, iso8601, বা কাস্টম) ## ব্যবহারের ক্ষেত্র ### ম্যানুয়াল পরীক্ষা ডেভেলপমেন্টের সময় API পরীক্ষা করতে আপনার প্রিয় IDE এক্সটেনশন ব্যবহার করুন। ### স্বয়ংক্রিয় E2E পরীক্ষা ```go func TestUserAPI(t *testing.T) { client, _ := restclient.NewClient( restclient.WithBaseURL(testServer.URL), ) responses, err := client.ExecuteFile(context.Background(), "user_tests.http") require.NoError(t, err) err = client.ValidateResponses("user_expected.hresp", responses...) require.NoError(t, err) } ``` ## উন্নয়ন ### পূর্বশর্ত - Go 1.21+ ### কমান্ড ```bash make check # সব চেক চালান (lint, test, build) ``` ## লাইসেন্স MIT লাইসেন্স