12 Star 81 Fork 22

gouguoyin / easyhttp

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README
MIT

EasyHttp 是一个轻量级、语义化、对IDE友好的HTTP客户端,支持常见的HTTP请求、异步请求和并发请求,让你可以快速地使用 HTTP 请求与其他 Web 应用进行通信。

EasyHttp并不强制依赖于cURL,如果没有安装cURL,EasyHttp会自动选择使用PHP流处理,或者你也可以提供自己的发送HTTP请求的处理方式。

如果您觉得EasyHttp对您有用的话,别忘了给点个赞哦^_^ !

github:github.com/gouguoyin/easyhttp

gitee:gitee.com/gouguoyin/easyhttp

安装说明

环境依赖

  • PHP >= 5.5.0
  • 如果使用PHP流处理,allow_url_fopen 必须在php.ini中启用。
  • 如果使用cURL处理,cURL >= 7.19.4,并且编译了OpenSSL 与 zlib。

一键安装

composer require gouguoyin/easyhttp

发起请求

同步请求

常规请求
$response = Http::get('http://httpbin.org/get');

$response = Http::get('http://httpbin.org/get?name=gouguoyin');

$response = Http::get('http://httpbin.org/get?name=gouguoyin', ['age' => 18]);

$response = Http::post('http://httpbin.org/post');

$response = Http::post('http://httpbin.org/post', ['name' => 'gouguoyun']);

$response = Http::patch(...);

$response = Http::put(...);

$response = Http::delete(...);

$response = Http::head(...);

$response = Http::options(...);
发送 Content-Type 编码请求
// application/x-www-form-urlencoded(默认)
$response = Http::asForm()->post(...);

// application/json
$response = Http::asJson()->post(...);
发送 Multipart 表单请求
$response = Http::asMultipart(
    'file_input_name', file_get_contents('photo1.jpg'), 'photo2.jpg'
)->post('http://test.com/attachments');

$response = Http::asMultipart(
    'file_input_name', fopen('photo1.jpg', 'r'), 'photo2.jpg'
)->post(...);

$response = Http::attach(
    'file_input_name', file_get_contents('photo1.jpg'), 'photo2.jpg'
)->post(...);

$response = Http::attach(
    'file_input_name', fopen('photo1.jpg', 'r'), 'photo2.jpg'
)->post(...);

表单enctype属性需要设置成 multipart/form-data

携带请求头的请求
$response = Http::withHeaders([
    'x-powered-by' => 'gouguoyin'
])->post(...);
携带重定向的请求
// 默认
$response = Http::withRedirect(false)->post(...);

$response = Http::withRedirect([
    'max'             => 5,
    'strict'          => false,
    'referer'         => true,
    'protocols'       => ['http', 'https'],
    'track_redirects' => false
])->post(...);
携带认证的请求
// Basic认证
$response = Http::withBasicAuth('username', 'password')->post(...);

// Digest认证(需要被HTTP服务器支持)
$response = Http::withDigestAuth('username', 'password')->post(...);
携带 User-Agent 的请求
$response = Http::withUA('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3100.0 Safari/537.36')->post(...);
携带Token令牌的请求
$response = Http::withToken('token')->post(...);
携带认证文件的请求
$response = Http::withCert('/path/server.pem', 'password')->post(...);
携带SSL证书的请求
// 默认
$response = Http::withVerify(false)->post(...);

$response = Http::withVerify('/path/to/cert.pem')->post(...);
携带COOKIE的请求
$response = Http::withCookies(array $cookies, string $domain)->post(...);
携带协议版本的请求
$response = Http::withVersion(1.1)->post(...);
携带代理的请求
$response = Http::withProxy('tcp://localhost:8125')->post(...);

$response = Http::withProxy([
    'http'  => 'tcp://localhost:8125', // Use this proxy with "http"
    'https' => 'tcp://localhost:9124', // Use this proxy with "https",
    'no'    => ['.com.cn', 'gouguoyin.cn'] // Don't use a proxy with these
])->post(...);
设置超时时间(单位秒)
$response = Http::timeout(60)->post(...);
设置延迟时间(单位秒)
$response = Http::delay(60)->post(...);
设置并发次数
$response = Http::concurrency(10)->promise(...);

异步请求

use Gouguoyin\EasyHttp\Response;
use Gouguoyin\EasyHttp\RequestException;

