اچ تی تی پی net/http
سرور و کارخواه HTTP: گردانندهها، پاسخ متنی و جیسون، کوکی و فرستادن درخواست.
واردسازی شبکه.اچ تی تی پی
- یک API جیسون در یک پرونده
- فرم HTML، رشتهی پرسمان و تغییر مسیر
- گروه مسیرها و بررسی ورود
- پروندههای ایستا و تنظیمات سرور
- اجرای سرور واقعی
- صدا زدن یک API از سمت کارخواه
- درخواست خام: سرآیند خودتان، بایت و مهلت
- فرستادن JSON با سرآیندهای خودتان
- کدهای وضعیت و شکستها
- یک کارخواه کوچک API
- پاسخ تکهتکه و مهلت
- بارگیری دودویی
- HTTPS
- مهلت، سقف و تغییر مسیر
- کدام تابع برای کدام کار
- گونهها
- پایاها و متغیرها
- تابعها
این بسته هر دو نیمهی HTTP/1.1 را دارد: سروری برای صفحههای وب و APIهای جیسون، و کارخواهی برای صدا زدن سرویسهای دیگر. سرور هر درخواست را به یک مسیریاب میدهد که گرداننده را بر اساس روش و مسیر انتخاب میکند. هر گرداننده یک عدد صحیح۶۴ میگیرد که شناسهی زمینهی درخواست است؛ با تابعهای زمینهی پایین درخواست را میخوانید و پاسخ را مینویسید، یا شناسه را با زمینه جدید به ساختار زمینه تبدیل میکنید و همان نامها را روی آن صدا میزنید.
بستههای پیرامون آن:
- میان افزار برای ثبت دسترسی، CORS و سرآیندهای کش، نشست برای ورود با کوکی، اعتبارسنجی برای بررسی ورودی و سواگر برای مستندات API؛
- اچ تی تی پی۲ برای HTTP/2 و وبسوکت برای اتصالهایی که باز میمانند.
اشتباههای رایج:
- همهی مسیرها را پیش از
استفادهثبت کنید. سرور رونوشتی از مسیریاب نگه میدارد. ارسال،قراردادنووصلهبدنه را فرم برچسب میزنند (application/x-www-form-urlencoded)، مگر اینکهContent-Typeبدهید؛ جیسون را باارسال باو همین سرآیند بفرستید.- کارخواه تا نخواهید تغییر مسیر را دنبال نمیکند. پاسخ ۳۰۲ همان ۳۰۲ با سرآیند
Locationبرمیگردد؛ برای دنبال کردن،max_redirectsرا درگزینه های درخواست(یا باتنظیم سقف تغییر مسیرروی یک کارخواه) بالای صفر بگذارید. هیچوقت معطل نمیماند و بیحد نمیخواند: خواندن یا نوشتنی که ۳۰ ثانیه بیحرکت بماند شکست میخورد، پاسخ بالای ۲۵۶ مگابایت شکست میخورد وtimeout_msکل درخواست را محدود میکند. موفقیعنی وضعیت 2xx. وقتی اصلاً به سرور نرسیدهایدوضعیتصفر است وخطادلیلش را میگوید.- مقداری که از درخواست خوانده میشود با برگشتن گرداننده آزاد میشود؛ پایان صفحه را ببینید.
نمونهها سرور را با اجرا در پس زمینه روی 127.0.0.1 اجرا میکنند و با همان برنامه به آن درخواست میفرستند.
یک API جیسون در یک پرونده
رایجترین کار، یک API کوچک جیسون است: فهرست رکوردها، نمایش یکی با شناسهاش و ساختن رکورد تازه. هر مسیر را با گردانندهاش روی مسیریاب ثبت کنید، مسیریاب را با استفاده به سرور بدهید و سرور را راه بیندازید. در این نمونه رکوردها ساختارهای سلاماند: جیسون.سریال سازی آنها را به بدنهی پاسخ تبدیل میکند و جیسون.واسریال سازی آسان گیر بدنهی فرستادهشده را به ساختار برمیگرداند؛ فیلدهای ناشناخته را نادیده میگیرد و فیلدهای نیامده را با مقدار پیشفرض رها میکند.
واردسازی شبکه.اچ تی تی پی
واردسازی شبکه.مسیریاب
واردسازی کدگذاری.جیسون
واردسازی کدگذاری.خطای کدگذاری
واردسازی تبدیل
ناپایا کتابها := وکتور {} برگردان وکتور<کتاب>
ساختار کتاب:
@جیسون "id"
همگانی شناسه: صحیح = ۰
@جیسون "title"
همگانی عنوان: رشته = ""
پایان
تابع فهرست(ز: صحیح۶۴):
اچ تی تی پی.جیسون(ز، جیسون.سریال سازی(کتابها))
پایان
تابع نمایش(ز: صحیح۶۴):
شماره := تبدیل.رشته به عدد(اچ تی تی پی.پارامتر(ز، "id"))
هر ک در کتابها:
اگر ک.شناسه برابر شماره:
اچ تی تی پی.جیسون(ز، جیسون.سریال سازی(ک))
برگشت
پایان
پایان
اچ تی تی پی.تنظیم وضعیت(ز، ۴۰۴)
اچ تی تی پی.جیسون(ز، `{"error":"چنین کتابی نیست"}`)
پایان
تابع ساختن(ز: صحیح۶۴):
ناپایا ک := کتاب {}
ناپایا خ := خطای کدگذاری.بدون خطا()
اگر وارونه جیسون.واسریال سازی آسان گیر(اچ تی تی پی.بدنه(ز)، ک، خ):
اچ تی تی پی.تنظیم وضعیت(ز، ۴۰۰)
اچ تی تی پی.جیسون(ز، "{" + جیسون.عضو("error"، خ.پیام) + "}")
برگشت
پایان
ک.شناسه = کتابها.طول() + ۱
کتابها.بیفزا(ک)
اچ تی تی پی.تنظیم وضعیت(ز، ۲۰۱)
اچ تی تی پی.تنظیم سرصفحه(ز، "Location"، "/books/" + ک.شناسه)
اچ تی تی پی.جیسون(ز، جیسون.سریال سازی(ک))
پایان
تابع ریشه:
ناپایا م := مسیریاب.مسیریاب جدید()
مسیریاب.دریافت(م، "/books"، فهرست)
مسیریاب.دریافت(م، "/books/:id"، نمایش)
مسیریاب.ارسال(م، "/books"، ساختن)
ناپایا س := اچ تی تی پی.سرور جدید(۱۹۷۸۱)
اچ تی تی پی.استفاده(س، م)
_ := اچ تی تی پی.اجرا در پس زمینه(س)
پایه := "http://127.0.0.1:19781"
پ := اچ تی تی پی.ارسال(پایه + "/books"، `{"title": "شازده کوچولو"}`)
سرچاپ اچ تی تی پی.وضعیت(پ)، اچ تی تی پی.دریافت سرصفحه(پ، "location")، اچ تی تی پی.بدنه(پ)
_ := اچ تی تی پی.ارسال(پایه + "/books"، `{"title": "مثنوی"}`)
سرچاپ اچ تی تی پی.بدنه(اچ تی تی پی.دریافت(پایه + "/books"))
سرچاپ اچ تی تی پی.بدنه(اچ تی تی پی.دریافت(پایه + "/books/2"))
نبود := اچ تی تی پی.دریافت(پایه + "/books/9")
سرچاپ اچ تی تی پی.وضعیت(نبود)، اچ تی تی پی.بدنه(نبود)
بد := اچ تی تی پی.ارسال(پایه + "/books"، `{"title": 7}`)
سرچاپ اچ تی تی پی.وضعیت(بد)، اچ تی تی پی.بدنه(بد)
پایانتا گرداننده تمام نشود چیزی فرستاده نمیشود: وضعیت، سرآیندها و بدنه جمع میشوند و با هم میروند، و اگر دو بار بدنه بنویسید دومی جای اولی را میگیرد. برای همین گرداننده درست پس از نوشتن خطا برمیگردد. پاسخ معمول به ساختن، ۲۰۱ همراه با سرآیند Location است، و یک ۴۰۴ با خطای کوتاه جیسون برای کارخواه از صفحهی خالی راحتتر است. پارامترهای مسیر مثل :id همیشه متناند؛ پیش از مقایسه آنها را با تبدیل.رشته به عدد به عدد تبدیل کنید.
فرم HTML، رشتهی پرسمان و تغییر مسیر
فرم مرورگر با نوع application/x-www-form-urlencoded میرسد. فرم زمینه یک فیلد را میخواند و رمزگشایی میکند؛ %40 میشود @ و + میشود فاصله. پرسمان زمینه همین کار را برای رشتهی پرسمان میکند. پس از یک POST موفق با تغییرمسیر زمینه پاسخ دهید تا اگر کاربر صفحه را تازه کرد، فرم دوباره فرستاده نشود.
واردسازی شبکه.اچ تی تی پی
واردسازی شبکه.مسیریاب
واردسازی قالب
ناپایا پیامها := وکتور {} برگردان وکتور<رشته>
تابع تابلو(ز: صحیح۶۴):
ناپایا صفحه := "<ul>"
هر پیام در پیامها:
صفحه = صفحه + "<li>" + قالب.گریز اچ تی ام ال(پیام) + "</li>"
پایان
اچ تی تی پی.اچ تی ام ال(ز، صفحه + "</ul>")
پایان
تابع نوشتن(ز: صحیح۶۴):
نام := اچ تی تی پی.فرم(ز، "name")
متن := اچ تی تی پی.فرم(ز، "text")
اگر نام برابر "" یا متن برابر "":
اچ تی تی پی.تنظیم وضعیت(ز، ۴۰۰)
اچ تی تی پی.متن(ز، "نام و متن هر دو لازماند")
برگشت
پایان
پیامها.بیفزا(نام + ": " + متن)
اچ تی تی پی.تغییرمسیر(ز، "/board")
پایان
تابع جستجو(ز: صحیح۶۴):
واژه := اچ تی تی پی.پرسمان(ز، "q")
ناپایا تعداد := ۰
هر پیام در پیامها:
اگر پیام.بیاب(واژه) بزرگتربرابر ۰:
تعداد += ۱
پایان
پایان
اچ تی تی پی.متن(ز، "«" + واژه + "» در " + تعداد + " پیام پیدا شد")
پایان
تابع ریشه:
ناپایا م := مسیریاب.مسیریاب جدید()
مسیریاب.دریافت(م، "/board"، تابلو)
مسیریاب.ارسال(م، "/board"، نوشتن)
مسیریاب.دریافت(م، "/search"، جستجو)
ناپایا س := اچ تی تی پی.سرور جدید(۱۹۷۸۲)
اچ تی تی پی.استفاده(س، م)
_ := اچ تی تی پی.اجرا در پس زمینه(س)
پایه := "http://127.0.0.1:19782"
ناپایا فرم := اچ تی تی پی.سرصفحه جدید()
فرم.درج("name"، "سارا")
فرم.درج("text"، "ساعت ۵ میبینمت و چای & شیرینی بیاور")
ناپایا سر := اچ تی تی پی.سرصفحه جدید()
سر.درج("Content-Type"، "application/x-www-form-urlencoded")
پ := اچ تی تی پی.ارسال با(پایه + "/board"، اچ تی تی پی.کدگذاری فرم(فرم)، سر)
سرچاپ اچ تی تی پی.وضعیت(پ)، اچ تی تی پی.دریافت سرصفحه(پ، "location")
ناقص := اچ تی تی پی.ارسال با(پایه + "/board"، "name=Reza"، سر)
سرچاپ اچ تی تی پی.وضعیت(ناقص)، اچ تی تی پی.بدنه(ناقص)
سرچاپ اچ تی تی پی.بدنه(اچ تی تی پی.دریافت(پایه + "/board"))
ناپایا پرسش := اچ تی تی پی.سرصفحه جدید()
پرسش.درج("q"، "چای")
سرچاپ اچ تی تی پی.بدنه(اچ تی تی پی.دریافت(اچ تی تی پی.با پرسمان(پایه + "/search"، پرسش)))
پایانهر چیزی که کاربر نوشته، پیش از رفتن در HTML باید گریز داده شود؛ وگرنه پیامی که <script> دارد در مرورگر همهی بازدیدکنندگان اجرا میشود. قالب.گریز اچ تی ام ال این کار را میکند، همانطور که & در خروجی نشان میدهد. در سمت کارخواه، کدگذاری فرم بدنهی فرم را از یک نگاشت میسازد و با پرسمان رشتهی پرسمان را به نشانی اضافه میکند، هر دو با گریز درست.
گروه مسیرها و بررسی ورود
مسیریاب.گروه مسیر را زیر یک پیشوند مشترک میگذارد؛ نسخهبندی API زیر /api/v1 همینطور انجام میشود. زنجیرهی جداگانهای برای میانافزار وجود ندارد: بررسیای که چند گرداننده با هم دارند یک تابع ساده است که اگر درخواست اجازهی ادامه دارد درست برمیگرداند، وگرنه خودش پاسخ خطا را مینویسد و نادرست برمیگرداند. هر گرداننده آن را در خط اول صدا میزند و اگر نادرست بود برمیگردد.
واردسازی شبکه.اچ تی تی پی
واردسازی شبکه.مسیریاب
تابع وارد شده(ز: صحیح۶۴): منطقی:
اگر اچ تی تی پی.سرصفحه(ز، "Authorization") برابر "Bearer s3cret":
برگشت درست
پایان
اچ تی تی پی.تنظیم وضعیت(ز، ۴۰۱)
اچ تی تی پی.تنظیم سرصفحه(ز، "WWW-Authenticate"، "Bearer")
اچ تی تی پی.جیسون(ز، `{"error":"اول وارد شوید"}`)
برگشت نادرست
پایان
تابع سلامت(ز: صحیح۶۴):
اچ تی تی پی.متن(ز، "ok")
پایان
تابع نمایه(ز: صحیح۶۴):
اگر وارونه وارد شده(ز): برگشت پایان
اچ تی تی پی.جیسون(ز، `{"user":"maryam"}`)
پایان
تابع پاک کردن(ز: صحیح۶۴):
اگر وارونه وارد شده(ز): برگشت پایان
اچ تی تی پی.تنظیم وضعیت(ز، ۲۰۴)
اچ تی تی پی.متن(ز، "")
پایان
تابع ریشه:
ناپایا م := مسیریاب.مسیریاب جدید()
مسیریاب.دریافت(م، "/health"، سلامت)
مسیریاب.گروه(م، "/api/v1"، "GET"، "/profile"، نمایه)
مسیریاب.گروه(م، "/api/v1"، "DELETE"، "/posts/:id"، پاک کردن)
ناپایا س := اچ تی تی پی.سرور جدید(۱۹۷۸۳)
اچ تی تی پی.استفاده(س، م)
_ := اچ تی تی پی.اجرا در پس زمینه(س)
پایه := "http://127.0.0.1:19783"
سرچاپ اچ تی تی پی.بدنه(اچ تی تی پی.دریافت(پایه + "/health"))
پ := اچ تی تی پی.دریافت(پایه + "/api/v1/profile")
سرچاپ اچ تی تی پی.وضعیت(پ)، اچ تی تی پی.دریافت سرصفحه(پ، "www-authenticate")، اچ تی تی پی.بدنه(پ)
ناپایا مجوز := اچ تی تی پی.سرصفحه جدید()
مجوز.درج("Authorization"، "Bearer s3cret")
سرچاپ اچ تی تی پی.بدنه(اچ تی تی پی.دریافت با(پایه + "/api/v1/profile"، مجوز))
سرچاپ اچ تی تی پی.وضعیت(اچ تی تی پی.حذف با(پایه + "/api/v1/posts/3"، مجوز))
سرچاپ اچ تی تی پی.وضعیت(اچ تی تی پی.دریافت(پایه + "/profile"))
پایانمسیری که ثبت نشده خودبهخود ۴۰۴ میدهد، پس /profile بدون پیشوند پیدا نمیشود. برای ورود با کوکی به جای توکن، بستهی نشست را ببینید.
پروندههای ایستا و تنظیمات سرور
مسیریاب.ایستا یک پوشهی کامل را زیر یک پیشوند سرو میکند و نوع محتوا را از پسوند پرونده میگیرد. مسیری که بخواهد با .. از پوشه بیرون برود پذیرفته نمیشود و پروندهی ناموجود ۴۰۴ میدهد. پنهان سازی توکن شمارهی نسخه را از سرآیند Server برمیدارد تا پاسخ فقط Salam بگوید.
واردسازی شبکه.اچ تی تی پی
واردسازی شبکه.مسیریاب
واردسازی سیستم عامل
تابع ریشه:
_ := سیستم عامل.ساخت پوشه ها("public/css")
_ := سیستم عامل.نوشتن پرونده("public/index.html"، "<h1>خوش آمدید</h1>")
_ := سیستم عامل.نوشتن پرونده("public/css/site.css"، "body { margin: 0 }")
ناپایا م := مسیریاب.مسیریاب جدید()
مسیریاب.ایستا(م، "/site"، "public")
ناپایا س := اچ تی تی پی.سرور جدید(۱۹۷۸۴)
اچ تی تی پی.پنهان سازی توکن(س)
اچ تی تی پی.استفاده(س، م)
_ := اچ تی تی پی.اجرا در پس زمینه(س)
پایه := "http://127.0.0.1:19784"
صفحه := اچ تی تی پی.دریافت(پایه + "/site/index.html")
سرچاپ اچ تی تی پی.وضعیت(صفحه)، اچ تی تی پی.دریافت سرصفحه(صفحه، "content-type")، اچ تی تی پی.بدنه(صفحه)
سبک := اچ تی تی پی.دریافت(پایه + "/site/css/site.css")
سرچاپ اچ تی تی پی.دریافت سرصفحه(سبک، "content-type")، اچ تی تی پی.بدنه(سبک)
سرچاپ اچ تی تی پی.وضعیت(اچ تی تی پی.دریافت(پایه + "/site/missing.png"))
سرچاپ اچ تی تی پی.وضعیت(اچ تی تی پی.دریافت(پایه + "/site/../secret.txt"))
سرچاپ اچ تی تی پی.دریافت سرصفحه(صفحه، "server")
پایاناجرای سرور واقعی
نمونههای بالا از اجرا در پس زمینه استفاده میکنند تا یک برنامه هم سرور باشد و هم کارخواه خودش. سرویس واقعی اجرا را صدا میزند که هرگز برنمیگردد. درگاه را از متغیر محیطی بخوانید، وقتی سرور در کانتینر یا پشت پراکسی است روی 0.0.0.0 گوش دهید، و تا وقتی سرور را راه میاندازید گزارش دسترسی را روشن نگه دارید.
واردسازی شبکه.اچ تی تی پی
واردسازی شبکه.مسیریاب
واردسازی سیستم عامل
واردسازی تبدیل
تابع خانه(ز: صحیح۶۴):
اچ تی تی پی.اچ تی ام ال(ز، "<h1>سلام</h1>")
پایان
تابع سلامت(ز: صحیح۶۴):
اچ تی تی پی.جیسون(ز، `{"status":"ok"}`)
پایان
تابع ریشه:
ناپایا درگاه := ۸۰۸۰
اگر سیستم عامل.متغیر محیطی("PORT") نابرابر "":
درگاه = تبدیل.رشته به عدد(سیستم عامل.متغیر محیطی("PORT"))
پایان
اچ تی تی پی.بیشینه بایت بدنه(۱۰۴۸۵۷۶)
اچ تی تی پی.تنظیم بیکاری زنده نگه داشتن(۵۰۰۰)
ناپایا م := مسیریاب.مسیریاب جدید()
مسیریاب.دریافت(م، "/"، خانه)
مسیریاب.دریافت(م، "/health"، سلامت)
مسیریاب.ایستا(م، "/assets"، "public")
ناپایا س := اچ تی تی پی.سرور جدید(درگاه)
اچ تی تی پی.تنظیم میزبان(س، "0.0.0.0")
اچ تی تی پی.پنهان سازی توکن(س)
اچ تی تی پی.فعال سازی گزارش دسترسی(س)
اچ تی تی پی.استفاده(س، م)
سرچاپ "گوش دادن روی درگاه " + درگاه
اچ تی تی پی.اجرا(س)
پایانآن را اجرا کنید و از ترمینال دیگری امتحانش کنید:
PORT=8080 salam run server.salam
curl http://127.0.0.1:8080/health
این محدودیتها برای کل فرایندند: بیشینه بایت بدنه و بیشینه بایت سرایند درخواستهای بیش از اندازه را رد میکنند، تنظیم بیکاری زنده نگه داشتن اتصالهای بیکار را میبندد و بیشینه درخواست زنده نگه داشتن شمار درخواستهای یک اتصال را محدود میکند. برای HTTPS به جای اجرا از اجرای امن با پروندهی گواهی و کلید استفاده کنید، یا سرور را پشت پراکسیای بگذارید که TLS را انجام میدهد.
صدا زدن یک API از سمت کارخواه
دریافت، ارسال و دیگر فراخوانیهای یکخطی درخواستی میفرستند و یک پاسخ برمیگردانند؛ شکلهای ... با یک نگاشت از سرآیندهای اضافه میگیرند. برنامهی زیر چهار پاسخی را نشان میدهد که کارخواه باید از عهدهشان برآید. ارسال بدون نوع محتوا به شکل فرم به سرور میرسد، پس API جیسون آن را با ۴۱۵ رد میکند؛ همان بدنه با ارسال با و Content-Type: application/json تیکت را میسازد. تغییر مسیر دنبال نمیشود، پس دریافت همان ۳۰۲ را برمیگرداند و Location را خودتان میخوانید. سروری که اجرا نیست وضعیت صفر میدهد و دلیلش در خطا است.
واردسازی شبکه.اچ تی تی پی
واردسازی شبکه.مسیریاب
واردسازی کدگذاری.جیسون
تابع ساخت تیکت(ز: صحیح۶۴):
نوع محتوا := اچ تی تی پی.سرصفحه(ز، "Content-Type")
اگر نوع محتوا != "application/json":
اچ تی تی پی.تنظیم وضعیت(ز، ۴۱۵)
اچ تی تی پی.جیسون(ز، "{\"error\":\"expected JSON, got " + نوع محتوا + "\"}")
برگشت
پایان
عنوان := جیسون.دریافت(اچ تی تی پی.بدنه(ز)، "title")
اچ تی تی پی.تنظیم وضعیت(ز، ۲۰۱)
اچ تی تی پی.جیسون(ز، "{\"id\":31,\"title\":" + جیسون.رشته جیسون(عنوان) + "}")
پایان
تابع تیکتهای قدیمی(ز: صحیح۶۴): اچ تی تی پی.تغییرمسیر(ز، "/v2/tickets") پایان
تابع ریشه:
ناپایا م := مسیریاب.مسیریاب جدید()
مسیریاب.ارسال(م، "/tickets"، ساخت تیکت)
مسیریاب.دریافت(م، "/tickets"، تیکتهای قدیمی)
ناپایا س := اچ تی تی پی.سرور جدید(۱۸۶۳۲)
اچ تی تی پی.تنظیم میزبان(س، "127.0.0.1")
اچ تی تی پی.استفاده(س، م)
اگر وارونه اچ تی تی پی.اجرا در پس زمینه(س):
سرچاپ "درگاه ۱۸۶۳۲ گرفته است"
برگشت ۱
پایان
پایه := "http://127.0.0.1:18632"
بدنه := `{"title": "کاغذ چاپگر تمام شده"}`
ساده := اچ تی تی پی.ارسال(پایه + "/tickets"، بدنه)
سرچاپ "ارسال:"، اچ تی تی پی.وضعیت(ساده)، اچ تی تی پی.بدنه(ساده)
ناپایا سرها := اچ تی تی پی.سرصفحه جدید()
سرها.درج("Content-Type"، "application/json")
ساخته := اچ تی تی پی.ارسال با(پایه + "/tickets"، بدنه، سرها)
سرچاپ "ارسال با:"، اچ تی تی پی.وضعیت(ساخته)، اچ تی تی پی.موفق(ساخته)، "شناسه"، جیسون.دریافت عدد(اچ تی تی پی.بدنه(ساخته)، "id")
جابهجا := اچ تی تی پی.دریافت(پایه + "/tickets")
سرچاپ "دریافت:"، اچ تی تی پی.وضعیت(جابهجا)، "Location:"، اچ تی تی پی.دریافت سرصفحه(جابهجا، "location")
خاموش := اچ تی تی پی.دریافت("http://127.0.0.1:1/tickets")
سرچاپ "سرور خاموش:"، اچ تی تی پی.وضعیت(خاموش)، اچ تی تی پی.موفق(خاموش)، اچ تی تی پی.خطا(خاموش)
برگشت ۰
پایانپاسخهای gzip و chunked برایتان باز میشوند و هر درخواست با Connection: close فرستاده میشود. برای چند فراخوانی که یک ورود مشترک دارند، کارخواه جدید کوکیهای هر پاسخ را نگه میدارد و با درخواست بعدی میفرستد، بهعلاوهی سرآیندهایی که با تنظیم سرصفحه گذاشتهاید. هر کوکی فقط به میزبانی برمیگردد که آن را گذاشته؛ کوکیای که با تنظیم کوکی اضافه کنید به میزبان نخستین درخواست میرود و هرگز به میزبانی که یک تغییر مسیر به آن برساند.
هر تعداد نخ میتوانند فراخوانیهای یکخطی را همزمان به کار ببرند، چون هر فراخوانی بیرون از خودش وضعیتی نگه نمیدارد. یک کارخواه که از کارخواه جدید آمده باشد را هم میشود بین نخها به اشتراک گذاشت: قفل خودش را دارد، پس تنظیم سرصفحه، ظرف کوکی و تنظیمها سازگار میمانند. وقتی کارتان با یک کارخواه مشترک تمام شد آزادسازی را صدا بزنید. کارخواه {} که به شکل لفظی نوشته شود قفل ندارد و مال یک نخ است.
درخواست خام: سرآیند خودتان، بایت و مهلت
فراخوانیهای یکخطی بالا درخواست را برایتان میسازند. وقتی کنترل کامل سطر درخواست و سرآیندها را بخواهید، مثلاً برای امضای درخواست، فرستادن بدنهی دودویی یا کار با APIای که سرآیندهای غیرمعمول دارد، سر درخواست را خودتان بنویسید و با ارسال خام بفرستید. بستههای ای دبلیو اس، اعلان وب، میلیسرچ، الستیک سرچ و تایپسنس روی همین فراخوانیها ساخته شدهاند. نمونهها در برابر سرور کوچکی اجرا میشوند که در یک نخ از همان برنامه است، پس به شبکه نیاز ندارند.
هر فراخوانی خام یک نقطه پایانی از تجزیه نقطه پایانی میگیرد (میزبان، درگاه و روشن یا خاموش بودن TLS؛ مسیر داخل نشانی کنار گذاشته میشود، چون مسیر در سطر درخواست شما میآید) و یک سر درخواست: سطر درخواست، سرآیندها و یک سطر خالی، که هر سطرش با \r\n تمام میشود. بدنه یک اشارهگر و یک طول است، پس هر بایتی را میتواند در بر بگیرد. پاسخ یک پاسخ خام است با بدنه به شکل بایت که بدنهی chunked در آن باز شده و با آزادسازی پاسخ خام آزاد میشود. ارسال خام تا هر وقت سرور بخواهد صبر میکند؛ ارسال خام با مهلت مهلتی به میلیثانیه اضافه میکند؛ ارسال خام با پیکربندی امن یک tls.Config خودتان را. پاسخی بزرگتر از سقف پاسخ خام (پیشفرض ۲۵۶ مگابایت) به شکل خطا گزارش میشود.
چیزهایی که بیشتر غافلگیر میکنند:
- اگر پاسخ قاببندی ندارد،
Connection: closeبفرستید. فراخوانیهای خام به محض کامل شدن پاسخی کهContent-Lengthیا بدنهٔ chunked دارد تمام میشوند. پاسخی که هیچکدام را ندارد تا بسته شدن اتصال از سوی سرور خوانده میشود؛ پس روی اتصال زنده، فراخوانی تا آن لحظه (یا تا پایان مهلت) منتظر میماند. okیعنی وضعیت 2xx، نه «پاسخی رسید». برای جدا کردن ۴۰۴ از سرور خاموش بهstatusنگاه کنید.- رشته در نخستین بایت صفر تمام میشود، پس بدنهی دودویی در
dataمیماند؛متن پاسخ خامدر نخستین صفر میبرد.
فرستادن JSON با سرآیندهای خودتان
تجزیه نقطه پایانی یک نشانی را به میزبان، درگاه و اینکه TLS لازم است یا نه تبدیل میکند. سر درخواست متن سادهای است که خودتان مینویسید: سطر درخواست، سرآیند Host و اینجا توکن Authorization، نوع محتوا و طول بدنه، که با یک سطر خالی تمام میشود. ارسال خام با مهلت سر و بدنه را میفرستد و پاسخ را برمیگرداند؛ متن پاسخ خام بدنهی پاسخ را به رشته تبدیل میکند. مقدار سرصفحه یک سرآیند را در سر پاسخ پیدا میکند و به بزرگی و کوچکی حرف اهمیت نمیدهد.
واردسازی شبکه.اچ تی تی پی
واردسازی شبکه.تی سی پی
واردسازی کدگذاری.جیسون
ناپایا سرور := تی سی پی.سرور {}
تابع خواندن درخواست(ا: تی سی پی.اتصال شبکه): رشته:
ناپایا رسیده := تی سی پی.خواندن(ا، ۴۰۹۶)
تا رسیده.بیاب("\r\n\r\n") کوچکتر ۰:
رسیده += تی سی پی.خواندن(ا، ۴۰۹۶)
پایان
انتهای سر := رسیده.بیاب("\r\n\r\n") + ۴
اندازه := اچ تی تی پی.مقدار سرصفحه(رسیده، "content-length").به صحیح()
تا رسیده.طول() کوچکتر انتهای سر + اندازه:
رسیده += تی سی پی.خواندن(ا، ۴۰۹۶)
پایان
برگشت رسیده
پایان
تابع رابط برنامه():
ا := تی سی پی.پذیرش(سرور)
درخواست := خواندن درخواست(ا)
جا := درخواست.بیاب("\r\n\r\n") + ۴
بدنه := درخواست.زیررشته(جا، درخواست.طول() - جا)
نام := جیسون.دریافت(بدنه، "name")
مجوز := اچ تی تی پی.مقدار سرصفحه(درخواست، "authorization")
پاسخ := "{\"id\": 7, \"name\": \"" + نام + "\", \"auth\": \"" + مجوز + "\"}"
سر := "HTTP/1.1 201 Created\r\nContent-Type: application/json\r\nLocation: /users/7\r\nContent-Length: " + پاسخ.طول() + "\r\nConnection: close\r\n\r\n"
_ := تی سی پی.نوشتن(ا، سر + پاسخ)
تی سی پی.بستن(ا)
پایان
تابع ریشه:
سرور = تی سی پی.پیوند(۰)
ک := نخساز(رابط برنامه)
نشانی := اچ تی تی پی.تجزیه نقطه پایانی("http://127.0.0.1:" + تی سی پی.درگاه(سرور))
بدنه := `{"name": "سارا", "role": "editor"}`
ناپایا سر := "POST /users HTTP/1.1\r\n"
سر += "Host: 127.0.0.1\r\n"
سر += "Authorization: Bearer abc123\r\n"
سر += "Content-Type: application/json\r\n"
سر += "Content-Length: " + بدنه.طول() + "\r\n"
سر += "Connection: close\r\n\r\n"
ناپایا پ := اچ تی تی پی.ارسال خام با مهلت(نشانی، سر، بدنه برگردان تهی*، بدنه.طول()، ۵۰۰۰)
پاسخمتن := اچ تی تی پی.متن پاسخ خام(پ)
اچ تی تی پی.آزادسازی پاسخ خام(پ)
نخپیوند(ک)
تی سی پی.بستن سرور(سرور)
سرچاپ "وضعیت:"، پ.وضعیت، پ.موفق
سرچاپ "نشانی تازه:"، اچ تی تی پی.مقدار سرصفحه(پ.سرصفحه، "Location")
سرچاپ "شناسه:"، جیسون.دریافت عدد(پاسخمتن، "id")
سرچاپ "بدنه:"، پاسخمتن
پایانContent-Length باید طول به بایت باشد و طول() رشته همین را برمیگرداند؛ پس برای متن فارسی هم درست میماند، با اینکه «سارا» چهار حرف و هشت بایت است. طول نادرست باعث میشود سرور منتظر دادهی بیشتر بماند یا بدنه را ببرد.
کدهای وضعیت و شکستها
یک پاسخ خام سه حالت را از هم جدا میکند. ok فقط برای وضعیت 2xx درست است. پاسخ 4xx یا 5xx هم status و بدنهی خودش را دارد که معمولاً مشکل را توضیح میدهد. وقتی هیچ پاسخی نرسیده، چون اتصال رد شده، میزبان ناشناخته بوده یا نشانی تجزیه نشده، status برابر ۰ است و error دلیلش را میگوید.
واردسازی شبکه.اچ تی تی پی
واردسازی شبکه.تی سی پی
ناپایا سرور := تی سی پی.سرور {}
تابع رابط برنامه():
تکرار ۲:
ا := تی سی پی.پذیرش(سرور)
درخواست := تی سی پی.خواندن(ا، ۴۰۹۶)
اگر درخواست.بیاب("GET /missing ") برابر ۰:
تی سی پی.نوشتن اچ تی تی پی(ا، "404 Not Found"، "application/json; charset=utf-8"، `{"error": "چنین صفحهای نیست"}`)
وگرنه:
تی سی پی.نوشتن اچ تی تی پی(ا، "503 Service Unavailable"، "text/plain; charset=utf-8"، "بعدا دوباره امتحان کنید")
پایان
تی سی پی.بستن(ا)
پایان
پایان
تابع بگیر از(نشانی: اچ تی تی پی.نقطه پایانی، مسیر: رشته):
سر := "GET " + مسیر + " HTTP/1.1\r\nHost: " + نشانی.میزبان + "\r\nConnection: close\r\n\r\n"
ناپایا پ := اچ تی تی پی.ارسال خام با مهلت(نشانی، سر، پوچ، ۰، ۵۰۰۰)
بدنه := اچ تی تی پی.متن پاسخ خام(پ)
اگر پ.موفق:
سرچاپ مسیر، "کار کرد:"، بدنه
وگرنه پ.وضعیت بزرگتر ۰:
سرچاپ مسیر، "پاسخ"، پ.وضعیت، "داد با"، بدنه
وگرنه:
سرچاپ مسیر، "شکست خورد:"، پ.خطا
پایان
اچ تی تی پی.آزادسازی پاسخ خام(پ)
پایان
تابع ریشه:
سرور = تی سی پی.پیوند(۰)
نخ := نخساز(رابط برنامه)
نشانی := اچ تی تی پی.تجزیه نقطه پایانی("http://127.0.0.1:" + تی سی پی.درگاه(سرور))
بگیر از(نشانی، "/missing")
بگیر از(نشانی، "/busy")
نخپیوند(نخ)
تی سی پی.بستن سرور(سرور)
بگیر از(اچ تی تی پی.تجزیه نقطه پایانی("http://127.0.0.1:1")، "/nobody-listens")
نشانی بد := اچ تی تی پی.تجزیه نقطه پایانی("ftp://files.example.com")
سرچاپ "نشانی ftp درست است:"، نشانی بد.موفق
بگیر از(نشانی بد، "/")
پایانوضعیت 503 یا 429 اغلب یعنی «بعداً دوباره امتحان کن»؛ پیش از تلاش دوباره Retry-After را با مقدار سرصفحه بخوانید و خطای 4xx مثل 404 را که تغییر نمیکند دوباره نفرستید.
یک کارخواه کوچک API
ساختاری که نقطهی پایانی و توکن را نگه میدارد و برای هر گونه درخواست یک متد دارد، نوشتن سرآیندها را در یک جا نگه میدارد. JSON پاسخها با جیسون خوانده میشود: جیسون.دریافت برای یک فیلد و جیسون.اقلام برای پیمودن یک آرایه.
واردسازی شبکه.اچ تی تی پی
واردسازی شبکه.تی سی پی
واردسازی کدگذاری.جیسون
ناپایا سرور := تی سی پی.سرور {}
ساختار رابط:
همگانی نشانی: اچ تی تی پی.نقطه پایانی = اچ تی تی پی.نقطه پایانی {}
همگانی توکن: رشته = ""
همگانی تابع خواندن مسیر(مسیر: رشته): رشته:
ناپایا سر := "GET " + مسیر + " HTTP/1.1\r\n"
سر += "Host: " + این.نشانی.میزبان + "\r\n"
سر += "Authorization: Bearer " + این.توکن + "\r\n"
سر += "Accept: application/json\r\n"
سر += "Connection: close\r\n\r\n"
ناپایا خام := اچ تی تی پی.ارسال خام با مهلت(این.نشانی، سر، پوچ، ۰، ۵۰۰۰)
دیرکن اچ تی تی پی.آزادسازی پاسخ خام(خام)
برگشت اچ تی تی پی.متن پاسخ خام(خام)
پایان
پایان
تابع پشتیبان():
تکرار ۲:
ا := تی سی پی.پذیرش(سرور)
درخواست := تی سی پی.خواندن(ا، ۴۰۹۶)
اگر درخواست.بیاب("GET /users/7 ") برابر ۰:
تی سی پی.نوشتن اچ تی تی پی(ا، "200 OK"، "application/json; charset=utf-8"، `{"id": 7, "name": "سارا", "city": "شیراز"}`)
وگرنه:
تی سی پی.نوشتن اچ تی تی پی(ا، "200 OK"، "application/json; charset=utf-8"، `[{"item": "خودکار", "qty": 3}, {"item": "دفتر", "qty": 1}]`)
پایان
تی سی پی.بستن(ا)
پایان
پایان
تابع ریشه:
سرور = تی سی پی.پیوند(۰)
نخ := نخساز(پشتیبان)
رابط برنامه := رابط { نشانی = اچ تی تی پی.تجزیه نقطه پایانی("http://127.0.0.1:" + تی سی پی.درگاه(سرور))، توکن = "abc123" }
کاربر := رابط برنامه.خواندن مسیر("/users/7")
سرچاپ جیسون.دریافت(کاربر، "name")، "از"، جیسون.دریافت(کاربر، "city")
سفارشها := رابط برنامه.خواندن مسیر("/users/7/orders")
هر سفارش در جیسون.اقلام(سفارشها):
سرچاپ " "، جیسون.دریافت عدد(سفارش، "qty")، "عدد"، جیسون.دریافت(سفارش، "item")
پایان
نخپیوند(نخ)
تی سی پی.بستن سرور(سرور)
پایانپاسخ تکهتکه و مهلت
سروری که طول پاسخش را از پیش نمیداند آن را در تکههایی میفرستد که پیش از هر کدام اندازهاش در مبنای ۱۶ آمده است. ارسال خام با مهلت این قاببندی را برمیدارد. آخرین پارامتر ارسال خام با مهلت مهلتی به میلیثانیه برای هر خواندن و نوشتن است و در لینوکس برای اتصال هم، پس سروری که اتصال را میپذیرد و بعد چیزی نمیگوید نمیتواند برنامه را معطل کند. درخواست دوم زیر با مهلت ۳۰۰ میلیثانیه به چنین سروری میخورد.
واردسازی شبکه.اچ تی تی پی
واردسازی شبکه.تی سی پی
ناپایا سرور := تی سی پی.سرور {}
تابع خبرنامه():
تکرار ۲ در ی:
ا := تی سی پی.پذیرش(سرور)
_ := تی سی پی.خواندن(ا، ۴۰۹۶)
اگر ی کوچکتر ۱:
_ := تی سی پی.نوشتن(ا، "HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\nTransfer-Encoding: chunked\r\n\r\n6\r\nnews: \r\n9\r\nall quiet\r\n0\r\n\r\n")
وگرنه:
_ := تی سی پی.خواندن(ا، ۴۰۹۶)
پایان
تی سی پی.بستن(ا)
پایان
پایان
تابع ریشه:
سرور = تی سی پی.پیوند(۰)
نخ := نخساز(خبرنامه)
نشانی := اچ تی تی پی.تجزیه نقطه پایانی("http://127.0.0.1:" + تی سی پی.درگاه(سرور))
سر := "GET /feed HTTP/1.1\r\nHost: 127.0.0.1\r\nConnection: close\r\n\r\n"
ناپایا خام := اچ تی تی پی.ارسال خام با مهلت(نشانی، سر، پوچ، ۰، ۲۰۰۰)
سرچاپ "بدنه:"، اچ تی تی پی.متن پاسخ خام(خام)
اچ تی تی پی.آزادسازی پاسخ خام(خام)
ناپایا کند := اچ تی تی پی.ارسال خام با مهلت(نشانی، سر، پوچ، ۰، ۳۰۰)
سرچاپ "سرور خاموش:"، کند.موفق، کند.وضعیت، کند.خطا
اچ تی تی پی.آزادسازی پاسخ خام(کند)
نخپیوند(نخ)
تی سی پی.بستن سرور(سرور)
پایانپایان مهلت به شکل the request timed out گزارش میشود و پاسخی که با بسته شدن اتصال ناقص بماند به شکل the response body was cut short؛ هر دو برای تلاش دوبارهی بعدی ارزش دارند. ارسال خام اصلاً مهلت ندارد؛ برای هر سروری که در اختیار شما نیست ارسال خام با مهلت را با یک مهلت به کار ببرید. ارسال خام با پیکربندی امن همین مهلت را بهعلاوهی یک tls.Config برای مرجع خصوصی میگیرد.
بارگیری دودویی
رشته در نخستین بایت صفر تمام میشود، پس تصویر یا پروندهی زیپی که به رشته تبدیل شود بریده میرسد. به جای آن بدنه را از خود پاسخ خام بخوانید: data به بایتهای بدنه اشاره میکند و len شمار آنهاست. برنامه دوازده بایت از سرآیند یک PNG را بارگیری میکند و نشان میدهد که متن پاسخ خام، که بدنه را به رشته تبدیل میکند، فقط هشت بایت پیش از نخستین صفر را نگه میدارد.
واردسازی شبکه.اچ تی تی پی
واردسازی شبکه.تی سی پی
واردسازی حافظه
واردسازی تبدیل
ناپایا سرور := تی سی پی.سرور {}
تابع پروندهها():
ا := تی سی پی.پذیرش(سرور)
_ := تی سی پی.خواندن(ا، ۴۰۹۶)
تصویر := [۱۳۷، ۸۰، ۷۸، ۷۱، ۱۳، ۱۰، ۲۶، ۱۰، ۰، ۰، ۰، ۱۳]
بافر := حافظه.تخصیص(۱۲ برگردان طبیعی۶۴) برگردان طبیعی۸*
تکرار ۱۲ در ی:
بافر[ی] = تصویر[ی] برگردان طبیعی۸
پایان
_ := تی سی پی.نوشتن(ا، "HTTP/1.1 200 OK\r\nContent-Type: image/png\r\nContent-Length: 12\r\nConnection: close\r\n\r\n")
_ := تی سی پی.نوشتن بایت(ا، بافر برگردان تهی*، ۱۲)
حافظه.آزادسازی(بافر برگردان تهی*)
تی سی پی.بستن(ا)
پایان
تابع ریشه:
سرور = تی سی پی.پیوند(۰)
نخ := نخساز(پروندهها)
نشانی := اچ تی تی پی.تجزیه نقطه پایانی("http://127.0.0.1:" + تی سی پی.درگاه(سرور))
سر := "GET /logo.png HTTP/1.1\r\nHost: 127.0.0.1\r\nConnection: close\r\n\r\n"
ناپایا پ := اچ تی تی پی.ارسال خام با مهلت(نشانی، سر، پوچ، ۰، ۵۰۰۰)
نخپیوند(نخ)
تی سی پی.بستن سرور(سرور)
سرچاپ پ.موفق، پ.وضعیت، اچ تی تی پی.مقدار سرصفحه(پ.سرصفحه، "content-type")
سرچاپ "بایتهای رسیده:"، پ.اندازه
بایتها := پ.داده برگردان طبیعی۸*
ناپایا شانزدهی := ""
تکرار پ.اندازه در ی:
اگر ی بزرگتر ۰: شانزدهی += " " پایان
اگر بایتها[ی] کوچکتر ۱۶: شانزدهی += "0" پایان
شانزدهی += تبدیل.قالب شانزده(بایتها[ی] برگردان طبیعی۶۴)
پایان
سرچاپ شانزدهی
سرچاپ "PNG است:"، پ.اندازه بزرگتربرابر ۴ و بایتها[۱] برگردان صحیح برابر ۸۰ و بایتها[۲] برگردان صحیح برابر ۷۸ و بایتها[۳] برگردان صحیح برابر ۷۱
سرچاپ "متن پاسخ خام فقط"، اچ تی تی پی.متن پاسخ خام(پ).طول()، "بایت نگه میدارد"
اچ تی تی پی.آزادسازی پاسخ خام(پ)
پایانبدنهی پاسخ خام به سقف پاسخ خام بایت محدود است، یعنی ۲۵۶ مگابایت مگر اینکه با تنظیم سقف پاسخ خام عوضش کنید؛ پاسخ بزرگتر به جای پر کردن حافظه به شکل خطا گزارش میشود. بافر data تا آزادسازی پاسخ خام مال شماست.
HTTPS
نشانی https:// نقطهی پایانیای با secure درست میدهد و همان فراخوانیها از راه تی ال اس با TLS حرف میزنند و گواهی سرور را بررسی میکنند. چیز دیگری تغییر نمیکند. این نمونه از API گیتهاب دربارهی مخزن سلام میپرسد و به اینترنت نیاز دارد؛ گیتهاب سرآیند User-Agent را لازم میداند.
واردسازی شبکه.اچ تی تی پی
واردسازی کدگذاری.جیسون
تابع ریشه:
نشانی := اچ تی تی پی.تجزیه نقطه پایانی("https://api.github.com")
سرچاپ نشانی.میزبان، نشانی.درگاه، نشانی.امن
ناپایا سر := "GET /repos/SalamLang/Salam HTTP/1.1\r\n"
سر += "Host: api.github.com\r\n"
سر += "User-Agent: salam-example\r\n"
سر += "Accept: application/vnd.github+json\r\n"
سر += "Connection: close\r\n\r\n"
ناپایا پ := اچ تی تی پی.ارسال خام با مهلت(نشانی، سر، پوچ، ۰، ۱۰۰۰۰)
دیرکن اچ تی تی پی.آزادسازی پاسخ خام(پ)
بدنه := اچ تی تی پی.متن پاسخ خام(پ)
اگر پ.وضعیت برابر ۰:
سرچاپ "درخواست شکست خورد:"، پ.خطا
برگشت ۱
پایان
سرچاپ "وضعیت:"، پ.وضعیت
سرچاپ "سهمیهی باقیمانده:"، اچ تی تی پی.مقدار سرصفحه(پ.سرصفحه، "x-ratelimit-remaining")
اگر پ.موفق:
سرچاپ جیسون.دریافت(بدنه، "full_name")، "به زبان"، جیسون.دریافت(بدنه، "language")، "نوشته شده است"
پایان
برگشت ۰
پایانهنگام نوشتن این صفحه چنین چاپ کرد:
api.github.com 443 true
وضعیت: 200
سهمیهی باقیمانده: 58
SalamLang/Salam به زبان TeX نوشته شده است
عدد سهمیه با هر فراخوانی از نشانی شما کم میشود و زبان همان است که گیتهاب در آن لحظه برای مخزن تشخیص میدهد.
مهلت، سقف و تغییر مسیر
درخواستهای کارخواه با سقفهای زیر اجرا میشوند. گزینه های درخواست سقفها را نگه میدارد و انجام درخواست درخواستی را با آنها میفرستد؛ هر کارخواه رونوشت خودش را دارد که با تنظیم مهلت، تنظیم مهلت بیکاری، تنظیم سقف تغییر مسیر و تنظیم سقف بدنه عوض میشود. idle_ms (پیشفرض ۳۰ ثانیه) مدتی است که یک خواندن یا نوشتن میتواند بیحرکت بماند، timeout_ms (پیشفرض خاموش) زمان کل درخواست با تغییر مسیرهاست و max_body (پیشفرض ۲۵۶ مگابایت) بدنه را حتی پس از باز شدن gzip محدود میکند، پس پاسخ فشردهی کوچک نمیتواند حافظه را پر کند. پیدا کردن نشانی یک نام میزبان را حلکنندهی سیستم انجام میدهد و در سیستمهایی جز لینوکس خودِ اتصال هم مهلت پیشفرض سیستم را دارد؛ این سقفها هیچکدام را شامل نمیشوند. درخواستی که زمانش تمام شود the request timed out گزارش میدهد و پاسخی که با بسته شدن اتصال ناقص بماند خطاست، نه بدنهی کوچکتر.
تغییر مسیر فقط وقتی دنبال میشود که max_redirects بالای صفر باشد. ۳۰۱ یا ۳۰۲ پس از POST و هر ۳۰۳ به GET بدون بدنه تبدیل میشوند؛ ۳۰۷ و ۳۰۸ درخواست را همانطور که بود تکرار میکنند. وقتی تغییر مسیر به میزبان دیگری برود سرآیندهای Authorization و Cookie کنار گذاشته میشوند و تغییر مسیر از https به http رد میشود. نشانی نهایی در فیلد url پاسخ است.
درخواست پیش از فرستادن بررسی میشود: روش، نام سرآیند یا نشانیای که فاصله یا نویسهی کنترلی دارد، و مقدار سرآیندی که شکست سطر دارد، با پیامی در err رد میشود، پس مقداری که از بیرون میآید نمیتواند سرآیند به درخواست اضافه کند. سرآیندهای Content-Length، Transfer-Encoding، Connection و Accept-Encoding شما را همانهایی که کارخواه حساب میکند جایگزین میکند. نمونه به سروری که دیر جواب میدهد و سروری که هرگز جواب نمیدهد درخواست میفرستد، یک تغییر مسیر را دنبال میکند و پاسخ بیش از اندازه بزرگ را رد میکند.
واردسازی شبکه.اچ تی تی پی
واردسازی شبکه.تی سی پی
واردسازی همگام سازی
ناپایا سرور := تی سی پی.سرور {}
تابع پشتیبان():
تکرار ۶:
اتصال := تی سی پی.پذیرش(سرور)
درخواست := تی سی پی.خواندن(اتصال، ۴۰۹۶)
اگر درخواست.بیاب("GET /old ") برابر ۰:
_ := تی سی پی.نوشتن(اتصال، "HTTP/1.1 302 Found\r\nLocation: /new\r\nContent-Length: 0\r\nConnection: close\r\n\r\n")
وگرنه درخواست.بیاب("GET /silent ") برابر ۰:
همگام سازی.خواب میلی ثانیه(۷۰۰)
وگرنه درخواست.بیاب("GET /big ") برابر ۰:
تی سی پی.نوشتن اچ تی تی پی(اتصال، "200 OK"، "text/plain"، "0123456789")
وگرنه:
تی سی پی.نوشتن اچ تی تی پی(اتصال، "200 OK"، "text/plain"، "landed")
پایان
تی سی پی.بستن(اتصال)
پایان
پایان
تابع ریشه:
سرور = تی سی پی.پیوند(۰)
نخ := نخساز(پشتیبان)
پایه := "http://127.0.0.1:" + تی سی پی.درگاه(سرور)
ناپایا کارخواه := اچ تی تی پی.کارخواه جدید()
کارخواه.تنظیم سقف تغییر مسیر(۳)
کارخواه.تنظیم مهلت(۵۰۰۰)
کارخواه.تنظیم مهلت بیکاری(۲۰۰۰)
کارخواه.تنظیم سقف بدنه(۱۰۰۰)
پاسخ := کارخواه.دریافت(پایه + "/old")
سرچاپ پاسخ.وضعیت، اچ تی تی پی.بدنه(پاسخ)، پاسخ.نشانی.بیاب("/new") بزرگتر ۰
ناپایا تنگ := اچ تی تی پی.گزینه های درخواست {}
تنگ.حداکثربدنه = ۵
بزرگ := اچ تی تی پی.انجام درخواست("GET"، پایه + "/big"، اچ تی تی پی.سرصفحه جدید()، ""، تنگ)
سرچاپ بزرگ.وضعیت، بزرگ.خطا
ناپایا سریع := اچ تی تی پی.گزینه های درخواست {}
سریع.میلیثانیهزمانانتظار = ۲۰۰
ساکت := اچ تی تی پی.انجام درخواست("GET"، پایه + "/silent"، اچ تی تی پی.سرصفحه جدید()، ""، سریع)
سرچاپ ساکت.وضعیت، ساکت.خطا
خام := کارخواه.درخواست بایتی("GET"، پایه + "/big"، ""، "")
سرچاپ خام.وضعیت، خام.بدنه.طول
سرچاپ کارخواه.درخواست خام("GET"، پایه + "/new"، "X-Id: 1\r\n"، "").وضعیت
کارخواه.آزادسازی()
نخپیوند(نخ)
تی سی پی.بستن سرور(سرور)
پایانکدام تابع برای کدام کار
| کار | تابع |
|---|---|
| خواندن پارامتر مسیر، مقدار پرسمان یا فیلد فرم | پارامتر زمینه، پرسمان زمینه، فرم زمینه |
| خواندن بدنهی خام یا سرآیند درخواست | بدنه زمینه، سرصفحه زمینه |
| پاسخ متنی، جیسون یا HTML | متن زمینه، جیسون زمینه، اچ تی ام ال زمینه |
| تعیین وضعیت یا افزودن سرآیند | وضعیت زمینه، تنظیم سرصفحه زمینه |
| فرستادن مرورگر به جای دیگر | تغییرمسیر زمینه |
| نگه داشتن درخواست در یک ساختار به جای شناسهی خالی | زمینه جدید، سپس همان پارامتر و جیسون و بقیه |
| درخواست با مهلت، سقف اندازه یا تغییر مسیر | انجام درخواست با گزینه های درخواست، یا تنظیم مهلت و تنظیم سقف تغییر مسیر روی یک کارخواه |
| یک درخواست از برنامه | دریافت، ارسال، دریافت با، ارسال با، درخواست |
| چند درخواست با کوکی مشترک | کارخواه جدید |
| درخواست با سرآیندهایی که خودتان مینویسید، یا بدنهی دودویی | تجزیه نقطه پایانی، ارسال خام، ارسال خام با مهلت، ارسال خام با پیکربندی امن |
| خواندن بایتهای پاسخ خام | data و len از پاسخ خام، متن پاسخ خام، و بعد آزادسازی پاسخ خام |
| بررسی پاسخ | موفق برای وضعیت 2xx، وضعیت برای کد (صفر وقتی پاسخی نیامد)، خطا برای دلیل |
مقداری که از درخواست میخوانید، مثل پارامتر زمینه یا فرم زمینه، مال همان درخواست است و وقتی گرداننده برمیگردد آزاد میشود. برای نگه داشتن طولانیتر، در یک فهرست سراسری یا در نشست، رونوشتی با رشته.رونوشت یا رشتهی تازهای که با + ساخته شده ذخیره کنید.
گونهها
نقطه پایانی Endpoint
ساختار نقطه پایانی| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| میزبان | host | رشته = "" | میزبان. |
| درگاه | port | صحیح = 443 | درگاه: همان که در نشانی آمده، وگرنه ۸۰ برای http و ۴۴۳ برای https. |
| امن | secure | منطقی = درست | با TLS وصل شود. |
| موفق | ok | منطقی = نادرست | نشانی درست خوانده شد؛ برای هر چیزی که با http:// یا https:// شروع نشود نادرست است. |
واردسازی تی ال اس
واردسازی شبکه.اچ تی تی پی
واردسازی شبکه.تی سی پی
ناپایا سرور := تی سی پی.سرور {}
تابع پاسخگو():
تکرار ۳:
ا := تی سی پی.پذیرش(سرور)
_ := تی سی پی.خواندن(ا، ۴۰۹۶)
تی سی پی.نوشتن اچ تی تی پی(ا، "200 OK"، "text/plain"، "سلام از سرور")
تی سی پی.بستن(ا)
پایان
پایان
تابع ریشه:
ن := اچ تی تی پی.تجزیه نقطه پایانی("https://api.example.com:8443")
سرچاپ ن.موفق، ن.میزبان، ن.درگاه، ن.امن
سرور = تی سی پی.پیوند(۰)
ک := نخساز(پاسخگو)
محلی := اچ تی تی پی.تجزیه نقطه پایانی("http://127.0.0.1:" + تی سی پی.درگاه(سرور))
سر := "GET / HTTP/1.1\r\nHost: 127.0.0.1\r\nConnection: close\r\n\r\n"
ناپایا پ := اچ تی تی پی.ارسال خام(محلی، سر، پوچ، ۰)
سرچاپ پ.موفق، پ.وضعیت، اچ تی تی پی.متن پاسخ خام(پ)، "[" + پ.خطا + "]"
سرچاپ اچ تی تی پی.مقدار سرصفحه(پ.سرصفحه، "content-type")
اچ تی تی پی.آزادسازی پاسخ خام(پ)
ناپایا خ := اچ تی تی پی.ارسال خام با مهلت(محلی، سر، پوچ، ۰، ۲۰۰۰)
سرچاپ خ.موفق، خ.وضعیت، خ.اندازه، اچ تی تی پی.متن پاسخ خام(خ)
اچ تی تی پی.آزادسازی پاسخ خام(خ)
ناپایا پیکربندی := تی ال اس.پیکربندی جدید("127.0.0.1")
پیکربندی.پرونده گواهی ریشه = "/etc/ssl/certs/ca-certificates.crt"
ناپایا امن := اچ تی تی پی.ارسال خام با پیکربندی امن(محلی، سر، پوچ، ۰، ۲۰۰۰، پیکربندی)
سرچاپ امن.وضعیت، امن.اندازه
اچ تی تی پی.آزادسازی پاسخ خام(امن)
نخپیوند(ک)
تی سی پی.بستن سرور(سرور)
سرچاپ اچ تی تی پی.سقف پاسخ خام() > ۰
اچ تی تی پی.تنظیم سقف پاسخ خام(۱۰۲۴ * ۱۰۲۴)
سرچاپ اچ تی تی پی.سقف پاسخ خام()
پایانزمینه Context
ساختار زمینه| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| دسته | h | صحیح۶۴ | شناسهی زمینه. |
واردسازی شبکه.اچ تی تی پی
واردسازی شبکه.مسیریاب
تابع سلام(ه: صحیح۶۴):
ز := اچ تی تی پی.زمینه جدید(ه)
نام := اچ تی تی پی.پرسمان(ز، "name")
اگر اچ تی تی پی.کوکی دارد(ز، "seen"):
اچ تی تی پی.متن(ز، "دوباره سلام " + نام + " (" + اچ تی تی پی.مقدار کوکی(ز، "seen") + ")")
وگرنه:
اچ تی تی پی.تنظیم کوکی(ز، اچ تی تی پی.کوکی با انقضا("seen"، "1"، ۳۶۰۰))
اچ تی تی پی.متن(ز، "سلام " + نام + " (" + اچ تی تی پی.پرسمان خام(ز) + ")")
پایان
پایان
تابع کتاب(ه: صحیح۶۴):
ز := اچ تی تی پی.زمینه جدید(ه)
اچ تی تی پی.تنظیم سرصفحه(ز، "X-Method"، اچ تی تی پی.روش(ز))
اچ تی تی پی.تنظیم وضعیت(ز، ۲۰۲)
اچ تی تی پی.جیسون(ز، `{"id": "` + اچ تی تی پی.پارامتر(ز، "id") + `", "path": "` + اچ تی تی پی.مسیر(ز) + `"}`)
پایان
تابع فرم(ه: صحیح۶۴):
ز := اچ تی تی پی.زمینه جدید(ه)
اچ تی تی پی.متن(ز، اچ تی تی پی.فرم(ز، "a") + "|" + اچ تی تی پی.بدنه(ز) + "|" + اچ تی تی پی.سرصفحه(ز، "Content-Type"))
پایان
تابع خروج(ه: صحیح۶۴):
ز := اچ تی تی پی.زمینه جدید(ه)
اچ تی تی پی.پاک کردن کوکی(ز، "seen")
اچ تی تی پی.تغییرمسیر(ز، "/hello")
پایان
تابع صفحه(ه: صحیح۶۴):
ز := اچ تی تی پی.زمینه جدید(ه)
ک := اچ تی تی پی.کوکی ها(ز)
اچ تی تی پی.اچ تی ام ال(ز، "<p>" + ک.اندازه() + "</p>")
پایان
تابع ریشه:
ناپایا م := مسیریاب.مسیریاب جدید()
مسیریاب.دریافت(م، "/hello"، سلام)
مسیریاب.دریافت(م، "/books/:id"، کتاب)
مسیریاب.ارسال(م، "/form"، فرم)
مسیریاب.دریافت(م، "/logout"، خروج)
مسیریاب.دریافت(م، "/page"، صفحه)
ناپایا س := اچ تی تی پی.سرور جدید(۱۹۶۰۲)
اچ تی تی پی.استفاده(س، م)
_ := اچ تی تی پی.اجرا در پس زمینه(س)
پایه := "http://127.0.0.1:19602"
ناپایا ک := اچ تی تی پی.کارخواه جدید()
سرچاپ اچ تی تی پی.بدنه(ک.دریافت(پایه + "/hello?name=%D9%85%D8%B1%DB%8C%D9%85"))
سرچاپ اچ تی تی پی.بدنه(ک.دریافت(پایه + "/hello?name=%D9%85%D8%B1%DB%8C%D9%85"))
سرچاپ اچ تی تی پی.بدنه(ک.دریافت(پایه + "/page"))
پ := ک.دریافت(پایه + "/books/7")
سرچاپ اچ تی تی پی.وضعیت(پ)، اچ تی تی پی.بدنه(پ)، اچ تی تی پی.دریافت سرصفحه(پ، "x-method")
ک.تنظیم سرصفحه("Content-Type"، "application/x-www-form-urlencoded")
سرچاپ اچ تی تی پی.بدنه(ک.ارسال(پایه + "/form"، "a=1&b=2"))
پ۲ := ک.دریافت(پایه + "/logout")
سرچاپ اچ تی تی پی.وضعیت(پ۲)، اچ تی تی پی.خطوط کوکی(پ۲).طول() > ۰
پایانسرور Server
ساختار سرور| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| درگاه | port | صحیح = 0 | درگاه. |
| میزبان | host | رشته = "0.0.0.0" | نشانی گوش دادن؛ پیشفرض 0.0.0.0 یعنی همهی نشانیها. |
| مسیریاب | router | router.Router | مسیریاب درخواستها. |
| پنهانسازیتوکن | hide_tokens | منطقی = نادرست | نسخهی سرور در پاسخها پنهان شود. |
| گزارشدسترسی | access_log | منطقی = نادرست | هر درخواست در خروجی ثبت شود. |
واردسازی شبکه.اچ تی تی پی
واردسازی شبکه.مسیریاب
واردسازی شبکه.تی سی پی
تابع سلام(ه: صحیح۶۴):
ز := اچ تی تی پی.زمینه جدید(ه)
ا := اچ تی تی پی.اتصال مربوط به(ز)
اچ تی تی پی.متن(ز، "سلام " + تی سی پی.اتصال معتبر(ا))
پایان
تابع ریشه:
اچ تی تی پی.تنظیم بیکاری زنده نگه داشتن(۵۰۰۰)
اچ تی تی پی.بیشینه درخواست زنده نگه داشتن(۱۰۰)
اچ تی تی پی.بیشینه بایت سرایند(۱۶۳۸۴)
اچ تی تی پی.بیشینه بایت بدنه(۱۰۴۸۵۷۶)
ناپایا م := مسیریاب.مسیریاب جدید()
مسیریاب.دریافت(م، "/"، سلام)
ناپایا س := اچ تی تی پی.سرور جدید(۸۰۸۰)
اچ تی تی پی.تنظیم میزبان(س، "0.0.0.0")
اچ تی تی پی.پنهان سازی توکن(س)
اچ تی تی پی.فعال سازی گزارش دسترسی(س)
اچ تی تی پی.استفاده(س، م)
سرچاپ اچ تی تی پی.نسخه سرور، اچ تی تی پی.لبه است()
اگر وارونه اچ تی تی پی.لبه است():
اچ تی تی پی.اجرای امن(س، "cert.pem"، "key.pem")
پایان
اچ تی تی پی.اجرا(س)
پایانپاسخ خام RawResponse
ساختار پاسخ خام| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| وضعیت | status | صحیح = 0 | کد وضعیت. |
| سرصفحه | head | رشته = "" | سرآیندها. |
| داده | data | تهی* | نشانی بدنه. |
| اندازه | len | صحیح = 0 | طول بدنه به بایت، پس از باز کردن chunked. |
| موفق | ok | منطقی = نادرست | وضعیت 2xx است. |
| خطا | error | رشته = "" | پیام خطا، مثل the request timed out یا the response body was cut short. |
نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-SendRaw.salam
کوکی Cookie
ساختار کوکی| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| نام | name | رشته = "" | نام. |
| مقدار | value | رشته = "" | مقدار. |
| مسیر | path | رشته = "/" | مسیری که کوکی برایش فرستاده میشود؛ پیشفرض /. |
| دامنه | domain | رشته = "" | دامنه؛ خالی یعنی همین میزبان. |
| حداکثرعمر | max_age | صحیح = 0 | عمر بر حسب ثانیه. |
| دارایحداکثرعمر | has_max_age | منطقی = نادرست | عمر تعیین شده؛ بدون آن کوکی با بستن مرورگر پاک میشود. |
| امن | secure | منطقی = نادرست | فقط روی HTTPS فرستاده شود. |
| فقطاچتیتیپی | http_only | منطقی = درست | جاوااسکریپت صفحه به آن دسترسی نداشته باشد؛ پیشفرض درست. |
| سایتیکسان | same_site | رشته = "Lax" | سیاست SameSite؛ پیشفرض Lax. |
واردسازی شبکه.اچ تی تی پی
تابع ریشه:
ک := اچ تی تی پی.کوکی جدید("theme"، "dark")
سرچاپ ک.نام، ک.مقدار، ک.مسیر، ک.فقطاچتیتیپی، ک.سایتیکسان، ک.دارایحداکثرعمر
ناپایا ا := اچ تی تی پی.کوکی با انقضا("sid"، "x1"، ۳۶۰۰)
ا.امن = درست
ا.دامنه = "salamlang.ir"
سرچاپ ا.حداکثرعمر، ا.دارایحداکثرعمر، ا.امن، ا.دامنه
م := اچ تی تی پی.کوکی منقضی شده("sid"، "/"، "salamlang.ir")
سرچاپ م.حداکثرعمر، م.دارایحداکثرعمر
سرچاپ اچ تی تی پی.رمزگشایی نشانی("a%20b+c")
پایانپاسخ Response
ساختار پاسخ| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| وضعیت | status | صحیح = 0 | کد وضعیت. |
| بدنه | body | رشته = "" | بدنه. |
| سرصفحه | head | رشته = "" | سرآیندهای خام. |
| خطا | err | رشته = "" | پیام خطا، اگر درخواست نرسید یا بهخاطر یک سقف رد شد؛ اگر چیزی برنگشته باشد وضعیت صفر است. |
| نشانی | url | رشته = "" | نشانی آخرین درخواست، پس از تغییر مسیرها. |
واردسازی شبکه.اچ تی تی پی
واردسازی شبکه.مسیریاب
تابع پژواک(ز: صحیح۶۴):
اچ تی تی پی.تنظیم سرصفحه(ز، "X-Tag"، "a")
اچ تی تی پی.تنظیم کوکی(ز، اچ تی تی پی.کوکی جدید("sid"، "abc"))
اچ تی تی پی.متن(ز، اچ تی تی پی.روش(ز) + " " + اچ تی تی پی.سرصفحه(ز، "X-Token") + " " + اچ تی تی پی.بدنه(ز))
پایان
تابع کوکیها(ز: صحیح۶۴):
ه := اچ تی تی پی.کوکی ها(ز)
اچ تی تی پی.متن(ز، "" + ه.اندازه() + " " + اچ تی تی پی.مقدار کوکی(ز، "lang") + " " + اچ تی تی پی.کوکی دارد(ز، "sid"))
اچ تی تی پی.پاک کردن کوکی(ز، "old")
اچ تی تی پی.پاک کردن کوکی در مسیر(ز، "scoped"، "/admin"، "")
پایان
تابع ریشه:
ناپایا م := مسیریاب.مسیریاب جدید()
هر روش در ["GET"، "POST"، "PUT"، "DELETE"، "PATCH"، "OPTIONS"، "HEAD"]:
مسیریاب.روش(م، روش، "/echo"، پژواک)
پایان
مسیریاب.دریافت(م، "/cookies"، کوکیها)
ناپایا س := اچ تی تی پی.سرور جدید(۱۹۶۰۳)
اچ تی تی پی.استفاده(س، م)
_ := اچ تی تی پی.اجرا در پس زمینه(س)
ن := "http://127.0.0.1:19603/echo"
ناپایا سر := اچ تی تی پی.سرصفحه جدید()
سر.درج("X-Token"، "t1")
پ := اچ تی تی پی.دریافت با(ن، سر)
سرچاپ اچ تی تی پی.موفق(پ)، اچ تی تی پی.وضعیت(پ)، اچ تی تی پی.بدنه(پ)، "[" + اچ تی تی پی.خطا(پ) + "]"
سرچاپ اچ تی تی پی.سرصفحه ها(پ).دارد("X-Tag")، اچ تی تی پی.مقادیر سرصفحه(پ، "set-cookie")
سرچاپ اچ تی تی پی.نگاشت کوکی(پ).دریافت("sid")، اچ تی تی پی.سرصفحه های خام(پ).طول() > ۰، اچ تی تی پی.خام(پ).طول() > ۰
سرچاپ اچ تی تی پی.بدنه(اچ تی تی پی.ارسال(ن، "a"))، اچ تی تی پی.بدنه(اچ تی تی پی.قرار دادن با(ن، "b"، سر))
سرچاپ اچ تی تی پی.بدنه(اچ تی تی پی.حذف(ن))، اچ تی تی پی.بدنه(اچ تی تی پی.حذف با(ن، سر))
سرچاپ اچ تی تی پی.بدنه(اچ تی تی پی.وصله(ن، "c"))، اچ تی تی پی.بدنه(اچ تی تی پی.وصله با(ن، "d"، سر))
سرچاپ اچ تی تی پی.بدنه(اچ تی تی پی.گزینه ها(ن))، اچ تی تی پی.بدنه(اچ تی تی پی.گزینه ها با(ن، سر))
سرچاپ اچ تی تی پی.وضعیت(اچ تی تی پی.درخواست هد(ن))، اچ تی تی پی.وضعیت(اچ تی تی پی.سرصفحه با(ن، سر))
سرچاپ اچ تی تی پی.بدنه(اچ تی تی پی.قرار دادن(ن، "e"))، اچ تی تی پی.بدنه(اچ تی تی پی.دریافت(ن))
سرچاپ اچ تی تی پی.بدنه(اچ تی تی پی.درخواست خام("POST"، ن، "X-Token: raw\r\n"، "f"))
ناپایا پارامترها := اچ تی تی پی.سرصفحه جدید()
پارامترها.درج("q"، "سلام دنیا")
سرچاپ اچ تی تی پی.کدگذاری فرم(پارامترها)، اچ تی تی پی.با پرسمان("http://x.ir/s"، پارامترها)
ناپایا کوکی := اچ تی تی پی.سرصفحه جدید()
کوکی.درج("lang"، "fa")
کوکی.درج("sid"، "abc")
سر.درج("Cookie"، اچ تی تی پی.سرصفحه کوکی(کوکی))
پ۲ := اچ تی تی پی.دریافت با("http://127.0.0.1:19603/cookies"، سر)
سرچاپ اچ تی تی پی.بدنه(پ۲)، اچ تی تی پی.خطوط کوکی(پ۲).طول()
ناپایا ک := اچ تی تی پی.کارخواه جدید()
ک.تنظیم کوکی("lang"، "en")
سرچاپ اچ تی تی پی.بدنه(ک.دریافت("http://127.0.0.1:19603/cookies"))
ک.پاک کردن کوکی ها()
ناپایا اضافه := اچ تی تی پی.سرصفحه جدید()
اضافه.درج("X-Token"، "c1")
سرچاپ اچ تی تی پی.بدنه(ک.درخواست با("PUT"، ن، "g"، اضافه))، اچ تی تی پی.بدنه(ک.درخواست("PATCH"، ن، "h"))
سرچاپ اچ تی تی پی.بدنه(ک.قرار دادن(ن، "i"))، اچ تی تی پی.بدنه(ک.حذف(ن))، اچ تی تی پی.بدنه(ک.وصله(ن، "j"))، اچ تی تی پی.بدنه(ک.گزینه ها(ن))، اچ تی تی پی.وضعیت(ک.درخواست هد(ن))
خطا := اچ تی تی پی.دریافت("http://127.0.0.1:1/")
سرچاپ اچ تی تی پی.موفق(خطا)، اچ تی تی پی.خطا(خطا) != ""
پایانپاسخ بایتی BytesResponse
ساختار پاسخ بایتیرشته آنها را در نخستین بایت صفر میبُرد.| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| وضعیت | status | صحیح = 0 | کد وضعیت. |
| سرصفحه | head | رشته = "" | سرآیندهای خام. |
| بدنه | body | compress.ByteBuf | بدنه به شکل compress.ByteBuf؛ با compress.BufFree آزادش کنید. |
| خطا | err | رشته = "" | پیام خطا، اگر درخواست نرسید؛ آنگاه وضعیت صفر است. |
| نشانی | url | رشته = "" | نشانی آخرین درخواست، پس از تغییر مسیرها. |
نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Client.salam
گزینه های درخواست RequestOptions
ساختار گزینه های درخواستidle_ms برای یک خواندن یا نوشتنِ بیحرکت (۳۰۰۰۰)، timeout_ms برای کل درخواست (۰، بیحد)، max_body به بایت (۲۵۶ مگابایت) و max_redirects (۰).| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| میلیثانیهبیکاری | idle_ms | صحیح = 30000 | مدتی که یک خواندن یا نوشتن میتواند بیحرکت بماند، به میلیثانیه. |
| میلیثانیهزمانانتظار | timeout_ms | صحیح = 0 | زمان کل درخواست با تغییر مسیرها؛ ۰ یعنی بیحد. |
| حداکثربدنه | max_body | صحیح = 268435456 | بزرگترین بدنه به بایت، پس از باز شدن gzip. |
| حداکثرتغییرمسیر | max_redirects | صحیح = 0 | شمار تغییر مسیرهایی که دنبال میشوند؛ ۰ هیچکدام. |
واردسازی شبکه.اچ تی تی پی
واردسازی شبکه.تی سی پی
واردسازی همگام سازی
ناپایا سرور := تی سی پی.سرور {}
تابع پشتیبان():
تکرار ۶:
اتصال := تی سی پی.پذیرش(سرور)
درخواست := تی سی پی.خواندن(اتصال، ۴۰۹۶)
اگر درخواست.بیاب("GET /old ") برابر ۰:
_ := تی سی پی.نوشتن(اتصال، "HTTP/1.1 302 Found\r\nLocation: /new\r\nContent-Length: 0\r\nConnection: close\r\n\r\n")
وگرنه درخواست.بیاب("GET /silent ") برابر ۰:
همگام سازی.خواب میلی ثانیه(۷۰۰)
وگرنه درخواست.بیاب("GET /big ") برابر ۰:
تی سی پی.نوشتن اچ تی تی پی(اتصال، "200 OK"، "text/plain"، "0123456789")
وگرنه:
تی سی پی.نوشتن اچ تی تی پی(اتصال، "200 OK"، "text/plain"، "landed")
پایان
تی سی پی.بستن(اتصال)
پایان
پایان
تابع ریشه:
سرور = تی سی پی.پیوند(۰)
نخ := نخساز(پشتیبان)
پایه := "http://127.0.0.1:" + تی سی پی.درگاه(سرور)
ناپایا کارخواه := اچ تی تی پی.کارخواه جدید()
کارخواه.تنظیم سقف تغییر مسیر(۳)
کارخواه.تنظیم مهلت(۵۰۰۰)
کارخواه.تنظیم مهلت بیکاری(۲۰۰۰)
کارخواه.تنظیم سقف بدنه(۱۰۰۰)
پاسخ := کارخواه.دریافت(پایه + "/old")
سرچاپ پاسخ.وضعیت، اچ تی تی پی.بدنه(پاسخ)، پاسخ.نشانی.بیاب("/new") بزرگتر ۰
ناپایا تنگ := اچ تی تی پی.گزینه های درخواست {}
تنگ.حداکثربدنه = ۵
بزرگ := اچ تی تی پی.انجام درخواست("GET"، پایه + "/big"، اچ تی تی پی.سرصفحه جدید()، ""، تنگ)
سرچاپ بزرگ.وضعیت، بزرگ.خطا
ناپایا سریع := اچ تی تی پی.گزینه های درخواست {}
سریع.میلیثانیهزمانانتظار = ۲۰۰
ساکت := اچ تی تی پی.انجام درخواست("GET"، پایه + "/silent"، اچ تی تی پی.سرصفحه جدید()، ""، سریع)
سرچاپ ساکت.وضعیت، ساکت.خطا
خام := کارخواه.درخواست بایتی("GET"، پایه + "/big"، ""، "")
سرچاپ خام.وضعیت، خام.بدنه.طول
سرچاپ کارخواه.درخواست خام("GET"، پایه + "/new"، "X-Id: 1\r\n"، "").وضعیت
کارخواه.آزادسازی()
نخپیوند(نخ)
تی سی پی.بستن سرور(سرور)
پایانکارخواه Client
ساختار کارخواه| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| کوکیها | cookies | نگاشت<رشته، رشته> | کوکیهایی که از پاسخها گرفته؛ هر کدام فقط به میزبانی برمیگردد که آن را گذاشته. |
| سرصفحهها | headers | نگاشت<رشته، رشته> | سرآیندهایی که با هر درخواست فرستاده میشوند. |
| میزبانهایکوکی | cookie_hosts | نگاشت<رشته، رشته> | اینکه هر کوکی در cookies را کدام میزبان گذاشته. |
| امنیتکوکی | cookie_secure | نگاشت<رشته، منطقی> | کوکیهایی که با ویژگی Secure آمدهاند؛ اینها فقط روی HTTPS برگردانده میشوند و هرگز روی HTTP ساده فرستاده نمیشوند. |
| گزینهها | options | گزینه های درخواست | سقفهای این کارخواه: یک گزینه های درخواست. |
| قفل | mu | sync.Mutex | قفلی که نخها را قادر میکند کارخواهِ ساختهشده با کارخواه جدید را به اشتراک بگذارند. |
نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Context.salam
تنظیم سرصفحه SetHeader
تابع تنظیم سرصفحه(name: رشته، value: رشته)نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Context.salam
تنظیم کوکی SetCookie
تابع تنظیم کوکی(name: رشته، value: رشته)نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Client.salam
پاک کردن کوکی ها ClearCookies
تابع پاک کردن کوکی ها()نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Client.salam
تنظیم مهلت SetTimeout
تابع تنظیم مهلت(total_ms: صحیح)نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Do.salam
تنظیم مهلت بیکاری SetIdleTimeout
تابع تنظیم مهلت بیکاری(idle_ms: صحیح)نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Do.salam
تنظیم سقف تغییر مسیر SetMaxRedirects
تابع تنظیم سقف تغییر مسیر(n: صحیح)نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Do.salam
تنظیم سقف بدنه SetMaxBody
تابع تنظیم سقف بدنه(bytes: صحیح)نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Do.salam
آزادسازی Free
تابع آزادسازی()نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Do.salam
درخواست Request
تابع درخواست(method: رشته، url: رشته، body: رشته): پاسخنمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Client.salam
درخواست خام RequestRaw
تابع درخواست خام(method: رشته، url: رشته، header_block: رشته، body: رشته): پاسخنمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Do.salam
درخواست بایتی RequestBytes
تابع درخواست بایتی(method: رشته، url: رشته، header_block: رشته، body: رشته): پاسخ بایتیRequestRaw، ولی بدنه را به شکل بایت نگه میدارد (یک پاسخ بایتی).نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Do.salam
درخواست با RequestWith
تابع درخواست با(method: رشته، url: رشته، body: رشته، extra: نگاشت<رشته، رشته>): پاسخنمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Client.salam
دریافت Get
تابع دریافت(url: رشته): پاسخنمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Context.salam
ارسال Post
تابع ارسال(url: رشته، body: رشته): پاسخنمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Context.salam
قرار دادن Put
تابع قرار دادن(url: رشته، body: رشته): پاسخنمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Client.salam
حذف Delete
تابع حذف(url: رشته): پاسخنمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Client.salam
وصله Patch
تابع وصله(url: رشته، body: رشته): پاسخنمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Client.salam
گزینه ها Options
تابع گزینه ها(url: رشته): پاسخنمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Client.salam
درخواست هد Head
تابع درخواست هد(url: رشته): پاسخنمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Client.salam
پایاها و متغیرها
نسخه سرور SERVER_VERSION
پایا نسخه سرور: رشته = "0.6.0"Server پاسخها فرستاده میشود.نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Server.salam
تابعها
رمزگشایی نشانی UrlDecode
تابع رمزگشایی نشانی(s: رشته): رشته+ را فاصله میکند.نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Cookie.salam
تجزیه نقطه پایانی ParseEndpoint
تابع تجزیه نقطه پایانی(endpoint: رشته): نقطه پایانیhttps://api.example.com:8443 را میخواند؛ درگاه پیشفرض برای http ۸۰ و برای https ۴۴۳ است. مسیر پس از میزبان نادیده گرفته میشود.نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-SendRaw.salam
مقدار سرصفحه HeaderValue
تابع مقدار سرصفحه(head: رشته، name: رشته): رشتهنمونهی این مورد همراه با موارد بالاتر آمده است: net-http-SendRaw.salam
میزبان Host
تابع میزبان(e: نقطه پایانی): رشتهEndpoint: برای https://api.example.com:8443/v1 همان api.example.com.واردسازی شبکه.اچ تی تی پی
تابع ریشه:
ن := اچ تی تی پی.تجزیه نقطه پایانی("https://api.example.com:8443/v1/users")
سرچاپ اچ تی تی پی.نقطه پایانی موفق(ن)، اچ تی تی پی.میزبان(ن)، اچ تی تی پی.درگاه(ن)، اچ تی تی پی.امن(ن)
ساده := اچ تی تی پی.تجزیه نقطه پایانی("http://example.com")
سرچاپ اچ تی تی پی.نقطه پایانی موفق(ساده)، اچ تی تی پی.میزبان(ساده)، اچ تی تی پی.درگاه(ساده)، اچ تی تی پی.امن(ساده)
سرچاپ اچ تی تی پی.نقطه پایانی موفق(اچ تی تی پی.تجزیه نقطه پایانی("ftp://example.com"))
پایاندرگاه Port
تابع درگاه(e: نقطه پایانی): صحیحEndpoint: همان که در نشانی آمده، وگرنه ۸۰ برای http و ۴۴۳ برای https.نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-EndpointInfo.salam
امن Secure
تابع امن(e: نقطه پایانی): منطقیEndpoint با TLS وصل میشود: برای https:// درست و برای http:// نادرست.نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-EndpointInfo.salam
نقطه پایانی موفق EndpointOk
تابع نقطه پایانی موفق(e: نقطه پایانی): منطقیParseEndpoint نشانی را خوانده است؛ برای هر چیزی که با http:// یا https:// شروع نشود نادرست است.نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-EndpointInfo.salam
تنظیم بیکاری زنده نگه داشتن SetKeepAliveIdle
تابع تنظیم بیکاری زنده نگه داشتن(millis: صحیح)نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Server.salam
بیشینه بایت سرایند SetMaxHeaderBytes
تابع بیشینه بایت سرایند(n: صحیح)نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Server.salam
بیشینه بایت بدنه SetMaxBodyBytes
تابع بیشینه بایت بدنه(n: صحیح)نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Server.salam
بیشینه درخواست زنده نگه داشتن SetKeepAliveMaxRequests
تابع بیشینه درخواست زنده نگه داشتن(n: صحیح)نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Server.salam
ارسال پرونده File
تابع ارسال پرونده(h: صحیح۶۴، path: رشته، content_type: رشته): منطقیfalse برمیگرداند و چیزی تغییر نمیکند.واردسازی ورودی خروجی
واردسازی سیستم عامل
واردسازی شبکه.اچ تی تی پی
واردسازی شبکه.مسیریاب
تابع صفحه(ز: صحیح۶۴):
پ := سیستم عامل.پوشه موقت() + "/salam_filebody_fa.txt"
اگر اچ تی تی پی.ارسال پرونده(ز، پ، "text/plain"):
اچ تی تی پی.تنظیم سرصفحه(ز، "X-Port"، اچ تی تی پی.مالکیت(ز، "" + اچ تی تی پی.درگاه محلی(ز)))
اچ تی تی پی.تنظیم سرصفحه(ز، "X-Status"، اچ تی تی پی.مالکیت(ز، "" + اچ تی تی پی.وضعیت(ز)))
وگرنه:
اچ تی تی پی.تنظیم وضعیت(ز، ۴۰۴)
اچ تی تی پی.متن(ز، "پرونده نیست")
پایان
پایان
تابع قطعه(ز: صحیح۶۴):
پ := سیستم عامل.پوشه موقت() + "/salam_filebody_fa.txt"
اگر اچ تی تی پی.ارسال بخشی از پرونده(ز، پ، "text/plain"، ۰، ۸):
اچ تی تی پی.تنظیم وضعیت(ز، ۲۰۶)
وگرنه:
اچ تی تی پی.تنظیم وضعیت(ز، ۴۱۶)
اچ تی تی پی.متن(ز، "بازهی نادرست")
پایان
پایان
تابع ریشه:
پ := سیستم عامل.پوشه موقت() + "/salam_filebody_fa.txt"
ورودی خروجی.نوشتن پرونده(پ، "سلام از پرونده")
ناپایا اندازه := ۰ برگردان صحیح۶۴
ناپایا زمانتغییر := ۰ برگردان صحیح۶۴
سرچاپ اچ تی تی پی.وضعیت پرونده(پ، اندازه، زمانتغییر)، اندازه
ناپایا م := مسیریاب.مسیریاب جدید()
مسیریاب.دریافت(م، "/file"، صفحه)
مسیریاب.دریافت(م، "/part"، قطعه)
ناپایا س := اچ تی تی پی.سرور جدید(۱۹۶۲۴)
اچ تی تی پی.استفاده(س، م)
سرچاپ اچ تی تی پی.اجرا در پس زمینه(س)
الف := اچ تی تی پی.دریافت("http://127.0.0.1:19624/file")
سرچاپ اچ تی تی پی.وضعیت(الف)، اچ تی تی پی.بدنه(الف)
سرچاپ اچ تی تی پی.دریافت سرصفحه(الف، "x-port")، اچ تی تی پی.دریافت سرصفحه(الف، "x-status")، اچ تی تی پی.دریافت سرصفحه(الف، "content-type")
ب := اچ تی تی پی.دریافت("http://127.0.0.1:19624/part")
سرچاپ اچ تی تی پی.وضعیت(ب)، اچ تی تی پی.بدنه(ب)
سیستم عامل.حذف(پ)
پایاندرگاه محلی LocalPort
تابع درگاه محلی(h: صحیح۶۴): صحیحنمونهی این مورد همراه با موارد بالاتر آمده است: net-http-FileBody.salam
وضعیت Status
تابع وضعیت(h: صحیح۶۴): صحیحواردسازی شبکه.اچ تی تی پی
واردسازی شبکه.مسیریاب
تابع خانه(ز: صحیح۶۴):
اچ تی تی پی.متن(ز، "سلام از سرور")
پایان
تابع کتاب(ز: صحیح۶۴):
شناسه := اچ تی تی پی.پارامتر(ز، "id")
قالب := اچ تی تی پی.پرسمان(ز، "format")
اچ تی تی پی.تنظیم سرصفحه(ز، "X-Book"، شناسه)
اچ تی تی پی.جیسون(ز، `{"id": "` + شناسه + `", "format": "` + قالب + `", "raw": "` + اچ تی تی پی.پرسمان خام(ز) + `"}`)
پایان
تابع ساختن(ز: صحیح۶۴):
نام := اچ تی تی پی.فرم(ز، "name")
اچ تی تی پی.تنظیم وضعیت(ز، ۲۰۱)
اچ تی تی پی.متن(ز، اچ تی تی پی.روش(ز) + " " + اچ تی تی پی.مسیر(ز) + " " + نام + " " + اچ تی تی پی.سرصفحه(ز، "X-Client"))
پایان
تابع خام(ز: صحیح۶۴):
پاسخ := اچ تی تی پی.مالکیت(ز، "بدنه: " + اچ تی تی پی.بدنه(ز))
اچ تی تی پی.متن(ز، پاسخ)
پایان
تابع صفحه(ز: صحیح۶۴):
اچ تی تی پی.اچ تی ام ال(ز، "<h1>سلام</h1>")
پایان
تابع قدیمی(ز: صحیح۶۴):
اچ تی تی پی.تغییرمسیر(ز، "/")
پایان
تابع ریشه:
ناپایا م := مسیریاب.مسیریاب جدید()
مسیریاب.دریافت(م، "/"، خانه)
مسیریاب.دریافت(م، "/books/:id"، کتاب)
مسیریاب.ارسال(م، "/books"، ساختن)
مسیریاب.قراردادن(م، "/raw"، خام)
مسیریاب.دریافت(م، "/page"، صفحه)
مسیریاب.دریافت(م، "/old"، قدیمی)
ناپایا س := اچ تی تی پی.سرور جدید(۱۹۶۰۱)
اچ تی تی پی.استفاده(س، م)
سرچاپ اچ تی تی پی.اجرا در پس زمینه(س)
پایه := "http://127.0.0.1:19601"
پ := اچ تی تی پی.دریافت(پایه + "/")
سرچاپ اچ تی تی پی.وضعیت(پ)، اچ تی تی پی.بدنه(پ)
پ۲ := اچ تی تی پی.دریافت(پایه + "/books/42?format=pdf")
سرچاپ اچ تی تی پی.بدنه(پ۲)، اچ تی تی پی.دریافت سرصفحه(پ۲، "x-book")
ناپایا سر := اچ تی تی پی.سرصفحه جدید()
سر.درج("Content-Type"، "application/x-www-form-urlencoded")
سر.درج("X-Client"، "salam")
پ۳ := اچ تی تی پی.ارسال با(پایه + "/books"، "name=%D8%B3%D9%84%D8%A7%D9%85"، سر)
سرچاپ اچ تی تی پی.وضعیت(پ۳)، اچ تی تی پی.بدنه(پ۳)
سرچاپ اچ تی تی پی.بدنه(اچ تی تی پی.قرار دادن(پایه + "/raw"، "داده"))
پ۴ := اچ تی تی پی.دریافت(پایه + "/page")
سرچاپ اچ تی تی پی.دریافت سرصفحه(پ۴، "content-type")، اچ تی تی پی.بدنه(پ۴)
پ۵ := اچ تی تی پی.درخواست("GET"، پایه + "/old"، اچ تی تی پی.سرصفحه جدید()، "")
سرچاپ اچ تی تی پی.وضعیت(پ۵)، اچ تی تی پی.دریافت سرصفحه(پ۵، "location")
سرچاپ اچ تی تی پی.وضعیت(اچ تی تی پی.دریافت(پایه + "/nope"))
پایانارسال بخشی از پرونده FileRange
تابع ارسال بخشی از پرونده(h: صحیح۶۴، path: رشته، content_type: رشته، offset: صحیح، length: صحیح): منطقیFile اما فقط length بایت را از offset به بعد میفرستد، برای پاسخ به درخواست Range؛ وضعیت ۲۰۶ و سرآیند Content-Range را فراخوان میگذارد. اگر آن بخش درون پرونده نباشد false برمیگرداند.نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-FileBody.salam
وضعیت پرونده FileStat
تابع وضعیت پرونده(path: رشته، size &: صحیح۶۴، mtime &: صحیح۶۴): منطقیfalse برمیگرداند. بیرون از لینوکس روی x64 و arm64 زمان ۰ است.نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-FileBody.salam
زمینه جدید Ctx
تابع زمینه جدید(h: صحیح۶۴): زمینهزمینه تبدیل میکند. هر تابع این صفحه هر دو را میپذیرد، پس انتخاب سلیقهای است: یک ساختار که آن را دست به دست میکنید و فیلدهایش را میخوانید، یا شناسهی خالی.نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Context.salam
روش Method
تابع روش(ctx: زمینه): رشتهنمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Handle.salam
مسیر Path
تابع مسیر(ctx: زمینه): رشتهنمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Handle.salam
بدنه Body
تابع بدنه(ctx: زمینه): رشتهنمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Handle.salam
طول بدنه BodyLen
تابع طول بدنه(ctx: زمینه): صحیحبایتهای بدنه به کار میرود.واردسازی حافظه
واردسازی رشته
واردسازی فشرده سازی
واردسازی شبکه.اچ تی تی پی
واردسازی شبکه.مایم
واردسازی شبکه.مسیریاب
تابع پژواک(ز: صحیح۶۴):
اندازه := اچ تی تی پی.طول بدنه(ز)
داده := اچ تی تی پی.بایتهای بدنه(ز) برگردان طبیعی۸*
ناپایا صفرها := ۰
تکرار اندازه در ی:
اگر داده[ی] برابر ۰ برگردان طبیعی۸: صفرها += ۱ پایان
پایان
اچ تی تی پی.تنظیم سرصفحه(ز، "X-Zeros"، اچ تی تی پی.مالکیت(ز، رشته.از عدد(صفرها برگردان صحیح۶۴)))
اچ تی تی پی.بایتها(ز، "application/octet-stream"، اچ تی تی پی.بایتهای بدنه(ز)، اندازه)
پایان
تابع بارگذاری(ز: صحیح۶۴):
ناپایا قطعهها := اچ تی تی پی.چندبخشی(ز)
دیرکن مایم.آزادسازی چندبخشی(قطعهها)
اگر قطعهها.اقلام.طول() برابر ۰:
اچ تی تی پی.تنظیم وضعیت(ز، ۴۰۰)
اچ تی تی پی.متن(ز، "چندبخشی نیست")
برگشت
پایان
ناپایا پاسخ := ""
هر قطعه در قطعهها.اقلام:
پاسخ = پاسخ + قطعه.نام + ":" + قطعه.نام پرونده + ":" + رشته.از عدد(قطعه.بدنه.طول برگردان صحیح۶۴) + " "
پایان
پاسخ = پاسخ + "note=" + مایم.مقدار بخش(قطعهها، "note")
اچ تی تی پی.متن(ز، اچ تی تی پی.مالکیت(ز، پاسخ))
پایان
تابع ریشه:
ناپایا م := مسیریاب.مسیریاب جدید()
مسیریاب.ارسال(م، "/echo"، پژواک)
مسیریاب.ارسال(م، "/upload"، بارگذاری)
ناپایا سرور := اچ تی تی پی.سرور جدید(۱۹۶۱۵)
اچ تی تی پی.استفاده(سرور، م)
سرچاپ اچ تی تی پی.اجرا در پس زمینه(سرور)
نشانی := اچ تی تی پی.تجزیه نقطه پایانی("http://127.0.0.1:19615")
داده := حافظه.تخصیص(۴ برگردان طبیعی۶۴)
بایتها := داده برگردان طبیعی۸*
بایتها[۰] = ۸۳ برگردان طبیعی۸
بایتها[۱] = ۰ برگردان طبیعی۸
بایتها[۲] = ۲۵۵ برگردان طبیعی۸
بایتها[۳] = ۰ برگردان طبیعی۸
سر := "POST /echo HTTP/1.1\r\nHost: 127.0.0.1\r\nContent-Length: 4\r\nConnection: close\r\n\r\n"
ناپایا الف := اچ تی تی پی.ارسال خام با مهلت(نشانی، سر، داده، ۴، ۲۰۰۰)
برگشتی := الف.داده برگردان طبیعی۸*
سرچاپ الف.وضعیت، الف.اندازه، اچ تی تی پی.مقدار سرصفحه(الف.سرصفحه، "x-zeros")، اچ تی تی پی.مقدار سرصفحه(الف.سرصفحه، "content-type")
سرچاپ برگشتی[۰] برگردان صحیح، برگشتی[۱] برگردان صحیح، برگشتی[۲] برگردان صحیح، برگشتی[۳] برگردان صحیح
اچ تی تی پی.آزادسازی پاسخ خام(الف)
ناپایا نویسنده := مایم.نویسنده چندبخشی جدید()
مایم.نوشتن فیلد(نویسنده، "note"، "سفر")
مایم.نوشتن پرونده(نویسنده، "photo"، "pic.bin"، "image/png"، داده، ۴)
ناپایا بدنه := مایم.بستن نویسنده(نویسنده)
بالا := "POST /upload HTTP/1.1\r\nHost: 127.0.0.1\r\nContent-Type: " + مایم.سرآیند نوع محتوا(نویسنده) + "\r\nContent-Length: " + رشته.از عدد(بدنه.طول برگردان صحیح۶۴) + "\r\nConnection: close\r\n\r\n"
ناپایا ب := اچ تی تی پی.ارسال خام با مهلت(نشانی، بالا، بدنه.داده، بدنه.طول، ۲۰۰۰)
سرچاپ ب.وضعیت، اچ تی تی پی.متن پاسخ خام(ب)
اچ تی تی پی.آزادسازی پاسخ خام(ب)
فشرده سازی.آزادسازی بافر(بدنه)
حافظه.آزادسازی(داده)
ساده := اچ تی تی پی.ارسال("http://127.0.0.1:19615/upload"، "note=x")
سرچاپ اچ تی تی پی.وضعیت(ساده)، اچ تی تی پی.بدنه(ساده)
پایانبایتهای بدنه BodyBytes
تابع بایتهای بدنه(ctx: زمینه): تهی*بدنه آن را در نخستین بایت صفر میبُرد. این حافظه مال درخواست است و با پایان گرداننده آزاد میشود؛ آنچه را نگه میدارید کپی کنید و خودتان آزادش نکنید.نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Upload.salam
چندبخشی Multipart
تابع چندبخشی(ctx: زمینه): mime.MultipartPartsmultipart/form-data را به بخشهایش جدا میکند و هر بخش نام، نام پرونده، نوع محتوا و بایتهای خودش را دارد؛ اگر درخواست چندبخشی نباشد هیچ بخشی برنمیگرداند. نتیجه مال فراخواننده است و باید با مایم.آزادسازی چندبخشی آزاد شود.نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Upload.salam
بایتها Bytes
تابع بایتها(ctx: زمینه، content_type: رشته، p: تهی*، n: صحیح)n بایت را از یک اشارهگر، با نوع محتوای دادهشده، به عنوان بدنه میفرستد؛ برای پرونده، تصویر و بایگانی، بی آنکه بایت صفر چیزی را ببُرد. بایتها کپی میشوند و این تابع مالک اشارهگر نمیشود: اگر آن حافظه را خودتان گرفتهاید، پس از فراخوانی آزادش کنید، ولی اشارهگری را که مال درخواست است، مانند خروجی بایتهای بدنه، هرگز آزاد نکنید.نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Upload.salam
پرسمان خام RawQuery
تابع پرسمان خام(ctx: زمینه): رشته?، همانطور که آمده و بی کدگشایی؛ برای امضای درخواست یا فرستادن به سرویس دیگر.نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Handle.salam
پرسمان Query
تابع پرسمان(ctx: زمینه، key: رشته): رشتهنمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Handle.salam
سرصفحه Header
تابع سرصفحه(ctx: زمینه، name: رشته): رشتهنمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Handle.salam
پارامتر Param
تابع پارامتر(ctx: زمینه، name: رشته): رشتهid در /books/:id.نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Handle.salam
فرم Form
تابع فرم(ctx: زمینه، field: رشته): رشتهapplication/x-www-form-urlencoded.نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Handle.salam
تنظیم وضعیت SetStatus
تابع تنظیم وضعیت(ctx: زمینه، code: صحیح)نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Handle.salam
تنظیم سرصفحه SetHeader
تابع تنظیم سرصفحه(ctx: زمینه، k: رشته، v: رشته)cache-control سرآیند دومی میافزاید.نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Handle.salam
افزودن سرصفحه AddHeader
تابع افزودن سرصفحه(ctx: زمینه، k: رشته، v: رشته)Set-Cookie داشته باشد.واردسازی شبکه.اچ تی تی پی
واردسازی شبکه.مسیریاب
واردسازی زمان
تابع show(ctx: صحیح۶۴):
اچ تی تی پی.افزودن سرصفحه(ctx، "X-Test"، "one")
اچ تی تی پی.افزودن سرصفحه(ctx، "X-Test"، "two")
اچ تی تی پی.افزودن سرصفحه(ctx، "Set-Cookie"، "a=1; Path=/")
اچ تی تی پی.افزودن سرصفحه(ctx، "Set-Cookie"، "b=2; Path=/")
اچ تی تی پی.متن(ctx، "ok")
پایان
تابع ریشه:
ناپایا r := مسیریاب.مسیریاب جدید()
مسیریاب.دریافت(r، "/"، show)
ناپایا s := اچ تی تی پی.سرور جدید(۱۹۵۲۱)
اچ تی تی پی.تنظیم میزبان(s، "127.0.0.1")
اچ تی تی پی.استفاده(s، r)
اگر وارونه اچ تی تی پی.اجرا در پس زمینه(s):
سرچاپ "cannot listen"
برگشت ۱
پایان
زمان.خواب(۳۰۰)
resp := اچ تی تی پی.دریافت("http://127.0.0.1:19521/")
سرچاپ resp.وضعیت
هر v در اچ تی تی پی.مقادیر سرصفحه(resp، "X-Test"):
سرچاپ v
پایان
هر c در اچ تی تی پی.مقادیر سرصفحه(resp، "Set-Cookie"):
سرچاپ c
پایان
برگشت ۰
پایاناچ تی ام ال Html
تابع اچ تی ام ال(ctx: زمینه، html: رشته)نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Handle.salam
جیسون Json
تابع جیسون(ctx: زمینه، json: رشته)نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Handle.salam
متن Text
تابع متن(ctx: زمینه، text: رشته)نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Handle.salam
تغییرمسیر Redirect
تابع تغییرمسیر(ctx: زمینه، url: رشته)نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Handle.salam
کوکی ها Cookies
تابع کوکی ها(ctx: زمینه): نگاشت<رشته، رشته>نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Context.salam
مقدار کوکی CookieValue
تابع مقدار کوکی(ctx: زمینه، name: رشته): رشتهنمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Context.salam
کوکی دارد HasCookie
تابع کوکی دارد(ctx: زمینه، name: رشته): منطقینمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Context.salam
تنظیم کوکی SetCookie
تابع تنظیم کوکی(ctx: زمینه، c: کوکی)نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Context.salam
پاک کردن کوکی ClearCookie
تابع پاک کردن کوکی(ctx: زمینه، name: رشته)نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Context.salam
اتصال مربوط به ConnOf
تابع اتصال مربوط به(ctx: زمینه): tcp.Connنمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Server.salam
ارسال خام SendRaw
تابع ارسال خام(ep: نقطه پایانی، head: رشته، body: تهی*، n: صحیح): پاسخ خامn بایت بدنه را از یک اشارهگر میفرستد، تا بسته شدن اتصال از سوی سرور میخواند، بدنه را دودویی نگه میدارد و بدنهی chunked را باز میکند. مهلتی ندارد.نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-SendRaw.salam
ارسال خام با مهلت SendRawTimeout
تابع ارسال خام با مهلت(ep: نقطه پایانی، head: رشته، body: تهی*، n: صحیح، timeout_ms: صحیح): پاسخ خامنمونهی این مورد همراه با موارد بالاتر آمده است: net-http-SendRaw.salam
ارسال خام با پیکربندی امن SendRawTLS
تابع ارسال خام با پیکربندی امن(ep: نقطه پایانی، head: رشته، body: تهی*، n: صحیح، timeout_ms: صحیح، cfg: tls.Config): پاسخ خامارسال خام با مهلت، با tls.Config خودتان: مرجع خصوصی در ca_file، یا insecure_skip_verify برای آزمایش محلی. نقطهی پایانی http ساده آن را نادیده میگیرد.نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-SendRaw.salam
آزادسازی پاسخ خام FreeRaw
تابع آزادسازی پاسخ خام(r &: پاسخ خام)نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-SendRaw.salam
متن پاسخ خام RawText
تابع متن پاسخ خام(r: پاسخ خام): رشتهنمونهی این مورد همراه با موارد بالاتر آمده است: net-http-SendRaw.salam
سقف پاسخ خام RawLimit
تابع سقف پاسخ خام(): صحیحنمونهی این مورد همراه با موارد بالاتر آمده است: net-http-SendRaw.salam
تنظیم سقف پاسخ خام SetRawLimit
تابع تنظیم سقف پاسخ خام(bytes: صحیح)نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-SendRaw.salam
سرور جدید NewServer
تابع سرور جدید(port: صحیح): سرورنمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Handle.salam
استفاده Use
تابع استفاده(s &: سرور، r: router.Router)نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Handle.salam
پنهان سازی توکن HideTokens
تابع پنهان سازی توکن(s &: سرور)نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Server.salam
تنظیم میزبان SetHost
تابع تنظیم میزبان(s &: سرور، host: رشته)127.0.0.1 برای دسترسی فقط از همین رایانه.نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Server.salam
فعال سازی گزارش دسترسی EnableAccessLog
تابع فعال سازی گزارش دسترسی(s &: سرور)نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Server.salam
اجرا Run
تابع اجرا(s: سرور)نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Server.salam
اجرا در پس زمینه RunBackground
تابع اجرا در پس زمینه(s: سرور): منطقینمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Handle.salam
اجرای امن RunTLS
تابع اجرای امن(s: سرور، cert_file: رشته، key_file: رشته)نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Server.salam
روش Method
تابع روش(h: صحیح۶۴): رشتهنمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Handle.salam
مسیر Path
تابع مسیر(h: صحیح۶۴): رشتهنمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Handle.salam
بدنه Body
تابع بدنه(h: صحیح۶۴): رشتهنمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Handle.salam
طول بدنه BodyLen
تابع طول بدنه(h: صحیح۶۴): صحیحبایتهای بدنه به کار میرود.نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Upload.salam
بایتهای بدنه BodyBytes
تابع بایتهای بدنه(h: صحیح۶۴): تهی*بدنه آن را در نخستین بایت صفر میبُرد. این حافظه مال درخواست است و با پایان گرداننده آزاد میشود؛ آنچه را نگه میدارید کپی کنید و خودتان آزادش نکنید.نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Upload.salam
چندبخشی Multipart
تابع چندبخشی(h: صحیح۶۴): mime.MultipartPartsmultipart/form-data را به بخشهایش جدا میکند و هر بخش نام، نام پرونده، نوع محتوا و بایتهای خودش را دارد؛ اگر درخواست چندبخشی نباشد هیچ بخشی برنمیگرداند. نتیجه مال فراخواننده است و باید با مایم.آزادسازی چندبخشی آزاد شود.نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Upload.salam
پرسمان Query
تابع پرسمان(h: صحیح۶۴، key: رشته): رشتهنمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Handle.salam
پرسمان خام RawQuery
تابع پرسمان خام(h: صحیح۶۴): رشته?، همانطور که آمده و بی کدگشایی؛ برای امضای درخواست یا فرستادن به سرویس دیگر.نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Handle.salam
سرصفحه Header
تابع سرصفحه(h: صحیح۶۴، name: رشته): رشتهنمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Handle.salam
پارامتر Param
تابع پارامتر(h: صحیح۶۴، name: رشته): رشتهid در /books/:id.نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Handle.salam
فرم Form
تابع فرم(h: صحیح۶۴، field: رشته): رشتهapplication/x-www-form-urlencoded.نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Handle.salam
تنظیم وضعیت SetStatus
تابع تنظیم وضعیت(h: صحیح۶۴، code: صحیح)نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Handle.salam
تنظیم سرصفحه SetHeader
تابع تنظیم سرصفحه(h: صحیح۶۴، k: رشته، v: رشته)cache-control سرآیند دومی میافزاید.نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Handle.salam
افزودن سرصفحه AddHeader
تابع افزودن سرصفحه(h: صحیح۶۴، k: رشته، v: رشته)Set-Cookie داشته باشد.نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-AddHeader.salam
اچ تی ام ال Html
تابع اچ تی ام ال(h: صحیح۶۴، html: رشته)نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Handle.salam
جیسون Json
تابع جیسون(h: صحیح۶۴، json: رشته)نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Handle.salam
متن Text
تابع متن(h: صحیح۶۴، text: رشته)نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Handle.salam
بایتها Bytes
تابع بایتها(h: صحیح۶۴، content_type: رشته، p: تهی*، n: صحیح)n بایت را از یک اشارهگر، با نوع محتوای دادهشده، به عنوان بدنه میفرستد؛ برای پرونده، تصویر و بایگانی، بی آنکه بایت صفر چیزی را ببُرد. بایتها کپی میشوند و این تابع مالک اشارهگر نمیشود: اگر آن حافظه را خودتان گرفتهاید، پس از فراخوانی آزادش کنید، ولی اشارهگری را که مال درخواست است، مانند خروجی بایتهای بدنه، هرگز آزاد نکنید.نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Upload.salam
مالکیت Own
تابع مالکیت(h: صحیح۶۴، s: رشته): رشتهنمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Handle.salam
تغییرمسیر Redirect
تابع تغییرمسیر(h: صحیح۶۴، loc: رشته)نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Handle.salam
لبه است IsEdge
تابع لبه است(): منطقینمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Server.salam
کوکی جدید NewCookie
تابع کوکی جدید(name: رشته، value: رشته): کوکینمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Client.salam
کوکی با انقضا ExpiringCookie
تابع کوکی با انقضا(name: رشته، value: رشته، max_age_seconds: صحیح): کوکینمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Cookie.salam
کوکی منقضی شده ExpiredCookie
تابع کوکی منقضی شده(name: رشته، path: رشته، domain: رشته): کوکینمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Cookie.salam
کوکی ها Cookies
تابع کوکی ها(h: صحیح۶۴): نگاشت<رشته، رشته>نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Context.salam
مقدار کوکی CookieValue
تابع مقدار کوکی(h: صحیح۶۴، name: رشته): رشتهنمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Context.salam
کوکی دارد HasCookie
تابع کوکی دارد(h: صحیح۶۴، name: رشته): منطقینمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Context.salam
تنظیم کوکی SetCookie
تابع تنظیم کوکی(h: صحیح۶۴، c: کوکی)نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Context.salam
پاک کردن کوکی ClearCookie
تابع پاک کردن کوکی(h: صحیح۶۴، name: رشته)نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Context.salam
پاک کردن کوکی در مسیر ClearCookieAt
تابع پاک کردن کوکی در مسیر(h: صحیح۶۴، name: رشته، path: رشته، domain: رشته)نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Client.salam
سرصفحه جدید NewHeaders
تابع سرصفحه جدید(): نگاشت<رشته، رشته>نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Handle.salam
دریافت Get
تابع دریافت(url: رشته): پاسخنمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Handle.salam
ارسال Post
تابع ارسال(url: رشته، body: رشته): پاسخapplication/x-www-form-urlencoded؛ برای نوع محتوای دیگر ارسال با را به کار ببرید.نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Client.salam
دریافت با GetWith
تابع دریافت با(url: رشته، headers: نگاشت<رشته، رشته>): پاسخدریافت، با سرآیندهای اضافه.نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Client.salam
ارسال با PostWith
تابع ارسال با(url: رشته، body: رشته، headers: نگاشت<رشته، رشته>): پاسخارسال، با سرآیندهای اضافه.نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Handle.salam
درخواست Request
تابع درخواست(method: رشته، url: رشته، headers: نگاشت<رشته، رشته>، body: رشته): پاسخنمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Handle.salam
درخواست خام RequestRaw
تابع درخواست خام(method: رشته، url: رشته، header_block: رشته، body: رشته): پاسخ\r\n تمام شود.نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Client.salam
دریافت بایت ها با GetBytesWith
تابع دریافت بایت ها با(url: رشته، headers: نگاشت<رشته، رشته>): پاسخ بایتیدریافت با، ولی بدنه را به شکل بایت نگه میدارد (یک پاسخ بایتی).نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Client.salam
انجام درخواست Do
تابع انجام درخواست(method: رشته، url: رشته، headers: نگاشت<رشته، رشته>، body: رشته، opts: گزینه های درخواست): پاسخگزینه های درخواست میفرستد.نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Do.salam
موفق Ok
تابع موفق(r: پاسخ): منطقیوضعیت از هم جدا کنید.نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Client.salam
وضعیت Status
تابع وضعیت(r: پاسخ): صحیحنمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Handle.salam
بدنه Body
تابع بدنه(r: پاسخ): رشتهنمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Handle.salam
خطا Error
تابع خطا(r: پاسخ): رشتهنمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Client.salam
سرصفحه ها Headers
تابع سرصفحه ها(r: پاسخ): نگاشت<رشته، رشته>نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Client.salam
دریافت سرصفحه GetHeader
تابع دریافت سرصفحه(r: پاسخ، name: رشته): رشتهنمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Handle.salam
خام Raw
تابع خام(r: پاسخ): رشتهنمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Client.salam
سرصفحه های خام RawHeaders
تابع سرصفحه های خام(r: پاسخ): رشتهنمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Client.salam
مقادیر سرصفحه HeaderValues
تابع مقادیر سرصفحه(r: پاسخ، name: رشته): وکتور<رشته>Set-Cookie.نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Client.salam
قرار دادن Put
تابع قرار دادن(url: رشته، body: رشته): پاسخنمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Handle.salam
قرار دادن با PutWith
تابع قرار دادن با(url: رشته، body: رشته، headers: نگاشت<رشته، رشته>): پاسخقرار دادن، با سرآیندهای اضافه.نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Client.salam
حذف Delete
تابع حذف(url: رشته): پاسخنمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Client.salam
حذف با DeleteWith
تابع حذف با(url: رشته، headers: نگاشت<رشته، رشته>): پاسخحذف، با سرآیندهای اضافه.نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Client.salam
وصله Patch
تابع وصله(url: رشته، body: رشته): پاسخنمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Client.salam
وصله با PatchWith
تابع وصله با(url: رشته، body: رشته، headers: نگاشت<رشته، رشته>): پاسخوصله، با سرآیندهای اضافه.نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Client.salam
گزینه ها Options
تابع گزینه ها(url: رشته): پاسخنمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Client.salam
گزینه ها با OptionsWith
تابع گزینه ها با(url: رشته، headers: نگاشت<رشته، رشته>): پاسخگزینه ها، با سرآیندهای اضافه.نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Client.salam
درخواست هد Head
تابع درخواست هد(url: رشته): پاسخنمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Client.salam
سرصفحه با HeadWith
تابع سرصفحه با(url: رشته، headers: نگاشت<رشته، رشته>): پاسخدرخواست هد، با سرآیندهای اضافه.نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Client.salam
کدگذاری فرم EncodeForm
تابع کدگذاری فرم(params: نگاشت<رشته، رشته>): رشتهa=1&b=2 با کدگذاری درصدی تبدیل میکند.نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Client.salam
با پرسمان WithQuery
تابع با پرسمان(base: رشته، params: نگاشت<رشته، رشته>): رشتهنمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Client.salam
خطوط کوکی SetCookieLines
تابع خطوط کوکی(r: پاسخ): وکتور<رشته>Set-Cookie پاسخ.نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Context.salam
نگاشت کوکی CookieMap
تابع نگاشت کوکی(r: پاسخ): نگاشت<رشته، رشته>نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Client.salam
سرصفحه کوکی CookieHeader
تابع سرصفحه کوکی(cookies: نگاشت<رشته، رشته>): رشتهCookie تبدیل میکند.نمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Client.salam
کارخواه جدید NewClient
تابع کارخواه جدید(): کارخواهنمونهی این مورد همراه با موارد بالاتر آمده است: net-http-Context.salam