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一些服务器端特性的配置加强php的安全
Oct 09 PHP
基于PHP的cURL快速入门教程 (小偷采集程序)
Jun 02 PHP
php urlencode()与urldecode()函数字符编码原理详解
Dec 06 PHP
深入探讨:Nginx 502 Bad Gateway错误的解决方法
Jun 03 PHP
采用thinkphp自带方法生成静态html文件详解
Jun 13 PHP
PHP获取当前所在目录位置的方法
Nov 26 PHP
php连接oracle数据库及查询数据的方法
Dec 29 PHP
PHP查询快递信息的方法
Mar 07 PHP
Yii中CArrayDataProvider和CActiveDataProvider区别实例分析
Mar 02 PHP
PDO实现学生管理系统
Mar 21 PHP
yii框架结合charjs实现统计30天数据的方法
Apr 04 PHP
PHP+Mysql分布式事务与解决方案深入理解
Feb 27 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
全国FM电台频率大全 - 13 福建省
2020/03/11 无线电
PHP实现删除字符串中任何字符的函数
2015/08/11 PHP
php集成动态口令认证
2016/07/21 PHP
php strftime函数获取日期时间(switch用法)
2018/05/16 PHP
获取JavaScript用户自定义类的类名称的代码
2007/03/08 Javascript
jQuery实现原理的模拟代码 -6 代码下载
2010/08/16 Javascript
Javascript 类型转换方法
2010/10/24 Javascript
js网页侧边随页面滚动广告效果实现
2011/04/14 Javascript
浅析webapp框架AngularUI的demo
2014/12/21 Javascript
jQuery中:has选择器用法实例
2014/12/30 Javascript
跟我学习javascript的最新标准ES6
2015/11/20 Javascript
js实现异步循环实现代码
2016/02/16 Javascript
Bootstrap响应式导航由768px变成992px的实现代码
2017/06/15 Javascript
jQuery第一次运行页面默认触发点击事件的实例
2018/01/10 jQuery
JS中验证整数和小数的正则表达式
2018/10/08 Javascript
JavaScript中的回调函数实例讲解
2019/01/27 Javascript
JavaScript实现背景自动切换小案例
2019/09/27 Javascript
在layui中对table中的数据进行判断(0、1)转换为提示信息的方法
2019/09/28 Javascript
js实现拾色器插件(ColorPicker)
2020/05/21 Javascript
Python pickle模块用法实例分析
2015/05/27 Python
python+pyqt实现12306图片验证效果
2017/10/25 Python
在Mac上删除自己安装的Python方法
2018/10/29 Python
Django管理员账号和密码忘记的完美解决方法
2018/12/06 Python
对Django项目中的ORM映射与模糊查询的使用详解
2019/07/18 Python
python 字符串追加实例
2019/07/20 Python
介绍下java.util.Arrays类
2012/10/16 面试题
大专生简历的自我评价
2013/11/26 职场文书
医学检验专业个人求职信范文
2013/12/04 职场文书
酒店总经理岗位职责
2014/03/17 职场文书
年终晚会主持词
2014/03/25 职场文书
高中生第一学年自我鉴定2015
2014/09/28 职场文书
四风自我剖析材料思想汇报
2014/10/01 职场文书
上课睡觉万能检讨书
2015/02/17 职场文书
幼儿园重阳节活动总结
2015/05/05 职场文书
2015年网络舆情工作总结
2015/07/24 职场文书
MySQL入门命令之函数-单行函数-流程控制函数
2021/04/05 MySQL