Http::getAsync('http://easyhttp.gouguoyin.cn/api/sleep3.json', ['token' => TOKEN], function (Response $response) {
    echo '异步请求成功,响应内容:' . $response->body() . PHP_EOL;
}, function (RequestException $e) {
    echo '异步请求异常,错误码:' . $e->getCode() . ',错误信息:' . $e->getMessage() . PHP_EOL;
});
echo json_encode(['code' => 200, 'msg' => '请求成功'], JSON_UNESCAPED_UNICODE) . PHP_EOL;

//输出
{"code":200,"msg":"请求成功"}
异步请求成功响应内容{"code":200,"msg":"success","second":3}

Http::getAsync('http1://easyhttp.gouguoyin.cn/api/sleep3.json', function (Response $response) {
    echo '异步请求成功,响应内容:' . $response->body() . PHP_EOL;
}, function (RequestException $e) {
    echo '异步请求异常,错误信息:' . $e->getMessage() . PHP_EOL;
});
echo json_encode(['code' => 200, 'msg' => '请求成功'], JSON_UNESCAPED_UNICODE) . PHP_EOL;

//输出
{"code":200,"msg":"请求成功"}
异步请求异常错误信息cURL error 1: Protocol "http1" not supported or disabled in libcurl (see https://curl.haxx.se/libcurl/c/libcurl-errors.html)

Http::postAsync(...);

Http::patchAsync(...);

Http::putAsync(...);

Http::deleteAsync(...);

Http::headAsync(...);

Http::optionsAsync(...);

异步并发请求

use Gouguoyin\EasyHttp\Response;
use Gouguoyin\EasyHttp\RequestException;

$promises = [
    Http::getAsync('http://easyhttp.gouguoyin.cn/api/sleep3.json'),
    Http::getAsync('http1://easyhttp.gouguoyin.cn/api/sleep1.json', ['name' => 'gouguoyin']),
    Http::postAsync('http://easyhttp.gouguoyin.cn/api/sleep2.json', ['name' => 'gouguoyin']),
];

Http::concurrency(10)->multiAsync($promises, function (Response $response, $index) {
    echo "发起第 $index 个异步请求,请求时长:" . $response->json()->second . '秒' . PHP_EOL;
}, function (RequestException $e, $index) {
    echo "发起第 $index 个请求失败,失败原因:" . $e->getMessage() . PHP_EOL;
});

//输出
发起第 1 个请求失败失败原因cURL error 1: Protocol "http1" not supported or disabled in libcurl (see https://curl.haxx.se/libcurl/c/libcurl-errors.html)
发起第 2 个异步请求请求时长2 
发起第 0 个异步请求请求时长3 

如果未调用concurrency()方法,并发次数默认为$promises的元素个数,$promises数组里必须是异步请求

使用响应

发起请求后会返回一个 Gouguoyin\EasyHttp\Response $response的实例,该实例提供了以下方法来检查请求的响应:

$response->body() : string;
$response->json() : object;
$response->array() : array;
$response->status() : int;
$response->ok() : bool;
$response->successful() : bool;
$response->serverError() : bool;
$response->clientError() : bool;
$response->headers() : array;
$response->header($header) : string;

异常处理

请求在发生客户端或服务端错误时会抛出 Gouguoyin\EasyHttp\RequestException $e异常,该实例提供了以下方法来返回异常信息:

$e->getCode() : int;
$e->getMessage() : string;
$e->getFile() : string;
$e->getLine() : int;
$e->getTrace() : array;
$e->getTraceAsString() : string;

更新日志

2020-03-30

  • 修复部分情况下IDE不能智能提示的BUG
  • get()、getAsync()方法支持带参数的url
  • 新增withUA()方法
  • 新增withStream()方法
  • 新增asMultipart()方法,attach()的别名
  • 新增multiAsync()异步并发请求方法

2020-03-20

  • 新增异步请求getAsync()方法
  • 新增异步请求postAsync()方法
  • 新增异步请求patchAsync()方法
  • 新增异步请求putAsync()方法
  • 新增异步请求deleteAsync()方法
  • 新增异步请求headAsync()方法
  • 新增异步请求optionsAsync()方法

Todo List

  • 异步请求
  • 并发请求
  • 重试机制
  • 支持http2
  • 支持swoole
The MIT License (MIT) Copyright (c) 2014-present rap2hpoutre Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

简介

EasyHttp 是一个轻量级、语义化、对IDE友好的HTTP客户端,支持常见的HTTP请求、异步请求和并发请求,让你可以快速地使用 HTTP 请求与其他 Web 应用进行通信。 展开 收起
PHP
MIT
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
PHP
1
https://gitee.com/gouguoyin/easyhttp.git
git@gitee.com:gouguoyin/easyhttp.git
gouguoyin
easyhttp
easyhttp
master

搜索帮助