Форум программистов, компьютерный форум, киберфорум
Наши страницы
Max Dark
Войти
Регистрация
Восстановить пароль
Оценить эту запись

PHP класс для отправки данных через cURL

Запись от Max Dark размещена 12.07.2016 в 04:36
Обновил(-а) Max Dark 12.07.2016 в 05:03

Набросал небольшой велосипед для работы с cURL.
Позволяет отправлять GET/POST запросы, загружать файлы на сервер
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?php
require_once 'cURLWrapper.php';
 
// отправка 'обычного' POST
function send_post_test( \cURLWrapper $curl, $url = 'https://httpbin.org/post') {
 
    $request = [
        'a' => 1,
        'b' => 'тра ля-ля',
    ];
 
    return $curl->send_post_urlencoded( $url, $request );
}
 
// загрузка файлов
function send_multidata_test( \cURLWrapper $curl, $url = 'https://httpbin.org/post' ) {
 
    $request = [
        'a' => 1,
        'b' => 'тра ля-ля',
    ];
    
    $file_list = [
        'file' => __FILE__,
    ];
 
    return $curl->send_multipart( $url, $request, $file_list );
}
Загрузка файлов основана на коде из коментария к описанию функции curl_setopt
cURLWrapper.php
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
<?php
/**
 * \cURLWrapper is helper class that allows to send GET/POST requests, upload files
 *
 * @package cURLWrapper
 * @author  Maxim 'Cra3y'
 * @license LGPL
 * @link https://gist.github.com/max-dark/4c08575bcff9d4c6ea926cd8c9813c01
 *
 * Date: 12.07.16
 */
 
/**
 * Class \cURLWrapper
 *
 * cURLWrapper is helper class that allows to send GET/POST requests, upload files
 *
 * @depends PHP >= 5.4, cURL, Fileinfo
 */
class cURLWrapper {
    const CRLF = "\r\n";
    const CRLFx2 = self::CRLF . self::CRLF;
 
    /** @var string $boundary */
    private $boundary;
    /** @var \finfo $finfo file info tool */
    private $finfo;
    /** @var array $last_info */
    private $last_info = [ ];
    /** @var resource $curl_handle */
    private $curl_handle = null;
 
    /**
     * cURLWrapper constructor.
     */
    public function __construct() {
        $this->finfo = new finfo( FILEINFO_MIME_TYPE );
    }
 
    /**
     * Send 'multipart/form-data' request
     *
     * @param string   $url
     * @param string[] $request array of inputs values
     * @param array    $files   [Optional] list of files to upload
     *
     * @return string|bool
     */
    function send_multipart( $url, $request, $files = [ ] ) {
        $this->boundary = '------------------------' . uniqid();
        $files          = array_map( 'realpath', array_filter( $files ) );
        $data           = $this->format_multipart( $request, $files );
        $content_type   = 'multipart/form-data; boundary=' . $this->boundary;
 
        return $this->send_post( $url, $data, $content_type );
    }
 
    /**
     * Encode request to 'multipart/form-data'
     * 
     * based on code from http://php.net/manual/ru/function.curl-setopt.php#119350
     *
     * @param string[] $request array of inputs values
     * @param string[] $files   [Optional] list of files to upload
     *
     * @return string multipart/form-data
     */
    function format_multipart( $request, $files = [ ] ) {
        $parts     = [ ];
        $delimiter = '--' . $this->boundary . self::CRLF;
 
        foreach ( $request as $name => $value ) {
            $parts[] = $delimiter . $this->format_form_part( $name, $value );
        }
        foreach ( $files as $name => $value ) {
            $parts[] = $delimiter . $this->format_file_part( $name, $value );
        }
 
        $parts[] = '--' . $this->boundary . '--' . self::CRLF;
 
        return implode( '', $parts );
    }
 
    /**
     * Encode field to 'multipart/form-data'
     *
     * @param string $name  name of field
     * @param string $value value of field
     *
     * @return string
     */
    function format_form_part( $name, $value ) {
        $body = 'Content-Disposition: form-data; name="' . $name . '"';
        $body .= self::CRLFx2 . $value . self::CRLF;
 
        return $body;
    }
 
    /**
     * Encode file to 'multipart/form-data'
     *
     * @param string $name  name of field
     * @param string $value filename
     *
     * @return string
     */
    function format_file_part( $name, $value ) {
        $file = basename( $value );
        $mime = $this->finfo->file( $value );
 
        $body = 'Content-Disposition: form-data; name="' . $name . '"; ';
        $body .= 'filename="' . $file . '"' . self::CRLF;
        $body .= 'Content-Type: ' . $mime . self::CRLFx2;
        $body .= file_get_contents( $value ) . self::CRLF;
 
        return $body;
    }
 
    /**
     * Send post request
     *
     * @param string $url
     * @param string $data
     * @param string $content_type
     * @param array  $options [Optional]
     *
     * @return bool|string
     */
    public function send_post( $url, $data, $content_type, $options = [ ] ) {
        $headers = [
            'Content-Length: ' . strlen( $data ),
            'Content-Type: ' . $content_type,
        ];
 
        $post_options = [
            CURLOPT_HTTPHEADER => $headers,
            CURLOPT_POST       => true,
            CURLOPT_POSTFIELDS => $data,
        ];
 
        return $this->send_request( $url, $options + $post_options );
    }
 
    /**
     * Send request to $url
     *
     * @param string $url
     * @param array  $options [Optional]
     *
     * @return string|bool Result of request, false if fail
     */
    function send_request( $url, $options = [ ] ) {
        $defaults = [
            CURLOPT_URL            => $url,
            CURLOPT_HEADER         => false,
            CURLOPT_RETURNTRANSFER => true,
        ];
        $options  = $options + $defaults;
 
        $this->curl_handle = curl_init();
 
        curl_setopt_array( $this->curl_handle, $options );
 
        $res = curl_exec( $this->curl_handle );
 
        $this->last_info = curl_getinfo( $this->curl_handle );
 
        curl_close( $this->curl_handle );
 
        return $res;
    }
 
    /**
     * Send 'application/x-www-form-urlencoded' post request
     *
     * @param string   $url
     * @param string[] $request array of inputs values
     * @param array    $options [Optional]
     *
     * @return string|bool
     */
    function send_post_urlencoded( $url, $request, $options = [ ] ) {
        $data         = http_build_query( $request );
        $content_type = 'application/x-www-form-urlencoded';
 
        return $this->send_post( $url, $data, $content_type, $options );
    }
 
    /**
     * Info about last request
     *
     * @return array
     */
    public function getLastInfo() {
        return $this->last_info;
    }
}
Просмотров 589 Комментарии 0
Всего комментариев 0
Комментарии
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.