项目中调用天气预报接口

项目中使用的是心知天气的API,下面我就简单总结一下使用的过程:

1. 在心知天气官网注册一个个人账号,这样就会产生一个API秘钥和一个用户ID,用户ID用于签名验证方式。签名指的是通过HMAC-SHA1,对请求参数加密后得到的签名字串进行身份验证,避免了将API密钥明文包含在请求中而造成泄露。

2. 关于签名生成方式如下:

  (1)构造验证参数字符串

    将请求参数按照参数名字典升序排列后,把所有参数param=value用&连接起来,类似URI中Query string的构造方式。目前支持的参数有:UNIX时间戳ts 签名失效时间ttl(单位为秒,缺省为1800,可选)和用户IDuid。例:ts=1443079775&ttl=30&uid=U123456789

  (2)对上面的参数进行url编码,使用http_build_query()

    比如参数为:

      $param = [
        ‘ts‘ => time(),
        ‘ttl‘ => 300,
        ‘uid‘ => $uid,
       ];

    $sig_data = http_build_query($params);

   (3)对上面的字符串进行加密,让后进行base64编码

    加密使用的是hash_hmac()。如下得到签名:$sig = base64_encode(hash_hmac(‘sha1‘, $sig_data, $key, TRUE))。这里的$key就是注册时得到的API秘钥。

  (4)将得到的签名也放入$param数组中 $param[‘sig‘] = $sig, 其他的参数同样如此,然后构造url

    $url = $api. ‘?‘ . http_build_query($param)。 这里的$api是接口地址;比如$api = ‘https://api.seniverse.com/v3/weather/daily.json‘;

  (5)然后使用curl库进行访问$url 得到天气信息。

代码如下:

    // 心知天气接口调用凭据
    $key = ‘你的秘钥‘; // 秘钥
    $uid = ‘你的用户ID‘; // 用户 ID
    // 参数
    $api = ‘https://api.seniverse.com/v3/weather/daily.json‘; // 接口地址
    $location = ‘杭州‘; // 城市名称

    $param = [
      ‘ts‘ => time(),
      ‘ttl‘ => 300,
      ‘uid‘ => $uid,
    ];
    $sig_data = http_build_query($param); // http_build_query 会自动进行 url 编码
    // 使用 HMAC-SHA1 方式,以 API 密钥(key)对上一步生成的参数字符串(raw)进行加密,然后 base64 编码
    $sig = base64_encode(hash_hmac(‘sha1‘, $sig_data, $key, TRUE));

    $param[‘sig‘] = $sig; // 签名
    $param[‘location‘] = $location;
    $param[‘start‘] = 0; // 开始日期。0 = 今天天气
    $param[‘days‘] = 1; // 查询天数,1 = 只查一天
    // 构造url
    $url = $api . ‘?‘ . http_build_query($param);

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_ENCODING ,‘gzip‘);
    $output = curl_exec($ch);
    curl_getinfo($ch,CURLINFO_HTTP_CODE);
    
    curl_close($ch);

    $result = json_decode($output,TRUE);
    return $result;

    

原文地址:https://www.cnblogs.com/lty-fly/p/8683496.html

时间: 2024-07-30 02:53:31

项目中调用天气预报接口的相关文章

调用天气预报接口

方案一: 浏览器由于安全的限制,不允许跨域访问.但是PHP服务器是允许的.我们可以通过使用PHP文件做代理,通过PHP来调用接口. 详细接口分析可参看:http://www.cnblogs.com/wangjingblogs/p/3192953.html 返回JSON格式 PHP代码 <?php //此接口返回json格式 echo file_get_contents('http://www.weather.com.cn/data/cityinfo/101181601.html'); ?> H

关于Silverlight调用天气预报接口问题

问题:因Silverlight客户端不能直接调用webservice接口(外网天气接口),调用会出现跨域访问的问题,即使添加了跨域文件也不好使.解决方法如下 解决方法一:1.在服务端建立一个wcf服务端,在wcf里调用webservice接口(外网天气接口) wcf服务接口IWeatherService.cs 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Runtim

在Android项目中调用已有.so库

注意该.so库指的是android平台的,非一般linux.unix平台:1.现有库libcom_ycan_testLib.so2.新建android项目TestLib23.添加新类:类名:testLib包路径:参考现有库名,应为com.ycan4.在新类中声明库的本地方法,如下: ? 1 2 3 4 5 6 package com.ycan; public class testLib {     public native int add (int a, int b);     public

在Windows Phone项目中调用C语言DLL

在Windows Phone项目中调用C语言写的DLL 最近接到一个需求,需要在WP里调用一个C语言写的DLL,并且说Android和iOS都可以,问我WP是否可以这样? 我说我调研一下,就有了下面的文章. 在传统C# WinForm 里调用Win32 DLL都不容易(可能用惯了C#),要用P/Invoke,然后DllImport什么什么,那WP里不是更麻烦? 先看看网上有没有可用的文章,结果还真找到devdiv中的文章,但其中有两处错误,所以我fix bug并且整理一下,然后展示给大家. 1.

JNI_Android项目中调用.so动态库

JNI_Android项目中调用.so动态库 2014年6月3日 JNI学习 参考:http://blog.sina.com.cn/s/blog_4298002e01013zk8.html 上一篇笔者介绍了如何使用Java代码调用DLL动态库中的C/C++方法,似乎已经是很久以前的做法了,遇到的错误笔者还未找到解决方案,但动态库着实是找到的,只是无法调用相应的方法.本篇博客来介绍一下如何在Android项目当中使用NDK生成.so动态链接库,并在程序中使用. 1. 在Eclipse中创建项目:T

WebApi接口 - 如何在应用中调用webapi接口

简单做个webapi(查询+添加)接口 首先,我们需要有一个webapi接口项目,我这里以前面WebApi接口 - 响应输出xml和json文章的项目来构建本篇文章的测试用例:这里新建一个 DbData 数据源类,主要用来做数据存储和提供查询列表数据及添加数据方法,具体代码如:  1 public class DbData 2     { 3         public static DbData Current 4         { 5             get 6         

JNI_Android项目中调用.so动态库实现详解

转自:http://www.yxkfw.com/?p=7223 1. 在Eclipse中创建项目:TestJNI 2. 新创建一个class:TestJNI.java package com.wwj.jni; public class TestJNI { public native boolean Init(); public native int Add(int x, int y); public native void Destory(); } 以上代码声明三个本地方法. 3. 编译JNI

webservice通信调用天气预报接口实例

转载:http://www.cnblogs.com/warrior4236/p/5668449.html 一:环境搭建 1:新建一个java project工程weatherInf 2:引入相应的jar包 activation.jaraxis-ant.jaraxis.jarcommons-discovery-0.2.jarcommons-logging-1.0.4.jarjaxrpc.jarlog4j-1.2.8.jarmail.jarsaaj.jarwsdl4j-1.5.1.jar 下载axi

【MediaKit】WPF项目中 调用摄像头拍照的开发包

今天遇到一个 人事的项目,项目中需要调用摄像头给员工照相.如何解决这个问题呢? 介绍一个开发包给你,MediaKit.论坛里头的人都说好,但是黑兔觉得大家好才是真的好.你不妨试试~ 第一步:添加WPFMediaKit.dll 文件到项目中 第二步:把WPFMediaKit.dll文件引用进来. 步骤 右击引用->添加引用->浏览选项卡->选择WPFMediaKit.dll文件所在的位置. 第三步:在窗口顶端加入如下代码(注意不要该意记)就像using一个类样. xmlns:WPFMedi