在MATLAB中从REST Web服务中读取内容

时间:2017-12-03 17:22:37

标签: json matlab rest web-services

我正在使用webread()函数从sunrise-sunset.org api here中检索日出和日落数据。

这是我的代码:

function [E_total] = solar_energy(lng, lat, yr, month, day)

% Generate URL
url = strcat('https://api.sunrise-sunset.org/json?lat=', num2str(lat),...
       '&lng=', num2str(lng), '&date=', num2str(yr), '-', num2str(month),... 
       '-',num2str(day));

% Retrieve data
forecast = webread(url)

if isempty(forecast)  % Failed, use default estimates
    sunrise = 6;
    sunset = 18;
    noon = 12;
elseif forecast.status == 'OK'
    % Success!  Parse retrieved data...
    forecast.results
    dv = datevec(forecast.results.sunrise)
    sunrise = dv(6)/3600 + dv(5)/60 + dv(4)
    dv = datevec(forecast.results.sunset)
    sunset = dv(6)/3600 + dv(5)/60 + dv(4)
    dv = datevec(forecast.results.solar_noon)
    noon = dv(6)/3600 + dv(5)/60 + dv(4)
end

以下是我在华盛顿国家纪念碑拍摄的日出和日落数据的示例。

输入:

  

solar_energy(-77.0353,38.8895,2017,12,20)

这是我得到的:

  

预测=

results: [1x1 struct]
 status: 'OK'
     

ans =

                    sunrise: '12:00:01 AM'
                     sunset: '12:00:01 AM'
                 solar_noon: '9:38:38 AM'
                 day_length: '00:00:00'
       civil_twilight_begin: '12:00:01 AM'
         civil_twilight_end: '12:00:01 AM'
    nautical_twilight_begin: '12:00:01 AM'
      nautical_twilight_end: '12:00:01 AM'
astronomical_twilight_begin: '12:00:01 AM'
  astronomical_twilight_end: '12:00:01 AM'

我的方法有什么问题或者这个api有问题吗? 数据检索成功,但是对于所有日期,日出和日落时间要么是上午12:00:00,要么是9时AM。

1 个答案:

答案 0 :(得分:1)

好的,我想我发现了你的问题。我看了一下API documentation,发现它支持一个名为formatted的附加参数,其描述如下:

  

格式化(整数):0或1(默认为1)。响应时间值   将按照ISO 8601表示,并表示day_length   很快。可选的。

我尝试将其附加到您在函数中创建的请求中。与此同时,我还解决了您在通话中使用date parameter的一个小问题:

  

日期(字符串):YYYY-MM-DD格式的日期。也接受其他日期   格式甚至相对日期格式。如果不存在,则默认为日期   到目前的日期。可选的。

' DD'天数格式以两位数表示日期值(例如:如果日值为21则为21,如果日值为02则为2)。自num2strnum2str(2) = '2'起,使用num2str(02) = '2'不会重现此行为。快速解决方法是使用datestr(day,'dd')代替。

以下是最终结果:

solar_energy(-77.0353, 38.8895, 2017, 12, 02);

function [E_total] = solar_energy(lng, lat, yr, month, day)

    url = strcat('https://api.sunrise-sunset.org/json', ...
        '?lat=', num2str(lat), ...
        '&lng=', num2str(lng), ...
        '&date=', num2str(yr),'-',num2str(month),'-',datestr(day,'dd'), ...
        '&formatted=0');

    forecast = webread(url);

    if (isempty(forecast) || ~strcmp(forecast.status,'OK'))
        sunrise = 6;
        noon = 12;
        sunset = 18;
    else
        forecast.results
    end

end

这是上面代码产生的结果:

                    sunrise: '2017-12-02T12:09:28+00:00'
                     sunset: '2017-12-02T21:46:20+00:00'
                 solar_noon: '2017-12-02T16:57:54+00:00'
                 day_length: 34612
       civil_twilight_begin: '2017-12-02T11:40:03+00:00'
         civil_twilight_end: '2017-12-02T22:15:44+00:00'
    nautical_twilight_begin: '2017-12-02T11:06:58+00:00'
      nautical_twilight_end: '2017-12-02T22:48:50+00:00'
astronomical_twilight_begin: '2017-12-02T10:34:47+00:00'
  astronomical_twilight_end: '2017-12-02T23:21:01+00:00'

如您所见,返回的值看起来正确。所以问题是由API如何处理它从ISO 8601中的数据库检索的日期到另一种格式的转换。

当然,您必须更改当前正在解析API返回的值的方式。这应该做的工作:

datevec(struct.sunrise,'yyyy-mm-ddTHH:MM:ss');