步骤三:实验2-根据车次查询城市天气

本文介绍如何根据实验1设计的集成流,完成查询城市天气的集成流设计,以及集成流的运行和调试。

前提条件

完成步骤二:实验1-根据车次查询城市信息集成流设计和调试操作。

步骤1:设计集成流

说明

您可以选择创建新的接口和集成流,或者在步骤二:实验1-根据车次查询城市信息集成流的基础上直接修改。本文以在原有实验1的集成流基础上直接修改设计说明。

创建变量

由于使用遍历节点时,需要使用到变量保存循环内的数据,因此需要先创建变量。

  1. 设置变量的节点拖动至查询车次的节点下。

  2. 设置变量面板的设置变量区域,单击添加,将变量名配置为weather类型配置为Listimage

    单击脚本运行结果文本框,在脚本对话框中输入以下示例代码,完成后单击确定

    image

    package bwifltoayo536281vy;
    
    import com.alibaba.bwif.script.core.StepMessage
    import com.alibaba.bwif.script.core.BwifHandler
    import java.util.ArrayList
    
    class SimpleHandler implements BwifHandler {
        @Override
        Object handle(StepMessage message) {
            //返回空ArrayList
            return new ArrayList()
        }
    }

使用遍历(For Each)节点

添加遍历(For Each)节点,使用脚本方式设置待遍历的集合。将遍历(For Each)的节点拖动至设置变量的节点下。image

本实验中是针对查询车次接口中的List部分进行遍历。在遍历(For Each)面板,单击编辑代码,在脚本对话框中输入以下示例代码,完成后单击确定

package bwifltobrjah62j1xw;

import com.alibaba.bwif.script.core.StepMessage
import com.alibaba.bwif.script.core.BwifHandler
import com.alibaba.bwif.script.core.protocol.http.HttpResponse
import java.util.HashMap
import com.alibaba.bwif.script.core.Entity

class SimpleHandler implements BwifHandler {
    @Override
    Object handle(StepMessage message) {
        //前一节点输出消息的payload中保存了查询车次信息的HTTP返回内容
        HttpResponse rep = message.getPayload()
        //车次、城市列表等存在body内,类型为Entity
        Entity eBody = rep.getBody()
        //使用Entity的内置功能,自动将json字符串反序列化为HashMap
        HashMap<String,Object> m = eBody.getValue()
        //取出城市列表信息,做为目标遍历的集合
        return m.get('result').get('list')
    }
}

循环查询城市天气

  1. 在遍历循环内增加HTTP查询天气信息的节点。描述填写为查询城市天气,连接配置使用实验1中创建的连接配置,URL中的配置为weather/cityMethod配置为GETimage

  2. 使用脚本方式配置Query位置的参数。选中脚本,单击编辑代码,在脚本对话框中输入以下示例代码,完成后单击确定image

    package bwifltobys3b5jb1yk;
    
    import com.alibaba.bwif.script.core.StepMessage
    import com.alibaba.bwif.script.core.BwifHandler
    import java.util.HashMap
    
    class SimpleHandler implements BwifHandler {
        @Override
        Object handle(StepMessage message) {
            //每次遍历的城市信息,保存在消息的payload之中,HashMap结构,参考如下
            // {
            //     "sequenceno": "1",
            //     "station": "北京",
            //     "day": "1",
            //     "arrivaltime": "-",
            //     "departuretime": "07:00"
            // }
            HashMap<String,Object> payload = message.getPayload()
            String city = payload.get('station')
            //将城市名称做为query参数
            HashMap<String,Object> q = new HashMap()
            q.put("cityname",city)
            return q
        }
    }
    

将查询结果保存到变量中

  1. 查询城市天气HTTP节点下增加设置变量节点,将查询的城市天气信息保存到weather变量中。描述填写为将查询结果保存到weather中image

  2. 单击添加变量名配置为weather类型配置为List,单击脚本运行结果,在脚本对话框中输入以下示例代码,完成后单击确定

    package bwifltoc79lr27n1z6;
    
    import com.alibaba.bwif.script.core.StepMessage
    import com.alibaba.bwif.script.core.BwifHandler
    import com.alibaba.bwif.script.core.protocol.http.HttpResponse
    import java.util.HashMap
    import java.util.ArrayList
    import com.alibaba.bwif.script.core.Entity
    
    class SimpleHandler implements BwifHandler {
        @Override
        Object handle(StepMessage message) {
            //从城市的天气查询结果中取出风力情况(wind)
            HttpResponse rep = message.getPayload()
            Entity eBody = rep.getBody()
            HashMap<String,Object> mRep = eBody.getValue()
            String wind = mRep.get('data').get('now').get('wind_power')
            //从输入消息的变量中取出weather
            ArrayList varWeather = message.getVariable().get('weather')
            //补充本轮查询的结果
            varWeather.add(wind)
            //重新对变量进行赋值
            return varWeather
        }
    }

HTTP API Reply

  1. 修改HTTP API Reply节点。将HTTP Status Code配置为200image

  2. HTTP返回值的Body部分,使用脚本方式配置,单击编辑代码,在脚本对话框中输入以下示例代码,完成后单击确定

    package bwifltoazgaa6361w8;
    
    import com.alibaba.bwif.script.core.StepMessage
    import com.alibaba.bwif.script.core.BwifHandler
    import com.alibaba.bwif.script.core.Entity
    
    class SimpleHandler implements BwifHandler {
        @Override
        Object handle(StepMessage message) {
            //从输入消息的变量中取出weather,构造成Entity对象
            ArrayList varWeather = message.getVariable().get('weather')
            Entity e = Entity.fromObjectValue(varWeather,"application/json","UTF-8")
            return e
        }
    }
    

步骤2:运行和调试集成流

  1. 单击集成流设计器页面右上角的保存,保存成功后可看到最近一次保存成功的时间。

  2. 单击集成流设计器页面右上角的调试,页面自动跳转至集成流调试器页面。

  3. 选中和实验1调试的相同环境。如果您是在实验1的集成流上直接修改,单击发起调用时,系统会自动将最新的元数据下发到集成应用实例中,稍等片刻后即可查看到调用结果。image

  4. 关闭调用接口面板后,您可以查看节点的输入输出信息,据此调整集成流逻辑。image