PluginProbe
WPGet API – Connect to any external REST API / 1.5.0
WPGet API – Connect to any external REST API v1.5.0
1.9.2 1.9.3 1.9.4 1.9.5 1.9.6 1.9.7 1.9.8 1.9.9 2.0.0 2.0.1 2.0.2 2.0.3 2.0.4 2.0.5 2.0.6 2.1.0 2.1.1 2.1.3 2.1.4 2.1.5 2.2.0 2.2.1 2.2.10 2.2.2 2.2.3 All 97 releases
wpgetapi / includes / class-api.php

class-api.php in WPGet API – Connect to any external REST API 1.5.0, at includes/class-api.php

480 lines 16.9 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 // Exit if accessed directly
4 if ( ! defined( 'ABSPATH' ) ) exit;
5
6 /**
7 * The main class
8 *
9 * @since 1.0.0
10 */
11 class WpGetApi_Api {
12
13 public $encryption = ''; // the encryption class
14
15 public $setup = ''; // store the setup data from the admin page
16 public $api = ''; // store the api's from the admin page
17
18 public $api_id = ''; // the api_id that we are wanting to get
19 public $endpoint_id = ''; // the endpoint_id that we are wanting to get
20 public $args = ''; // the args
21 public $keys = ''; // the keys we want to retrieve
22
23 public $base_url = ''; // base url of the API
24 public $method = 'GET'; // the endpoint method GET POST etc
25 public $cache_time = ''; // the time to cache
26 public $endpoint = ''; // the endpoint that we will get
27 public $query_parameters = ''; // the query paramaters appended to url
28 public $header_parameters = ''; // the header paramaters
29 public $body_parameters = ''; // the body paramaters
30 public $body_json_encode = ''; // body_json_encode body
31 public $body_url_encode = ''; // urlencode body
32
33 public $response = ''; // the returned response
34
35 public $final_url = ''; // final URL
36 public $final_request_args = array(); // final request_args
37
38 public $results_format = 'json_string'; // reseults format
39
40 public $timeout = 10; // the timeout
41 public $sslverify = 1; // the paramaters
42
43
44 /**
45 * Main constructor
46 *
47 * @since 1.0.0
48 *
49 */
50 public function __construct( $api_id = '', $endpoint_id = '', $args = array(), $keys = array() ) {
51
52 $this->setup = get_option( 'wpgetapi_setup' );
53 $this->api = get_option( 'wpgetapi_' . $api_id );
54
55 $this->encryption = new WpGetApi_Encryption();
56 $this->api_id = sanitize_text_field( $api_id );
57 $this->endpoint_id = sanitize_text_field( $endpoint_id );
58 $this->keys = $keys;
59 $this->args = $args;
60
61 add_filter( 'wpgetapi_raw_data', array( $this, 'maybe_add_debug_info' ), 5, 2 );
62
63 }
64
65
66 /**
67 * Init our api data
68 */
69 public function init() {
70
71 // do some checks
72 if( empty( $this->setup ) || ! isset( $this->setup['apis'] ) || empty( $this->setup['apis'] ) )
73 return 'No API found.';
74
75 // do some checks
76 if( ! $this->api || ! isset( $this->api['endpoints'] ) || empty( $this->api['endpoints'] ))
77 return 'API not found.';
78
79 // loop through api's
80 // set base_url
81 foreach ( $this->setup['apis'] as $index => $api_item ) {
82 if( $this->api_id == $api_item['id'] ) {
83 $this->base_url = isset( $api_item['base_url'] ) && ! empty( $api_item['base_url'] ) ? esc_url_raw( $api_item['base_url'] ) : '';
84 }
85 }
86
87 // loop through endpoints
88 foreach ( $this->api['endpoints'] as $index => $endpoint ) {
89
90 if( $this->endpoint_id == $endpoint['id'] ) {
91
92 $this->method = isset( $endpoint['method'] ) && $endpoint['method'] != '' ? sanitize_text_field( $endpoint['method'] ) : 'GET';
93 $this->cache_time = isset( $endpoint['cache_time'] ) && ! empty( $endpoint['cache_time'] ) ? absint( $endpoint['cache_time'] ) : '';
94 $this->endpoint = isset( $endpoint['endpoint'] ) && ! empty( $endpoint['endpoint'] ) ? sanitize_text_field( $endpoint['endpoint'] ) : '';
95
96 $this->query_parameters = isset( $endpoint['query_parameters'] ) && ! empty( $endpoint['query_parameters'] ) ? $this->do_parameters( $endpoint['query_parameters'] ) : array();
97
98 $this->header_parameters = isset( $endpoint['header_parameters'] ) && ! empty( $endpoint['header_parameters'] ) ? $this->do_parameters( $endpoint['header_parameters'] ) : array();
99
100 $this->body_parameters = isset( $endpoint['body_parameters'] ) && ! empty( $endpoint['body_parameters'] ) ? $this->do_parameters( $endpoint['body_parameters'] ) : array();
101
102 $this->body_json_encode = isset( $endpoint['body_json_encode'] ) && $endpoint['body_json_encode'] == 'true' ? true : false;
103 $this->body_url_encode = isset( $endpoint['body_json_encode'] ) && $endpoint['body_json_encode'] == 'url' ? true : false;
104
105 $this->results_format = isset( $endpoint['results_format'] ) ? sanitize_text_field( $endpoint['results_format'] ) : $this->results_format;
106 }
107 }
108
109 $this->timeout = isset( $this->api['timeout'] ) && ! empty( $this->api['timeout'] ) ? $this->api['timeout'] : $this->timeout;
110 $this->sslverify = isset( $this->api['sslverify'] ) ? absint( $this->api['sslverify'] ) : $this->sslverify;
111
112 }
113
114
115 /**
116 * The main function to output the data
117 *
118 * @param string $field Field to retrieve
119 */
120 public function endpoint_output() {
121 return $this->do_the_call();
122 }
123
124
125 /**
126 * Sort out the parameters if they exist
127 */
128 public function do_parameters( $parameters ) {
129
130 $new_array = array();
131 $parameters = $this->decrypt($parameters);
132
133 if( is_array( $parameters ) ) {
134 foreach ( $parameters as $key => $parameter ) {
135 if( ! empty( $parameter['name'] ) && ! empty( $parameter['value'] ) ) {
136 $parameter['value'] = stripslashes( $parameter['value'] );
137 $new_array[ sanitize_text_field( $parameter['name'] ) ] = $parameter['value'];
138 }
139 }
140 }
141
142 // look for array or json string and sort these out - for using such things in shortcode
143 if( is_array( $new_array ) ) {
144
145 foreach ( $new_array as $key => $value ) {
146
147 // checking if the parameters have a json string
148 if ( substr( $value, 0, 1 ) === '{' && substr( $value, -1 ) === '}' ) {
149 $new_array[ $key ] = json_decode( $value, true);
150 }
151
152 // checking if the parameters have an array within the string
153 // if they do, create them as an actual array
154 if ( substr( $value, 0, 1 ) === '[' && substr( $value, -1 ) === ']' ) {
155 $new_array[ $key ] = array( $value );
156 }
157
158 }
159
160 }
161
162 return $new_array;
163
164 }
165
166 /**
167 * Send the request and return our data
168 */
169 public function do_the_call() {
170
171 $this->init();
172
173 // build the URL
174 $this->final_url = apply_filters( 'wpgetapi_final_url', $this->build_url(), $this );
175
176 // build the request args
177 $this->final_request_args = apply_filters( 'wpgetapi_final_request_args', $this->build_request_args(), $this );
178
179 // POST request
180 if( $this->method == 'POST' )
181 $this->response = $this->POST_request();
182
183 // GET request
184 if( $this->method == 'GET' )
185 $this->response = $this->GET_request();
186
187 // wp error
188 if( is_wp_error( $this->response ) ) {
189 return apply_filters( 'wpgetapi_raw_error_data', json_encode( $this->response ), $this );
190 }
191
192 $data = wp_remote_retrieve_body( $this->response );
193
194 // returning in JSON format
195 if( $this->results_format == 'json_string' || $this->results_format == 'json_decoded' )
196 $data = $this->return_data( $data );
197
198 return apply_filters( 'wpgetapi_raw_data', $data, $this );
199
200 }
201
202
203 /**
204 * Build the request url with the ability to add args
205 */
206 public function build_url() {
207
208 // first make sure our endpoint starts with a slash
209 if ( substr( $this->endpoint, 0, 1 ) != '/' )
210 $this->endpoint = '/' . $this->endpoint;
211
212 $url = untrailingslashit( $this->base_url ) . $this->endpoint;
213
214 // add empty array - was getting errors if it was just null or false
215 $params = empty( $this->query_parameters ) ? array(''=>'') : $this->query_parameters;
216
217 return add_query_arg( $params, $url );
218
219 }
220
221
222 /**
223 * build the header with the ability to add args
224 */
225 public function build_request_args() {
226
227 // add our header parameters to the headers
228 $headers = apply_filters( 'wpgetapi_header_parameters', array(
229 'headers' => $this->header_parameters,
230 ), $this );
231
232
233 // if doing POST request, include body paramters
234 if( $this->method == 'POST' ) {
235
236 $this->body_parameters = apply_filters( 'wpgetapi_body_parameters', $this->body_parameters, $this );
237
238 // do we json_encode the entire body as a string
239 if( $this->body_json_encode == true )
240 $this->body_parameters = json_encode( $this->body_parameters );
241
242
243 // do we urlencode the entire body as a string
244 if( $this->body_url_encode == true ) {
245 $data_raw = '';
246 foreach ($this->body_parameters as $key => $value){
247 $data_raw = $data_raw . $key . "=" . urlencode($value) . "&";
248 }
249 $this->body_parameters = $data_raw;
250
251 }
252
253 // add our body parameters
254 if( $this->body_parameters && ! empty( $this->body_parameters ) )
255 $headers['body'] = $this->body_parameters;
256
257 }
258
259 // add headers to our final request args
260 $this->final_request_args = wp_parse_args( $headers, $this->final_request_args );
261
262 // build the args taht are sent to the request
263 $default_args = apply_filters( 'wpgetapi_default_request_args_parameters', array(
264 'timeout' => $this->timeout,
265 'sslverify' => $this->sslverify,
266 'redirection' => 5,
267 'blocking' => true,
268 'cookies' => array(),
269 ) );
270
271 return wp_parse_args( $this->final_request_args, $default_args );
272
273 }
274
275
276 /**
277 * Do a GET request
278 */
279 public function GET_request() {
280 $response = '';
281 // so we can so something before the remote_get (caching)
282 $response = apply_filters( 'wpgetapi_before_get_request', $response, $this );
283 if( empty( $response ) )
284 $response = wp_remote_get( $this->final_url, $this->final_request_args );
285
286 return $response;
287 }
288
289
290 /**
291 * Do a POST request
292 */
293 public function POST_request() {
294 $response = wp_remote_post( $this->final_url, $this->final_request_args );
295 return $response;
296 }
297
298
299 /**
300 * return data
301 */
302 public function return_data( $data ) {
303
304 $data = apply_filters( 'wpgetapi_json_response_body_before_decode', $data, $this->keys );
305
306 // converts all data to arrays, removing objects
307 $data = json_decode( $data, true, 512 );
308
309 $data = apply_filters( 'wpgetapi_json_response_body', $data, $this->keys );
310
311 if( $this->results_format == 'json_string' )
312 return trim( json_encode( $data ),'"');
313
314 if( $this->results_format == 'json_decoded' )
315 return $data;
316
317 }
318
319
320 /**
321 * decrypt our parameters from the DB
322 */
323 public function decrypt( $array_or_string ) {
324
325 if( is_string($array_or_string) ){
326 $array_or_string = $this->encryption->decrypt($array_or_string);
327 }elseif( is_array($array_or_string) ){
328 foreach ( $array_or_string as $key => &$value ) {
329 if( $key === 'name' )
330 continue;
331 if ( is_array( $value ) ) {
332 $value = $this->decrypt($value);
333 }
334 else {
335 $value = $this->encryption->decrypt($value);
336
337 }
338 }
339 }
340 return $array_or_string;
341 }
342
343
344 /**
345 * debug
346 */
347 public function maybe_add_debug_info( $data, $this_data ) {
348
349 if( isset( $this->args['debug'] ) && ( $this->args['debug'] === true || $this->args['debug'] === 'true' ) ) {
350
351 ob_start(); ?>
352
353 <style>
354
355 .wpgetapi-debug {
356 background: #f4f4f4;
357 padding: 20px;
358 border: 1px solid #ccc;
359 margin: 20px;
360 font-size: 15px;
361 }
362 .wpgetapi-debug
363 .wpgetapi-debug p
364 .wpgetapi-debug h5
365 .wpgetapi-debug h6 {
366 color: #000;
367 line-height: 1 !important;
368 text-transform: none !important;
369 font-family: sans-serif !important;
370 letter-spacing: 0px !important;
371 }
372 .wpgetapi-debug p.small {
373 font-size: 85%;
374 color: #999;
375 margin-bottom: 15px !important
376 }
377 .wpgetapi-debug h5 {
378 font-weight: bold;
379 font-size: 18px;
380 margin: 0 0 3px;
381 text-transform: none !important;
382 }
383 .wpgetapi-debug .debug-item {
384 margin: 10px 0;
385 background: #fff;
386 padding: 15px 20px;
387 display: inline-block !important;;
388 width: 100% !important;
389 box-shadow: 0 0 5px rgba(0,0,0,0.1)
390 }
391 .wpgetapi-debug .debug-item h6 {
392 font-weight: bold;
393 font-size: 16px;
394 margin: 0 0 3px;
395 text-transform: none !important;
396 }
397 .wpgetapi-debug .debug-item .debug-result,
398 .wpgetapi-debug .debug-item .debug-result pre {
399 font-family: monospace !important;
400 font-size: 15px !important;
401 margin: 0 !important;
402 padding: 10px 12px;
403 background: #f8f8f8;
404 }
405 .wpgetapi-debug .debug-item .debug-result pre {
406 border: none;
407 padding: 5px
408 }
409
410 </style>
411
412 <div class="wpgetapi-debug">
413
414 <h5><strong><?php esc_html_e( 'WPGetAPI, Debug Mode - Plugin Version', 'wpgetapi' ); ?> <?php esc_html_e( WpGetApi()->version ); ?></strong></h5>
415 <p class="small"><?php esc_html_e( 'Below you will find debug info for the current API call. To turn this off, set debug to false in your shortcode or template tag.', 'wpgetapi' ); ?><br><?php esc_html_e( 'Connecting to API\'s can be tricky - if you require help, please see the', 'wpgetapi' ); ?> <a target="_blank" href="https://wpgetapi.com/docs/"><?php esc_html_e( 'Documentation', 'wpgetapi' ); ?></a>.</p>
416
417 <div class="debug-item">
418 <h6><?php esc_html_e( 'Full URL', 'wpgetapi' ); ?></h6>
419 <p class="small"><?php esc_html_e( 'The full URL that is being called.', 'wpgetapi' ); ?></p>
420 <div class="debug-result"><?php esc_html_e( $this->final_url ); ?></div>
421 </div>
422
423 <div class="debug-item">
424 <h6><?php esc_html_e( 'Data Output', 'wpgetapi' ); ?></h6>
425 <p class="small"><?php esc_html_e( 'The resulting output that has been returned from the API.', 'wpgetapi' ); ?></p>
426 <div class="debug-result"><?php wpgetapi_pp( $data ); ?></div>
427 </div>
428
429 <div class="debug-item">
430 <h6><?php esc_html_e( 'Arguments', 'wpgetapi' ); ?></h6>
431 <p class="small"><?php esc_html_e( 'The arguments set within your shortcode or template tag.', 'wpgetapi' ); ?></p>
432 <div class="debug-result"><?php wpgetapi_pp( $this->args ); ?></div>
433 </div>
434
435 <div class="debug-item">
436 <h6><?php esc_html_e( 'Query String', 'wpgetapi' ); ?></h6>
437 <p class="small"><?php esc_html_e( 'The query string parameters (if any) that you have set within the endpoint settings.', 'wpgetapi' ); ?></p>
438 <div class="debug-result"><?php wpgetapi_pp( $this->query_parameters ); ?></div>
439 </div>
440
441 <div class="debug-item">
442 <h6><?php esc_html_e( 'Headers', 'wpgetapi' ); ?></h6>
443 <p class="small"><?php esc_html_e( 'The header parameters (if any) that you have set within the endpoint settings.', 'wpgetapi' ); ?></p>
444 <div class="debug-result"><?php wpgetapi_pp( $this->header_parameters ); ?></div>
445 </div>
446
447 <div class="debug-item">
448 <h6><?php esc_html_e( 'Body', 'wpgetapi' ); ?></h6>
449 <p class="small"><?php esc_html_e( 'The body parameters (if any) that you have set within the endpoint settings.', 'wpgetapi' ); ?></p>
450 <div class="debug-result"><?php wpgetapi_pp( $this->body_parameters ); ?></div>
451 </div>
452
453 <div class="debug-item">
454 <h6><?php esc_html_e( 'Final Request Arguments', 'wpgetapi' ); ?></h6>
455 <p class="small"><?php esc_html_e( 'The final request arguments sent in the API request. Includes headers and body arguments.', 'wpgetapi' ); ?></p>
456 <div class="debug-result"><?php wpgetapi_pp( $this->final_request_args ); ?></div>
457 </div>
458
459 <div class="debug-item">
460 <h6><?php esc_html_e( 'Response', 'wpgetapi' ); ?></h6>
461 <p class="small"><?php esc_html_e( 'The full response from the API request.', 'wpgetapi' ); ?></p>
462 <div class="debug-result"><?php wpgetapi_pp( $this->response); ?></div>
463 </div>
464
465 </div>
466
467 <?php
468
469 return ob_get_clean();
470
471 } else {
472
473 return $data;
474
475 }
476
477 }
478
479
480 }