Request.php 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. <?php
  2. namespace Joypack\Tencent\Map;
  3. /**
  4. * 腾讯位置服务
  5. * 接口请求类
  6. */
  7. class Request
  8. {
  9. // 接口地址
  10. protected $url = 'https://apis.map.qq.com';
  11. protected $query = [];
  12. protected $field = [];
  13. public $logger;
  14. public function __construct(Logger $logger)
  15. {
  16. $this->logger = $logger;
  17. }
  18. public function uri($uri)
  19. {
  20. $this->url .= '/' . trim($uri, '/');
  21. return $this;
  22. }
  23. public function query($name, $value=null)
  24. {
  25. if(is_array($name)) {
  26. $this->query = array_merge($this->query, $name);
  27. } else {
  28. $this->query[$name] = $value;
  29. }
  30. return $this;
  31. }
  32. public function field($name, $value=null)
  33. {
  34. if(is_array($name)) {
  35. $this->field = array_merge($this->field, $name);
  36. } else {
  37. $this->field[$name] = $value;
  38. }
  39. return $this;
  40. }
  41. /**
  42. * method get
  43. * @param array $query
  44. * @return Response
  45. */
  46. public function get(array $query=[])
  47. {
  48. if($query) {
  49. $this->query($query);
  50. }
  51. $url = $this->mergeQuery($this->url, $this->query);
  52. return $this->create($url);
  53. }
  54. public function post(array $fields=[])
  55. {
  56. if($fields) {
  57. $this->field($fields);
  58. }
  59. $url = $this->mergeQuery($this->url, $this->query);
  60. return $this->create($url, 'POST', $this->field);
  61. }
  62. /**
  63. * <p>将参数合并到 URL</p>
  64. * @param string $url 请求的地址
  65. * @param array $query 请求参数
  66. * @param bool $recursive 是否递归合并
  67. * @return mixed
  68. */
  69. protected function mergeQuery($url, array $query, bool $recursive=false)
  70. {
  71. if(empty($url)) {
  72. return null;
  73. }
  74. // 没有设置参数时直接返回地址
  75. if(empty($query)) {
  76. return $url;
  77. }
  78. $parsed = parse_url($url);
  79. // 合并参数
  80. if(isset($parsed['query'])) {
  81. $url = substr($url, 0, strpos($url, '?'));
  82. $str_parsed = [];
  83. parse_str($parsed['query'], $str_parsed);
  84. if($recursive) {
  85. $query = array_merge_recursive($str_parsed, $query);
  86. } else {
  87. $query = array_merge($str_parsed, $query);
  88. }
  89. } else {
  90. $url = rtrim($url, '/?');
  91. }
  92. // 生成 query 字符串
  93. $url = "{$url}?" . http_build_query($query);
  94. return $url;
  95. // 处理锚点
  96. if(isset($parsed['fragment'])) {
  97. $url .= "#{$parsed['fragment']}";
  98. }
  99. return $url;
  100. }
  101. /**
  102. * <p>创建请求</p>
  103. * @param string $url 请求地址
  104. * @param string $method 请求方式
  105. * @param array $data POST 数据
  106. * @return Response
  107. */
  108. protected function create($url, $data=null)
  109. {
  110. //$referer = "{$_SERVER['REQUEST_SCHEME']}://{$_SERVER['SERVER_NAME']}";
  111. //$header = [
  112. //"CLIENT-IP: {$_SERVER['REMOTE_ADDR']}",
  113. //"X-FORWARDED-FOR: {$_SERVER['REMOTE_ADDR']}",
  114. //"Content-Type: application/json; charset=utf-8",
  115. //"Accept: */*"
  116. //];
  117. $ch = curl_init();
  118. curl_setopt($ch, CURLOPT_URL, $url);
  119. //curl_setopt($ch, CURLOPT_HEADER, $header);
  120. curl_setopt($ch, CURLOPT_TIMEOUT, 10);
  121. //curl_setopt($ch, CURLOPT_REFERER, $referer);
  122. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  123. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
  124. curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
  125. if(!is_null($data)) {
  126. curl_setopt($ch, CURLOPT_POST, true);
  127. if($data) {
  128. curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
  129. }
  130. }
  131. $original = curl_exec($ch);
  132. $error = null;
  133. if($errno = curl_errno($ch)) {
  134. $error = curl_error($ch);
  135. }
  136. curl_close($ch);
  137. $this->logger->info('请求地址', $url);
  138. if($data) {
  139. $this->logger->info('请求数据', $data);
  140. }
  141. $this->logger->info('响应数据', $original);
  142. return new Response($errno, $error, $original, $this->logger);
  143. }
  144. }