HttpClient.php 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  1. <?php
  2. function doService($url,HttpParameter $httpParameters, $headers, $connectTimeout, $readTimeout){
  3. switch ($httpParameters->getHttpMethod()) {
  4. case HttpMethod::GET:
  5. $result = doGet($url,$headers,$httpParameters->getParams(), $connectTimeout, $readTimeout);
  6. break;
  7. case HttpMethod::POST:
  8. if ($httpParameters->isFiles()) {
  9. $result = doPostWithFiles($url,$headers,$httpParameters->getParams(), $httpParameters->getListFiles());
  10. break;
  11. }
  12. $result = doPost($url,$headers,$httpParameters->getParams(), $connectTimeout, $readTimeout);
  13. break;
  14. default:
  15. $result = null;
  16. break;
  17. }
  18. return $result;
  19. }
  20. function doServiceWithJson($url, $json, $headers, $connectTimeout, $readTimeout){
  21. $flag=1;
  22. while($flag <= HttpConnection::RENNECT_TIMES) {
  23. try {
  24. if (!function_exists('curl_init')) {
  25. throw new Exception("CURL扩展没有开启!");
  26. }
  27. $curl = curl_init();
  28. array_push($headers, 'Content-Type:application/json;charset=UTF-8');
  29. $curl = HttpConnection::buildHttpRequest($curl, $url, $headers);
  30. // 提交post请求
  31. curl_setopt($curl, CURLOPT_POSTFIELDS, $json);
  32. $output = curl_exec($curl);
  33. if ($output === false) {
  34. $res = array(
  35. "code" => 1001,
  36. "message" => curl_error($curl)
  37. );
  38. $output = json_encode($res);
  39. }
  40. // 关闭CRUL
  41. curl_close($curl);
  42. } catch (Exception $exc) {
  43. // 关闭CRUL
  44. curl_close($curl);
  45. $res = array(
  46. "code" => 1001,
  47. "message" => $exc->getMessage()
  48. );
  49. $output = json_encode($res);
  50. }
  51. if($output){
  52. break;
  53. }
  54. $flag++;
  55. }
  56. return $output;
  57. }
  58. function doDownload($url,HttpParameter $httpParameters, $headers, $connectTimeout, $readTimeout, $filePath){
  59. $result = doGet($url,$headers,$httpParameters->getParams(), $connectTimeout, $readTimeout);
  60. //判断是否返回文件流
  61. $array_output = json_decode($result, true);
  62. if(is_array($array_output) && array_key_exists("code",$array_output) && $array_output['code']!==0){
  63. return array(
  64. "code" => $array_output['code'],
  65. "message" => $array_output['message']
  66. );
  67. }
  68. //对文件名的编码,避免中文文件名乱码
  69. $destination = iconv("UTF-8", "GBK", $filePath);
  70. $file = fopen($destination,"w+");
  71. $answer = fputs($file,$result);//写入文件
  72. fclose($file);
  73. if($answer===false){
  74. return array(
  75. "code" => 1001,
  76. "message" => '下载文件失败'
  77. );
  78. }else{
  79. return array(
  80. "code" => 0,
  81. "message" => '下载文件完成,字节数:'.$answer
  82. );
  83. }
  84. }
  85. /**
  86. * GET请求
  87. * @param $url
  88. * @param $heads
  89. * @param $data
  90. * @return mixed|string
  91. */
  92. function doGet($url, $heads, $data, $connectTimeout, $readTimeout){
  93. $flag=1;
  94. while($flag <= HttpConnection::RENNECT_TIMES){
  95. try {
  96. // 请求参数有值时构建get请求
  97. if ($data) {
  98. $url = HttpConnection::buildGetUrlParams($url, $data);
  99. }
  100. if (!function_exists('curl_init')) {
  101. throw new Exception("CURL扩展没有开启!");
  102. }
  103. $curl = curl_init();
  104. $curl = HttpConnection::buildHttpRequest($curl, $url, $heads);
  105. $output = curl_exec($curl);
  106. if ($output === false) {
  107. $res = array(
  108. "code" => 1001,
  109. "message" => curl_error($curl)
  110. );
  111. $output = json_encode($res);
  112. }
  113. curl_close($curl);
  114. } catch (Exception $exc) {
  115. curl_close($curl);
  116. $res = array(
  117. "code" => 1001,
  118. "message" => $exc->getMessage()
  119. );
  120. $output = json_encode($res);
  121. }
  122. if($output){
  123. break;
  124. }
  125. $flag++;
  126. }
  127. return $output;
  128. }
  129. /**
  130. * POST请求
  131. * @param $url
  132. * @param $heads
  133. * @param $data
  134. * @return mixed|string
  135. */
  136. function doPost($url, $heads, $data, $connectTimeout, $readTimeout){
  137. $flag=1;
  138. while($flag <= HttpConnection::RENNECT_TIMES) {
  139. try {
  140. if (!function_exists('curl_init')) {
  141. throw new Exception("CURL扩展没有开启!");
  142. }
  143. $curl = curl_init();
  144. $curl = HttpConnection::buildHttpRequest($curl, $url, $heads);
  145. //启用时会发送一个常规的POST请求,类型为:application/x-www-form-urlencoded,就像表单提交的一样。
  146. curl_setopt($curl, CURLOPT_POST, 1);
  147. // 提交post请求
  148. curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
  149. $output = curl_exec($curl);
  150. if ($output === false) {
  151. $res = array(
  152. "code" => 1001,
  153. "message" => curl_error($curl)
  154. );
  155. $output = json_encode($res);
  156. }
  157. // 关闭CRUL
  158. curl_close($curl);
  159. } catch (Exception $exc) {
  160. // 关闭CRUL
  161. curl_close($curl);
  162. $res = array(
  163. "code" => 1001,
  164. "message" => $exc->getMessage()
  165. );
  166. $output = json_encode($res);
  167. }
  168. if($output){
  169. break;
  170. }
  171. $flag++;
  172. }
  173. return $output;
  174. }
  175. /**
  176. * POST请求带有多文件(请求中非多文件请求,仅单文件请求,使用 doPost)
  177. * @param $url
  178. * @param $heads
  179. * @param $data
  180. * @param $files
  181. * @return mixed|string
  182. */
  183. function doPostWithFiles($url, $heads, $paramData, $lisFiles){
  184. $flag=1;
  185. while($flag <= HttpConnection::RENNECT_TIMES) {
  186. try {
  187. if (!function_exists('curl_init')) {
  188. throw new Exception("CURL扩展没有开启!");
  189. }
  190. $boundary = "----sdkboundary".uniqid();
  191. $data = '';
  192. // 文本参数组成
  193. if ($paramData && is_array($paramData)) {
  194. foreach ($paramData as $name => $value) {
  195. $paramEntry = getParamEntry($boundary, $name, $value);
  196. $data .= $paramEntry;
  197. }
  198. }
  199. // 批量文件参数组成
  200. if ($lisFiles && is_array($lisFiles)) {
  201. foreach ($lisFiles as $name => $files) {
  202. if (is_array($files)) {
  203. foreach ($files as $file) {
  204. $fileEntry = getFileEntry($boundary, $name, $file->postname, $file->mime, $file);
  205. $data .= $fileEntry;
  206. }
  207. }
  208. }
  209. }
  210. $data .= "--".$boundary."--\r\n";
  211. $curl = curl_init();
  212. if (is_array($heads)) {
  213. array_push($heads, "Content-Type: multipart/form-data; boundary=".$boundary);
  214. array_push($heads,"Content-Length: ".strlen($data));
  215. }
  216. $curl = HttpConnection::buildHttpRequest($curl, $url, $heads);
  217. //启用时会发送一个常规的POST请求,类型为:application/form-urlencoded,就像表单提交的一样。
  218. curl_setopt($curl, CURLOPT_POST, 1);
  219. // 提交post请求
  220. curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
  221. $output = curl_exec($curl);
  222. if ($output === false) {
  223. $res = array(
  224. "code" => 1001,
  225. "message" => curl_error($curl)
  226. );
  227. $output = json_encode($res);
  228. }
  229. // 关闭CRUL
  230. curl_close($curl);
  231. } catch (Exception $exc) {
  232. // 关闭CRUL
  233. curl_close($curl);
  234. $res = array(
  235. "code" => 1001,
  236. "message" => $exc->getMessage()
  237. );
  238. $output = json_encode($res);
  239. }
  240. if($output){
  241. break;
  242. }
  243. $flag++;
  244. }
  245. return $output;
  246. }
  247. function getParamEntry($boundary, $fieldName, $fieldValue) {
  248. return "--".$boundary."\r\nContent-Disposition:form-data;name=\"".$fieldName."\"\r\n\r\n".$fieldValue."\r\n";
  249. }
  250. function getFileEntry($boundary, $fieldName, $fileName, $mimeType, $file) {
  251. if (!$mimeType) {
  252. $mimeType = "application/octet-stream";
  253. }
  254. $upload = file_get_contents($file->name);
  255. return "--".$boundary."\r\nContent-Disposition:form-data;name=\"".$fieldName."\";filename=\"".$fileName."\"\r\nContent-Type:".$mimeType."\r\n\r\n".$upload."\r\n";
  256. }