php socket 发送HTTP请求 POST json

php socket 发送HTTP请求 POST json

* HttpRequest.php

<?php
namespace et\http;
 
/**
 * Created by PhpStorm.
 * User: mingzhanghui
 * Date: 2018-09-18
 * Time: 16:19
 */
class HttpRequest {
    const BUFSIZE = 4096;
    const DEFAULT_OPTIONS = [
        'port' => 80,
        'timeout'=> 30
    ];
 
    const DEFAULT_HEADRES = [
        'Content-Type' => 'application/x-www-form-urlencoded'
    ];
 
    public static function mergeDefaultOptions(Array& $to, Array $default) {
        foreach ($default as $key => $value) {
            if (!array_key_exists($key, $to)) {
                $to[$key] = $value;
            }
        }
    }
 
    /**
     * @param $host string remote server '192.168.1.219:7102' without http://
     * @param $uri string remote uri '/service/pageinfo/'
     * @param $headers
     * @param string $body
     * @param array $options
     * @return string
     * @throws \Exception
     */
    public static function post($host, $uri, $headers = [], $body = "", $options = []) {
        self::mergeDefaultOptions($options, self::DEFAULT_OPTIONS);
 
        $socket = fsockopen($host, $options['port'], $errno, $errstr, $options['timeout']);
        if (!$socket) {
            throw new \Exception(sprintf("%s(%d)", $errstr, $errno));
        }
 
        fwrite($socket, sprintf("POST %s HTTP/1.0\r\n", $uri));
        fwrite($socket, "User-Agent: Socket_Backstage\r\n");
        fwrite($socket, sprintf("Content-length: %d\r\n", strlen($body)));
        fwrite($socket, "Accept: */*\r\n");
 
        self::mergeDefaultOptions($headers, self::DEFAULT_HEADRES);
        foreach ($headers as $name => $value) {
            fwrite($socket, $name.": ".$value."\r\n");
        }
        fwrite($socket, "\r\n");
 
        fwrite($socket, $body."\r\n");
        fwrite($socket, "\r\n");
 
        $header = "";
        while ($str = trim(fgets($socket, self::BUFSIZE))) {
            $header .= $str;
        }
        $resp = "";
        while (!feof($socket)) {
            $resp .= fgets($socket, self::BUFSIZE);
        }
        return $resp;
    }
 
    public static function get($host, $uri, $data, $port=80, $timeout = 30) {
        $socket = fsockopen($host, $port, $errno, $errstr, $timeout);
        if (!$socket) {
            throw new \Exception(sprintf("%s(%d)", $errstr, $errno));
        }
        $qs = http_build_query($data, '', '&');
 
        fwrite($socket, sprintf("GET %s?%s HTTP/1.0\r\n", $uri, $qs));
        fwrite($socket, "User-Agent: Socket_Backstage\r\n");
        fwrite($socket, "Content-type: application/x-www-form-urlencoded\r\n");
        fwrite($socket, sprintf("Content-length: %d\r\n", strlen($qs)));
        fwrite($socket, "Accept: */*\r\n");
        fwrite($socket, "\r\n");
        fwrite($socket, "\r\n");
 
        $header = "";
        while ($str = trim(fgets($socket, self::BUFSIZE))) {
            $header .= $str;
        }
        $resp = "";
        while (!feof($socket)) {
            $resp .= fgets($socket, self::BUFSIZE);
        }
        return $resp;
    }
 
    /**
     * $.post(url, data, function(data) { ... })
     * @param $url
     * @param $data
     * @return mixed
     * @throws \Exception
     */
    public static function post_url($url, Array $data) {
        $components = parse_url($url);
        if ($components === false) {
            throw new \Exception('url is not valid');
        }
        if ($components['scheme'] != 'http') {
            throw new \Exception('scheme is not http');
        }
        $host = $components['host'];
        $path = empty($components['path']) ? '/' : $components['path'];
 
        $headers = [
            'Content-Type' => 'application/x-www-form-urlencoded'
        ];
        $body = http_build_query($data, '', '&');
 
        return self::post($host, $path, $headers, $body, self::DEFAULT_OPTIONS);
    }
}

* test

index.php

<?php
/**
 * Created by PhpStorm.
 * User: mingzhanghui
 * Date: 2018-09-18
 * Time: 10:46
 */
include 'HttpRequest.php';
 
// $response = \et\http\HttpRequest::get('www.baidu.com', '/', []);
// $body = http_build_query($data, '', '&');
 
