PHPackages                             toohamster/ws-http - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [HTTP &amp; Networking](/categories/http)
4. /
5. toohamster/ws-http

ActiveLibrary[HTTP &amp; Networking](/categories/http)

toohamster/ws-http
==================

ws-http: Simplified, lightweight HTTP client library

1.0.2(9y ago)5621.1k↓100%13MITPHPPHP &gt;=5.4

Since Jul 29Pushed 8y ago4 watchersCompare

[ Source](https://github.com/toohamster/ws-http)[ Packagist](https://packagist.org/packages/toohamster/ws-http)[ Docs](https://github.com/toohamster/ws-http)[ RSS](/packages/toohamster-ws-http/feed)WikiDiscussions master Synced 1mo ago

READMEChangelog (2)DependenciesVersions (3)Used By (0)

ws-http
=======

[](#ws-http)

#### 简单轻量的HTTP 客户端工具库(An Simplified, lightweight HTTP client library)

[](#简单轻量的http-客户端工具库an-simplified-lightweight-http-client-library)

[![ws-http](https://camo.githubusercontent.com/2aeadc659bf80bdba780c7adf0231dc4565683434be450636b4cac1ff2e4faac/68747470733a2f2f7261772e6769746875622e636f6d2f746f6f68616d737465722f77732d687474702f6d61737465722f6c6f676f2e706e67)](https://camo.githubusercontent.com/2aeadc659bf80bdba780c7adf0231dc4565683434be450636b4cac1ff2e4faac/68747470733a2f2f7261772e6769746875622e636f6d2f746f6f68616d737465722f77732d687474702f6d61737465722f6c6f676f2e706e67)

#### 可用于 HTTP API 测试,支持 ssl,basic auth,代理,自定义请求头,以及常用HTTP 请求方法.(An HTTP API testing framework, written in PHP using curl. Supports ssl, basic auth, passing custom request headers, and most HTTP request methods.

[](#可用于-http-api-测试支持-sslbasic-auth代理自定义请求头以及常用http-请求方法an-http-api-testing-framework-written-in-php-using-curl-supports-ssl-basic-auth-passing-custom-request-headers-and-most-http-request-methods)

需求(Requirements)
----------------

[](#需求requirements)

- [cURL](http://php.net/manual/en/book.curl.php)
- PHP 5.4+

安装(Installation)
----------------

[](#安装installation)

### 使用 (Using) [Composer](https://getcomposer.org)

[](#使用-using-composer)

在`composer.json`文件中新增如下行(To install ws-http with Composer, just add the following to your `composer.json` file):

```
{
    "require": {
        "toohamster/ws-http": "*"
    }
}
```

或者手动运行命令(or by running the following command):

```
php composer require toohamster/ws-http
```

Http Request 使用(Http Request Usage)
-----------------------------------

[](#http-request-使用http-request-usage)

### 创建一个请求(Creating a Request)

[](#创建一个请求creating-a-request)

```
$httpRequest = \Ws\Http\Request::create();
```

支持的方法(Support Method)
---------------------

[](#支持的方法support-method)

```
// set config
$httpRequest->jsonOpts($assoc = false, $depth = 512, $options = 0);
$httpRequest->verifyPeer($enabled);
$httpRequest->verifyHost($enabled);
$httpRequest->verifyFile($file);
$httpRequest->getVerifyFile();
$httpRequest->timeout($seconds);
$httpRequest->defaultHeaders($headers);
$httpRequest->defaultHeader($name, $value);
$httpRequest->clearDefaultHeaders();
$httpRequest->curlOpts($options);
$httpRequest->curlOpt($name, $value);
$httpRequest->clearCurlOpts();
$httpRequest->cookie($cookie);
$httpRequest->cookieFile($cookieFile);
$httpRequest->auth($username = '', $password = '', $method = CURLAUTH_BASIC);
$httpRequest->proxy($address, $port = 1080, $type = CURLPROXY_HTTP, $tunnel = false);
$httpRequest->proxyAuth($username = '', $password = '', $method = CURLAUTH_BASIC);

// http call
$httpRequest->get($url, $headers = [], $parameters = null);
$httpRequest->head($url, $headers = [], $parameters = null);
$httpRequest->options($url, $headers = [], $parameters = null);
$httpRequest->connect($url, $headers = [], $parameters = null);
$httpRequest->post($url, $headers = [], $body = null);
$httpRequest->delete($url, $headers = [], $body = null);
$httpRequest->put($url, $headers = [], $body = null);
$httpRequest->patch($url, $headers = [], $body = null);
$httpRequest->trace($url, $headers = [], $body = null);
```

此处给出一些简单的实例(Let's look at a working example):

```
$headers = array('Accept' => 'application/json');
$query = array('foo' => 'hello', 'bar' => 'world');

$response = $httpRequest->post('http://mockbin.com/request', $headers, $query);

$response->code;        // 请求响应码(HTTP Status code)
$response->curl_info;   // curl信息(HTTP Curl info)
$response->headers;     // 响应头(Headers)
$response->body;        // 处理后的响应消息体(Parsed body), 默认为 false
$response->raw_body;    // 原始响应消息体(Unparsed body)
```

### JSON 请求(Requests) *(`application/json`)*

[](#json-请求requests-applicationjson)

```
$headers = array('Accept' => 'application/json');
$data = array('name' => 'ahmad', 'company' => 'mashape');

$body = Ws\Http\Request\Body::json($data);

$response = $httpRequest->post('http://mockbin.com/request', $headers, $body);
```

**注意(Notes):**

- `Content-Type` 会自动设置成(headers will be automatically set to) `application/json`

### 表单请求(Form Requests) *(`application/x-www-form-urlencoded`)*

[](#表单请求form-requests-applicationx-www-form-urlencoded)

```
$headers = array('Accept' => 'application/json');
$data = array('name' => 'ahmad', 'company' => 'mashape');

$body = Ws\Http\Request\Body::form($data);

$response = $httpRequest->post('http://mockbin.com/request', $headers, $body);
```

**注意(Notes):**

- `Content-Type` 会自动设置成(headers will be automatically set to) `application/x-www-form-urlencoded`

### Multipart Requests *(`multipart/form-data`)*

[](#multipart-requests-multipartform-data)

```
$headers = array('Accept' => 'application/json');
$data = array('name' => 'ahmad', 'company' => 'mashape');

$body = Ws\Http\Request\Body::multipart($data);

$response = $httpRequest->post('http://mockbin.com/request', $headers, $body);
```

**注意(Notes):**

- `Content-Type` 会自动设置成(headers will be automatically set to) `multipart/form-data`.

### 文件上传(Multipart File Upload)

[](#文件上传multipart-file-upload)

```
$headers = array('Accept' => 'application/json');
$data = array('name' => 'ahmad', 'company' => 'mashape');
$files = array('bio' => '/path/to/bio.txt', 'avatar' => '/path/to/avatar.jpg');

$body = Ws\Http\Request\Body::multipart($data, $files);

$response = $httpRequest->post('http://mockbin.com/request', $headers, $body);
```

```
$headers = array('Accept' => 'application/json');
$body = array(
    'name' => 'ahmad',
    'company' => 'mashape'
    'bio' => Ws\Http\Request\Body::file('/path/to/bio.txt', 'text/plain'),
    'avatar' => Ws\Http\Request\Body::file('/path/to/my_avatar.jpg', 'text/plain', 'avatar.jpg')
);

$response = $httpRequest->post('http://mockbin.com/request', $headers, $body);
```

### 自定义消息体(Custom Body)

[](#自定义消息体custom-body)

可以使用`Ws\Http\Request\Body`类提供的方法来生成消息体或使用PHP自带的序列化函数来生成消息体(Sending a custom body such rather than using the `Ws\Http\Request\Body` helpers is also possible, for example, using a [`serialize`](http://php.net/manual/en/function.serialize.php) body string with a custom `Content-Type`):

```
$headers = array('Accept' => 'application/json', 'Content-Type' => 'application/x-php-serialized');
$body = serialize((array('foo' => 'hello', 'bar' => 'world'));

$response = $httpRequest->post('http://mockbin.com/request', $headers, $body);
```

### 授权校验(Authentication)

[](#授权校验authentication)

```
$httpRequest->auth($username, $password, $method);// default is CURLAUTH_BASIC
```

**支持的方法(Supported Methods)**

MethodDescription`CURLAUTH_BASIC`HTTP Basic authentication.`CURLAUTH_DIGEST`HTTP Digest authentication. as defined in [RFC 2617](http://www.ietf.org/rfc/rfc2617.txt)`CURLAUTH_DIGEST_IE`HTTP Digest authentication with an IE flavor. *The IE flavor is simply that libcurl will use a special "quirk" that IE is known to have used before version 7 and that some servers require the client to use.*`CURLAUTH_NEGOTIATE`HTTP Negotiate (SPNEGO) authentication. as defined in [RFC 4559](http://www.ietf.org/rfc/rfc4559.txt)`CURLAUTH_NTLM`HTTP NTLM authentication. A proprietary protocol invented and used by Microsoft.`CURLAUTH_NTLM_WB`NTLM delegating to winbind helper. Authentication is performed by a separate binary application. *see [libcurl docs](http://curl.haxx.se/libcurl/c/CURLOPT_HTTPAUTH.html) for more info*`CURLAUTH_ANY`This is a convenience macro that sets all bits and thus makes libcurl pick any it finds suitable. libcurl will automatically select the one it finds most secure.`CURLAUTH_ANYSAFE`This is a convenience macro that sets all bits except Basic and thus makes libcurl pick any it finds suitable. libcurl will automatically select the one it finds most secure.`CURLAUTH_ONLY`This is a meta symbol. OR this value together with a single specific auth value to force libcurl to probe for un-restricted auth and if not, only that single auth algorithm is acceptable.```
// custom auth method
$httpRequest->proxyAuth('username', 'password', CURLAUTH_DIGEST);
```

### Cookies

[](#cookies)

```
$httpRequest->cookie($cookie)
```

```
$httpRequest->cookieFile($cookieFile)
```

`$cookieFile` 参数必须是可读取的文件路径(must be a correct path with write permission).

### 请求对象(Request Object)

[](#请求对象request-object)

```
$httpRequest->get($url, $headers = array(), $parameters = null)
$httpRequest->post($url, $headers = array(), $body = null)
$httpRequest->put($url, $headers = array(), $body = null)
$httpRequest->patch($url, $headers = array(), $body = null)
$httpRequest->delete($url, $headers = array(), $body = null)
```

- `url` - 请求地址(Endpoint, address, or uri to be acted upon and requested information from)
- `headers` - 请求头(Request Headers as associative array or object)
- `body` - 请求消息体(Request Body as associative array or object)

可以使用标准的HTTP方法,也可以使用自定义的HTTP方法(You can send a request with any [standard](http://www.iana.org/assignments/http-methods/http-methods.xhtml) or custom HTTP Method):

```
$httpRequest->send(Ws\Http\Method::LINK, $url, $headers = array(), $body);

$httpRequest->send('CHECKOUT', $url, $headers = array(), $body);
```

### 响应对象(Response Object)

[](#响应对象response-object)

- `code` - 请求响应码(HTTP Status code)
- `curl_info` - HTTP curl信息(HTTP Curl info)
- `headers` - 响应头(HTTP Response Headers)
- `body` - 处理后的响应消息体(Parsed body)
- `raw_body` - 原始响应消息体(Unparsed body)

### 高级设置(Advanced Configuration)

[](#高级设置advanced-configuration)

#### 自定义json\_decode选项(Custom JSON Decode Flags)

[](#自定义json_decode选项custom-json-decode-flags)

```
$httpRequest->jsonOpts(true, 512, JSON_NUMERIC_CHECK & JSON_FORCE_OBJECT & JSON_UNESCAPED_SLASHES);
```

#### 超时设置(Timeout)

[](#超时设置timeout)

```
$httpRequest->timeout(5); // 5s timeout
```

#### 代理(Proxy)

[](#代理proxy)

可以设置代理类型(you can also set the proxy type to be one of) `CURLPROXY_HTTP`, `CURLPROXY_HTTP_1_0`, `CURLPROXY_SOCKS4`, `CURLPROXY_SOCKS5`, `CURLPROXY_SOCKS4A`, and `CURLPROXY_SOCKS5_HOSTNAME`.

*check the [cURL docs](http://curl.haxx.se/libcurl/c/CURLOPT_PROXYTYPE.html) for more info*.

```
// quick setup with default port: 1080
$httpRequest->proxy('10.10.10.1');

// custom port and proxy type
$httpRequest->proxy('10.10.10.1', 8080, CURLPROXY_HTTP);

// enable tunneling
$httpRequest->proxy('10.10.10.1', 8080, CURLPROXY_HTTP, true);
```

##### 代理授权验证 (Proxy Authenticaton)

[](#代理授权验证-proxy-authenticaton)

```
// basic auth
$httpRequest->proxyAuth('username', 'password', CURLAUTH_DIGEST);
```

#### 缺省请求头 (Default Request Headers)

[](#缺省请求头-default-request-headers)

```
$httpRequest->defaultHeader('Header1', 'Value1');
$httpRequest->defaultHeader('Header2', 'Value2');
```

批量配置(You can set default headers in bulk by passing an array):

```
$httpRequest->defaultHeaders(array(
    'Header1' => 'Value1',
    'Header2' => 'Value2'
));
```

清除配置(You can clear the default headers anytime with):

```
$httpRequest->clearDefaultHeaders();
```

#### 缺省Curl选项 (Default cURL Options)

[](#缺省curl选项-default-curl-options)

You can set default [cURL options](http://php.net/manual/en/function.curl-setopt.php) that will be sent on every request:

```
$httpRequest->curlOpt(CURLOPT_COOKIE, 'foo=bar');
```

批量配置(You can set options bulk by passing an array):

```
$httpRequest->curlOpts(array(
    CURLOPT_COOKIE => 'foo=bar'
));
```

清除配置(You can clear the default options anytime with):

```
$httpRequest->clearCurlOpts();
```

#### SSL validation

[](#ssl-validation)

```
$httpRequest->verifyPeer(false); // Disables SSL cert validation
```

By default is `true`.

Http Watcher 使用(Http Watcher Usage)
-----------------------------------

[](#http-watcher-使用http-watcher-usage)

#### 支持的方法(Support Method)

[](#支持的方法support-method-1)

```
$watcher = \Ws\Http\Watcher::create($httpResponse);

$watcher->assertStatusCode($assertedStatusCode);
$watcher->assertTotalTimeLessThan($assertedTime);
$watcher->assertHeadersExist(array $assertedHeaders = []);
$watcher->assertHeaders(array $assertedHeaders = []);
$watcher->assertBody($assertedBody, $useRegularExpression = false);
$watcher->assertBodyJson($asserted, $onNotEqualVarExport = false);
$watcher->assertBodyJsonFile($assertedJsonFile, $onNotEqualPrintJson = false);
```

##### 例子(Examples)

[](#例子examples)

```
$httpRequest = \Ws\Http\Request::create();

$httpResponse = $httpRequest->get("https://api.github.com");
$watcher = \Ws\Http\Watcher::create($httpResponse);

$watcher
         ->assertStatusCode(200)
         ->assertHeadersExist(array(
            "X-GitHub-Request-Id",
            "ETag"
         ))
         ->assertHeaders(array(
            "Server" => "GitHub.com"
         ))
         ->assertBody('IS_VALID_JSON')
         ->assertTotalTimeLessThan(2);
```

```
$httpRequest = \Ws\Http\Request::create();
$httpResponse = $httpRequest->get("https://freegeoip.net/json/8.8.8.8");
$watcher = \Ws\Http\Watcher::create($httpResponse);

$watcher
         ->assertStatusCode(200)
         ->assertHeadersExist(array(
            "Content-Length"
         ))
         ->assertHeaders(array(
            "Access-Control-Allow-Origin" => "*"
         ))
         ->assertBodyJsonFile(dirname(__DIR__) . "/tests/Ws/Http/_json/freegeoip.net.json");
```

#### 查看所有例子(See the full examples) .

[](#查看所有例子see-the-full-examples-httpsgithubcomtoohamsterws-httpblobmastertestswshttpatestphp)

###  Health Score

36

—

LowBetter than 81% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity37

Limited adoption so far

Community13

Small or concentrated contributor base

Maturity59

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~5 days

Total

2

Last Release

3565d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/658da31642a9b88a028b8ccf1a6445c8ac1ae66cce0d5eaf4accd0a5856e72ae?d=identicon)[toohamster](/maintainers/toohamster)

---

Top Contributors

[![toohamster](https://avatars.githubusercontent.com/u/16458414?v=4)](https://github.com/toohamster "toohamster (17 commits)")

---

Tags

httpws-http

### Embed Badge

![Health badge](/badges/toohamster-ws-http/health.svg)

```
[![Health](https://phpackages.com/badges/toohamster-ws-http/health.svg)](https://phpackages.com/packages/toohamster-ws-http)
```

###  Alternatives

[guzzlehttp/psr7

PSR-7 message implementation that also provides common utility methods

8.0k1.0B3.1k](/packages/guzzlehttp-psr7)[psr/http-message

Common interface for HTTP messages

7.1k1.0B5.5k](/packages/psr-http-message)[psr/http-factory

PSR-17: Common interfaces for PSR-7 HTTP message factories

1.9k692.9M1.9k](/packages/psr-http-factory)[php-http/httplug

HTTPlug, the HTTP client abstraction for PHP

2.6k307.6M680](/packages/php-http-httplug)[psr/http-client

Common interface for HTTP clients

1.7k680.7M2.1k](/packages/psr-http-client)[symfony/http-client

Provides powerful methods to fetch HTTP resources synchronously or asynchronously

2.0k314.0M3.4k](/packages/symfony-http-client)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
