PHP CURL与java http使用方法详解


Posted in PHP onJanuary 26, 2018

php curl

有时候我们的项目需要与第三方平台进行交互。举个例子。

现在有A、B两个平台。 甲方在最初一段时间由A实现了一部分关键业务(如用户信息等)。 然后基于一部分原因,现在有一些业务需要B来实现,且实现程序调用了一些敏感的接口只能在B方服务器上跑,那么只能做两个平台之间的交互了。curl 就是这种问题的解决方案。

curl 是一个php扩展,你可以看作一个可以访问其他网站的精简版浏览器。
要使用curl 你得在php.ini 中开启相关的配置才能使用。
常用的平台之间交互的数据格式 有json、xml等比较流行的数据格式。

<?php
 @param
 $url  接口地址
 $https 是否是一个Https 请求
 $post 是否是post 请求
 $post_data post 提交数据 数组格式
function curlHttp($url,$https = false,$post = false,$post_data = array())
{
  $ch = curl_init();                            //初始化一个curl
  curl_setopt($ch, CURLOPT_URL,$url);     //设置接口地址 如:http://wwww.xxxx.co/api.php
  curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);//是否把CRUL获取的内容赋值到变量
  curl_setopt($ch,CURLOPT_HEADER,0);//是否需要响应头
  /*是否post提交数据*/
  if($post){
    curl_setopt($ch,CURLOPT_POST,1);
    if(!empty($post_data)){
      curl_setopt($ch,CURLOPT_POSTFIELDS,$post_data);
    }
  }
  /*是否需要安全证书*/
  if($https)
  {
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);  // https请求 不验证证书和hosts
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
  }
  $output = curl_exec($ch);
  curl_close($ch);
  return $output;
}
?>

现在 接口地址 http://www.xxxxx.com/api/{sid} 这个接口地址通过get 方式可以返回一个user 的 json数据格式 ,那么我们怎么去获取第三方平台的数据

<?php
    $sid = 1;
    $url = "http://www.xxxxx.com/api/{$sid}";
    $data = curlHttp($url);
  $user = json_decode($data,true); 
?>

其中$user就是获取user数组信息。
在这里 curl 模拟浏览器对该域名进行了get请求(当然,根据我们在参数中的设置,我们也可以去模拟post https 等请求),获取到了响应的数据。

java http 实现了类似php curl 的功能

java 是一门完全面向对象的语言,我觉得除了对象名够长不容易记忆外。其它的都很好,且它是先编译成字节码然后由java虚拟机去运行的,不像 php 每次都需要去编译一次以后采取运行。
java对php curl 的实现

文件 tool.HttpRequest

package tool;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.URL;
import java.net.URLConnection;
import java.util.List;
import java.util.Map;

import java.net.URLEncoder;

import Log.Log;

public class HttpRequest 
{
  /**
   * 向指定URL发送GET方法的请求
   * 
   * @param url
   *      发送请求的URL
   * @param param
   *      请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
   * @return String 所代表远程资源的响应结果
   */
  public static String get(String url,String param)
  {
    String result = "";
    BufferedReader in = null;
    try {
      String urlNameString = null;

      if(param == null)
        urlNameString = url;
      else
        urlNameString = url + "?" + param;

      //System.out.println("curl http url : " + urlNameString);

      URL realUrl = new URL(urlNameString);
      // 打开和URL之间的连接
      URLConnection connection = realUrl.openConnection();
      // 设置通用的请求属性
      connection.setRequestProperty("accept", "*/*");
      connection.setRequestProperty("connection","close");
      connection.setRequestProperty("user-agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");

      // 建立实际的连接
      connection.connect();

      /*
      // 获取所有响应头字段
      Map<String, List<String>> map = connection.getHeaderFields();
      // 遍历所有的响应头字段
      for (String key : map.keySet())
      {
        System.out.println(key + "--->" + map.get(key));
      }
      */

      // 定义 BufferedReader输入流来读取URL的响应
      in = new BufferedReader(new InputStreamReader(connection.getInputStream()));

      String line;

      while ((line = in.readLine()) != null)
      {
        result += line;
      }
    } catch (Exception e) {
      System.out.println("发送GET请求出现异常!" + e);
      e.printStackTrace();
    }
    // 使用finally块来关闭输入流
    finally {
      try {
        if (in != null) {
          in.close();
        }
      } catch (Exception e2) {
        e2.printStackTrace();
      }
    }
    return result.equals("") ? null : result;
  }