$headers = ['Content-Type' => 'application/json'];
// $body = "{\"query\":{\"bool\":{\"must\":[{\"match_phrase_prefix\":{\"request\":\"/cgi-bin/service\"}},{\"range\":{\"@timestamp\":{\"gte\":\"2017-09-11 09:26:10\",\"lte\":\"2018-09-13 09:27:10\",\"format\":\"yyyy-MM-dd HH:mm:ss\"}}},{\"range\":{\"request_time\":{\"gte\":5}}}]}},\"sort\":[{\"request_time\":{\"order\":\"desc\"}}],\"size\":10}";
 
function buildQueryBodySlow($uri, $begin, $end, $requestTime = 5, $size = 10) {
    $o = new \stdClass();
    $o->query = new \stdClass();
    $o->query->bool = new \stdClass();
    $o->query->bool->must = [
        0 => ['match_phrase_prefix' => [
            'request' => $uri
        ]],
        1 => ['range' => [
            '@timestamp' => [
                "gte"=> $begin,
                "lte"=> $end,
                "format"=> "yyyy-MM-dd HH:mm:ss"
            ]
        ]],
        2 => ['range' => [
            'request_time' => ['gte' => $requestTime]
        ]]
    ];
    $o->sort = [
        0 => [
            'request_time'=> [
                'order'=>'desc'
            ]
        ]
    ];
    $o->size = $size;
 
    return json_encode($o);
}
 
$body = buildQueryBodySlow(
    '/cgi-bin/service',
    "2017-09-11 09:26:10",
    "2018-09-13 09:27:10",
    5,
    1
);
 
// post json
$response = et\http\HttpRequest::post(
    '172.16.0.245',
    '/filebeat-2018.09.12/_search?pretty',
    $headers,
    $body,
    ['port'=>9200]
);
 
echo '<pre>';
print_r($response);
 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/112663.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Unity协程认知

    Unity协程认知协程使用之前请注意以下几点:1.协程只需要调用一次,只需要调用一次,只需要调用一次!2.yieldreturn表示挂起,挂起的意思是协程里的变量会被保留,直到达到return的条件才会执行return以下的代码片段。举个例子:yieldreturnnewWaitForSeconds(0.9f);//执行到这儿,等待0.9s,继续执行这句代码以下的代码片段3.开启协程的方式:a.Sta

    2022年6月28日
    25
  • rsyslog配置_ssh host key verification fail

    rsyslog配置_ssh host key verification fail1.rsyslog介绍Rsyslog的全称是rocket-fastsystemforlog,它提供了高性能,高安全功能和模块化设计。rsyslog能够接受从各种各样的来源,将其输入,输出的结果到不同的目的地。rsyslog可以提供超过每秒一百万条消息给目标文件。特点:多线程 可以通过许多协议进行传输UDP,TCP,SSL,TLS,RELP; 直接将日志写入到数据库; 支…

    2022年9月25日
    5
  • DeepLearning之LSTM模型输入参数:time_step, input_size, batch_size的理解[通俗易懂]

    DeepLearning之LSTM模型输入参数:time_step, input_size, batch_size的理解[通俗易懂]1.LSTM模型输入参数理解(LongShort-TermMemory)lstm是RNN模型的一种变种模式,增加了输入门,遗忘门,输出门。LSTM也是在时间序列预测中的常用模型。小白我也是从这个模型入门来开始机器学习的坑。LSTM的基本概念与各个门的解释已经有博文写的非常详细:推荐博文:【译】理解LSTM(通俗易懂版)这篇文章写的非常详细,生动,概念解释的非常清楚。我也是从这个…

    2025年8月31日
    4
  • 分享一个不错的数据分析实战案例【全程附图】EXCEL

    分享一个不错的数据分析实战案例【全程附图】EXCEL利用最近一次的营销活动的信息,分析什么对推销结果的影响最大,如何确定银行定期产品推销中最具价值的客户。

    2022年6月1日
    39
  • 安卓错误总结

    安卓错误总结

    2022年2月7日
    47
  • PORUHBUB.CROWN_ios安卓 testlight /apps/android开发包安装

    PORUHBUB.CROWN_ios安卓 testlight /apps/android开发包安装PORUHBUB.CROWN_ios安卓testlight/apps/android#gym#output#enterip服务器地址https://1024td.com@91.189.91.93enterapp_store_connect_api_keyupload_to_testflightnotification该命令可以及时通知我们当前操作状态;完整配置如下#update_fastlanedefault_platform(:iOS)platform:i..

    2022年10月1日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号