# ๐ฆ reqrio - ไธไธช่ฝป้ใ้ซๆง่ฝใๆ็บน็บง็HTTP ่ฏทๆฑๅบ
`reqrio` ๆฏไธไธช้ขๅ้ซๆง่ฝไธๆต่งๅจ็บง่กไธบๆจกๆ่ฎพ่ฎก็HTTP่ฏทๆฑๅบ๏ผไธป่ฆ็จไบ้่ฆ็ฒพ็กฎๆงๅถ็ฝ็ป่กไธบ็ๅบๆฏ๏ผ
ๆฏๅฆๅ่ฎฎ็ ็ฉถใๆ็บนๅๆใ้ซๅนถๅ้้ไปฅๅๅคๆๅ็ฌ็ฏๅขไธ็่ฏทๆฑๆ้ ใ ๅฎๅนถไธๆฏไผ ็ปๆไนไธ่ฟฝๆฑโ็ฎๅๆ็จโ็HTTPๅฎขๆท็ซฏ๏ผ่ๆฏๆดๅๅๅบๅฑ่ฏทๆฑ่กไธบ็ๅฏๆง
ๆงไธไธ่ดๆง๏ผ่ฎฉๅผๅ่
่ฝๅคๅฐฝๅฏ่ฝ่ดด่ฟ็ๅฎๆต่งๅจ็็ฝ็ปๆ ่กไธบ๏ผๅ
ๆฌ TLS ๆกๆ็นๅพใHTTP/2 ่กไธบไปฅๅ Header ๆๅๆนๅผ็ญใ
โจ ไธไธๆฏ`reqrio`็็น่ฒ๏ผ
* ้ซๅนถๅไธไฝๅ
ๅญๅผ้
* ๆตๅผๆฐๆฎๅค็
* ไธบๅ่ฎฎ็ ็ฉถ / ๅ็ฌ / ๆ็บนๆงๅถๆไพๅบ็ก่ฝๅ
* ๆฏๆTLSๆ็บน๏ผๅฏไปฅ้่ฟTLSๆกๆ็ๅๅ
ญ่ฟๅถใja3ใja4่ฎพ็ฝฎ(**ไป
่ฎข้
**),
* **ๆๅบ่ฏทๆฑๅคด**(ๆฅ็[่ฏทๆฑๅคด้กบๅบ่กจ](https://github.com/xllgl2017/reqrio/blob/main/HEADER.md))๏ผๅๆต่งๅจไธ่ด
* [**BoringSSL**](https://github.com/google/boringssl)ๆไพๅ ่งฃๅฏ/ๅฏ็ ๅญฆ็ฎๆณใ
## ๐ ๆตๅผ่ฏทๆฑๅ่งฃๆ
`reqrio` ๆฏไธไธช ไฝๆท่ด๏ผlow-copy๏ผ่ฏทๆฑๅ้ๅผๆ๏ผ็จไบ้ซๆๅฐๅฐ ็จๆทๆฐๆฎๆๆไปถๆฐๆฎ ้่ฟ TLS ๅ ๅฏๅๅ้ๅฐ TCPใ`reqrio`ๅจๅ้ๆถ๏ผ
ๅฏน็จๆทไผ ๅ
ฅform-dataใjsonใtext็ญๆฐๆฎ่ฟ่ก่ฝฌbytesๅจๅญ๏ผ็ถๅไป
ๅจ่ฟๅ
ฅ TLS ๅ ๅฏ้ถๆฎตๆถๅ็ไธๆฌก copy๏ผ ๅ
ถไฝ้ถๆฎตไป
ๅฏนๆฐๆฎ่ฟ่ก
borrow๏ผๅ็จ๏ผ๏ผๅฏนๆไปถไธไผ ๅ้่ฟinto_reader่ฟ่ก่ฏปๅ๏ผๅๅฐๅ
ๅญๅผ้๏ผๅจๆฅๆถๆถ๏ผ็ดๆฅๅฐ่งฃๅฏๅ็ๆฐๆฎ็ดๆฅๅๅ
ฅๅผๆๅฑ็buffer๏ผ
็ถๅ็ฑๅผๆๅฑ่ฟ่ก่งฃๅ่งฃๆๅ่ฟๅๅฐ็จๆท
```text
โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ Write โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ
โ โโโโโโโโโโ โโโโโโโโโโโโ โโโโโโโโโโโโ โ
โ Url,Body โ ScReq โ encode->bytes โ Request โ copy slice โ fragment โ write โโโโโโโโโ โ
โ User โโโโโโโโโโบโ AcReq โโโโโโโโโโโโโโโโบโ borrow โโโโโโโโโโโโโโบโ TLS โโโโโโโโบโ TCP โ โ
โ โ(Engine)โ into_reader โ reader โ โ Encrypt โ โโโโโโโโโ โ
โ โโโโโโโโโโ โโโโโโโโโโโโ โโโโโโโโโโโโ โ
โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ
โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ Read โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ
โ โโโโโโโโโโโโ โโโโโโโโโโ โ
โ โโโโโโโโโ read โ TLS โ decrypt to โ ScReq โ return โ
โ โ TCP โโโโโโโโบโ Fragment โโโโโโโโโโโโโบโ AcReq โโโโโโโโโโโบ User โ
โ โโโโโโโโโ โ Decrypt โ โ(Engine)โ Response โ
โ โโโโโโโโโโโโ โโโโโโโโโโ โ
โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โ โโ
```
## ๐ ๅฟซ้ๅผๅง
* ๅๅงๅSession
```rust
use reqrio::*;
fn ff() {
let headers = json::object! {
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
"Accept-Encoding": "gzip, deflate, br, zstd",
"Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6",
"Cache-Control": "no-cache",
"Connection": "keep-alive",
"Cookie": "__guid=15015764.1071255116101212729.1764940193317.2156; env_webp=1; _S=pvc5q7leemba50e4kn4qis4b95; QiHooGUID=4C8051464B2D97668E3B21198B9CA207.1766289287750; count=1; so-like-red=2; webp=1; so_huid=114r0SZFiQcJKtA38GZgwZg%2Fdit1cjUGuRcsIL2jTn4%2FE%3D; __huid=114r0SZFiQcJKtA38GZgwZg%2Fdit1cjUGuRcsIL2jTn4%2FE%3D; gtHuid=1",
"Pragma": "no-cache",
"Sec-Fetch-Dest": "document",
"Sec-Fetch-Mode": "navigate",
"Sec-Fetch-Site": "none",
"Sec-Fetch-User": "?1",
"Upgrade-Insecure-Requests": 1,
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36 Edg/143.0.0.0",
"sec-ch-ua": r#""Microsoft Edge";v="143", "Chromium";v="143", "Not A(Brand";v="24""#,
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": r#""Windows""#
};
let mut req = ScReq::new()
//่ฎพ็ฝฎๆ้ซHTTP็ๆฌ๏ผ้ป่ฎคHTTP/1.1
.with_alpn(ALPN::Http20)
//Sessionๅ
้จ้ป่ฎคไธ่ฎพ็ฝฎไปปไฝ่ฏทๆฑๅคด๏ผ้่ฆๆๅจ่ฎพ็ฝฎ
.with_header_json(headers).unwrap()
//่ฎพ็ฝฎ่ฏทๆฑ่ถ
ๆถๅๅฐ่ฏ่ฏทๆฑๆฌกๆฐ
.with_timeout(Timeout::new_same(3000, 3));
}
```
* GET็็ฎๅ็คบไพ
```rust
use reqrio::*;
fn ff() {
let mut req = ScReq::new();
//get
let mut res = req.get("https://www.baidu.com", None).unwrap();
//่ทๅ็ธๅบๅคด
let header = res.header();
//่ทๅ็ธๅบไฝ๏ผไธ็งปๅจๆๆๆ
let body = res.decode_body().unwrap();
//่ทๅjson๏ผ่ฝฌ็งปๆๆๆ
let json = res.json().unwrap();
}
```
* ่กจๅๆไบค็คบไพ
```rust
use reqrio::*;
fn ff() {
let mut req = ScReq::new();
let url = "https://www.baidu.com/api";
let data = json::object! {
"field1":"value1",
"field2":"value2"
};
let resp = req.post(url, data.form()).unwrap();
}
```
* jsonๆไบค็คบไพ
```rust
use reqrio::*;
fn ff() {
let mut req = ScReq::new();
let url = "https://www.baidu.com/api";
let data = json::object! {
"field1":"value1",
"field2":"value2"
};
let resp = req.post(url, data).unwrap();
}
```
* ๆไบคๅทฒๅฎ็ฐ`Serialize`็struct็คบไพ
* ้่ฆๆทปๅ serde็นๆง
```rust
use reqrio::*;
use serde::Serialize;
fn ff() {
let mut req = ScReq::new();
#[derive(Serialize)]
struct Data {
field1: String,
field2: bool
}
let url = "https://www.baidu.com/api";
let resp = req.post(url, Body::json(&Data { field1: "value".to_string(), field2: false }).unwrap()).unwrap();
}
```