  /**
   * 向指定 URL 发送POST方法的请求
   * 
   * @param url
   *      发送请求的 URL
   * @param param
   *      请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
   * @return String 所代表远程资源的响应结果
   */
  public static String post(String url, String param) {
    PrintWriter out = null;
    BufferedReader in = null;
    String result = "";
    try {
      URL realUrl = new URL(url);
      // 打开和URL之间的连接
      URLConnection conn = realUrl.openConnection();
      // 设置通用的请求属性
      conn.setRequestProperty("accept", "*/*");
      conn.setRequestProperty("connection", "Keep-Alive");
      conn.setRequestProperty("user-agent",
          "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
      // 发送POST请求必须设置如下两行
      conn.setDoOutput(true);
      conn.setDoInput(true);
      // 获取URLConnection对象对应的输出流
      out = new PrintWriter(conn.getOutputStream());
      // 发送请求参数
      out.print(param);
      // flush输出流的缓冲
      out.flush();
      // 定义BufferedReader输入流来读取URL的响应
      in = new BufferedReader(
          new InputStreamReader(conn.getInputStream()));
      String line;
      while ((line = in.readLine()) != null) {
        result += line;
      }
    } catch (Exception e) {
      System.out.println("发送 POST 请求出现异常!"+e);
      e.printStackTrace();
    }
    //使用finally块来关闭输出流、输入流
    finally{
      try{
        if(out!=null){
          out.close();
        }
        if(in!=null){
          in.close();
        }
      }
      catch(IOException ex){
        ex.printStackTrace();
      }
    }
    return result;
  }  
}

然后类似php的使用如下

web.app.controller.IndexController

package web.app.controller;

import tool.HttpRequest;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import net.sf.json.JSONObject;

@Controller
@RequestMapping("Index")
public class IndexController
{
    @RequestMapping(value="index",method={RequestMethod.GET,RequestMethod.POST},produces="text/html;charset=utf-8")
     @ResponseBody
  public String index()
  {
    String sid = "1";
    String apiUrl = "http://www.xxxxx.com/api/" +sid;
        String data = HttpRequest.get(apiUrl,null);   //开始模拟浏览器请求
        JSONObject json = JSONObject.fromObject(data);  //解析返回的json数据结果

  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
PHP完整的日历类(CLASS)
Nov 27 PHP
用PHP读取RSS feed的代码
Aug 01 PHP
php 正则匹配函数体
Aug 25 PHP
PHP正则的Unknown Modifier错误解决方法
Mar 02 PHP
php在window iis的莫名问题的测试方法
May 14 PHP
php视频拍照上传头像功能实现代码分享
Oct 08 PHP
CI框架中$this-&gt;load-&gt;library()用法分析
May 18 PHP
图文详解phpstorm配置Xdebug进行调试PHP教程
Jun 13 PHP
Linux下快速搭建php开发环境
Mar 13 PHP
Laravel5.* 打印出执行的sql语句的方法
Jul 24 PHP
visual studio code 调试php方法(图文详解)
Sep 15 PHP
php生成微信红包数组的方法
Sep 05 PHP
php实现mysql连接池效果实现代码
Jan 25 #PHP
php使用imagecopymerge()函数创建半透明水印
Jan 25 #PHP
CI框架(CodeIgniter)操作redis的方法详解
Jan 25 #PHP
PHP开发之用微信远程遥控服务器
Jan 25 #PHP
php实现统计二进制中1的个数算法示例
Jan 23 #PHP
基于php中echo用逗号和用点号的区别详解
Jan 23 #PHP
php数据结构之顺序链表与链式线性表示例
Jan 22 #PHP
You might like
PHP 和 MySQL 基础教程(四)
2006/10/09 PHP
PHP中把stdClass Object转array的几个方法
2014/05/08 PHP
php读取本地json文件的实例
2018/03/07 PHP
php微信公众号开发之音乐信息
2018/10/20 PHP
Html中JS脚本执行顺序简单举例说明
2010/06/19 Javascript
js实现按钮加背景图片常用方法
2014/11/01 Javascript
innerHTML中标签可以换行的方法汇总
2015/08/14 Javascript
javascript实现全角转半角的方法
2016/01/23 Javascript
Bootstrap 折叠(Collapse)插件用法实例详解
2016/06/01 Javascript
最基础的vue.js双向绑定操作
2017/08/23 Javascript
判断div滑动到底部的scroll实例代码
2017/11/15 Javascript
深入理解Node内建模块和对象
2019/03/12 Javascript
Vue开发中常见的套路和技巧总结
2020/11/24 Vue.js
antdesign-vue结合sortablejs实现两个table相互拖拽排序功能
2021/01/08 Vue.js
从零学python系列之数据处理编程实例(二)
2014/05/22 Python
Python实现的简单发送邮件脚本分享
2014/11/07 Python
python实现爬虫统计学校BBS男女比例(一)
2015/12/31 Python
python 实现自动远程登陆scp文件实例代码
2017/03/13 Python
Python cookbook(数据结构与算法)实现优先级队列的方法示例
2018/02/18 Python
Python爬虫实战:分析《战狼2》豆瓣影评
2018/03/26 Python
Python mutiprocessing多线程池pool操作示例
2019/01/30 Python
Python基础之高级变量类型实例详解
2020/01/03 Python
如何让PyQt5中QWebEngineView与JavaScript交互
2020/10/21 Python
澳大利亚婴儿、幼儿和儿童在线设计师商店:Smooch Baby
2019/02/16 全球购物
平面设计岗位职责
2013/12/14 职场文书
仓库门卫岗位职责
2013/12/22 职场文书
机械制造毕业生求职信
2014/03/03 职场文书
社团活动总结格式
2014/08/29 职场文书
2014年党建工作汇报材料
2014/10/27 职场文书
农村党员学习党的群众路线教育实践活动心得体会
2014/11/04 职场文书
鲁迅故里导游词
2015/02/05 职场文书
分享3个非常实用的 Python 模块
2022/03/03 Python
springboot创建的web项目整合Quartz框架的项目实践
2022/06/21 Java/Android
win10搭建配置ftp服务器的方法
2022/08/05 Servers
Springboot集成kafka高级应用实战分享
2022/08/14 Java/Android
SqlServer常用函数及时间处理小结
2023/05/08 SQL Server