Как мне вызвать API внешнего отдыха на основе XML из AWS lambda? - PullRequest
0 голосов
/ 17 февраля 2019

Я пытаюсь вызвать внешний API из AWS lambda.Я не использовал http-модуль node.js, потому что слышал, что он громоздок.Поэтому я пытаюсь использовать AWS SDK для выполнения этой задачи.См. https://boylesoftware.com/blog/calling-restful-apis-from-inline-aws-lambda-functions/. Этот код, кажется, в основном работает, но я не уверен, потому что API должен возвращать и полезную нагрузку XML, но это не так.Не выдается никакой ошибки, но в переменной data возвращается пустой объект {}.

Я предполагаю, что это связано с выходной спецификацией, которую я закомментировал.Я недостаточно хорошо знаю SDK, чтобы знать, как описать полезную нагрузку XML.Я попытался переключить его на строку безрезультатно.

Я могу успешно получить полезную нагрузку XML от этого API, когда я вызываю его через Почтальон.Пример ответа от API приведен ниже моего лямбда-кода.

'use strict';

// load AWS SDK module, which is always included in the runtime environment
const AWS = require('aws-sdk');
const UTA = {
  token: process.env.uta_api_token
};

// define our target API as a "service"
const svc = new AWS.Service({

    // the API base URL
    endpoint: 'http://api.rideuta.com/SIRI/SIRI.svc',

    // don't parse API responses
    // (this is optional if you want to define shapes of all your endpoint responses)
    convertResponseTypes: false,

    // and now, our API endpoints
    apiConfig: {
        metadata: {
            protocol: 'rest-xml' // API returns XML
        },
        operations: {

            // GetStop stuff
            GetStop: {
                http: {
                    method: 'GET',
                    // note the placeholder in the URI
                    requestUri: 'StopMonitor'
                },
                input: {
                    type: 'structure',
                    required: [ 'auth', 'stopid', 'minutesout' ],
                    members: {
                        'auth': {
                            // send authentication header in the HTTP request header
                            location: 'uri',
                            locationName: 'usertoken',
                            sensitive: true
                        },
                        'stopid': {
                            // all kinds of validators are available
                            type: 'string',
                            // include it in the call URI
                            location: 'uri',
                            // this is the name of the placeholder in the URI
                            locationName: 'stopid'
                        },
                        'minutesout' : {
                            type : 'integer',
                            location : 'uri',
                            locationName : 'minutesout'
                        }
                    }
                },
                /*
                output: {
                    type: 'structure',
                    members:  {
                        'ResponseTimestamp' : {
                            location : 'body',
                            locationName : 'ResponseTimestamp'
                        }
                    }
                }
                */
            }
        }
    }
});

// disable AWS region related login in the SDK
svc.isGlobalEndpoint = true;

// and now we can call our target API!
exports.handler = function(event, context, callback) {

    // note how the methods on our service are defined after the operations
   //ontext.succeed('hello world');
    svc.getStop({
            auth: UTA.token,
            stopid: 'FR301084',
            minutesout : 600,
        }, (err, data) => {

            if (err) {
                console.error('>>> operation error:', err);
                return callback(err);
            }

            console.log('it worked');
            console.log(UTA.token);
            console.log(data);
            callback();
    });
};
<?xml version="1.0" encoding="utf-8"?>
<Siri version="1.3" xmlns="http://www.siri.org.uk/siri">
    <ResponseTimestamp>2019-02-16T22:37:24.1431014-07:00</ResponseTimestamp>
    <StopMonitoringDelivery version="1.3">
        <ResponseTimestamp>2019-02-16T22:37:24.1431014-07:00</ResponseTimestamp>
        <ValidUntil>2019-02-16T22:37:34.1431014-07:00</ValidUntil>
        <MonitoredStopVisit>
            <RecordedAtTime>2019-02-16T22:37:24.1431014-07:00</RecordedAtTime>
            <MonitoredVehicleJourney>
                <LineRef>750</LineRef>
                <DirectionRef>SOUTHBOUND</DirectionRef>
                <FramedVehicleJourneyRef>
                    <DataFrameRef>2019-02-16T00:00:00-07:00</DataFrameRef>
                    <DatedVehicleJourneyRef>3706978</DatedVehicleJourneyRef>
                </FramedVehicleJourneyRef>
                <PublishedLineName>FRONTRUNNER</PublishedLineName>
                <OriginRef>FR601084</OriginRef>
                <DestinationRef>FR801164</DestinationRef>
                <Monitored>True</Monitored>
                <VehicleLocation>
                    <Longitude>-111.9306</Longitude>
                    <Latitude>41.004124</Latitude>
                </VehicleLocation>
                <ProgressRate>1</ProgressRate>
                <CourseOfJourneyRef>18084</CourseOfJourneyRef>
                <VehicleRef>113</VehicleRef>
                <MonitoredCall>
                    <StopPointRef>FR301084</StopPointRef>
                    <VisitNumber>1</VisitNumber>
                    <VehicleAtStop>false</VehicleAtStop>
                    <Extensions>
                        <EstimatedDepartureTime>136</EstimatedDepartureTime>
                        <Direction>To Provo</Direction>
                        <Distance>9644.7823876475977</Distance>
                    </Extensions>
                </MonitoredCall>
                <Extensions>
                    <LastGPSFix>2019-02-16T22:37:16</LastGPSFix>
                    <Scheduled>False</Scheduled>
                    <Bearing>129.54093468554098</Bearing>
                    <Speed>79.829126894854753</Speed>
                    <DestinationName>Provo</DestinationName>
                </Extensions>
            </MonitoredVehicleJourney>
            <MonitoredVehicleJourney>
                <LineRef>750</LineRef>
                <DirectionRef>NORTHBOUND</DirectionRef>
                <FramedVehicleJourneyRef>
                    <DataFrameRef>2019-02-16T00:00:00-07:00</DataFrameRef>
                    <DatedVehicleJourneyRef>3706927</DatedVehicleJourneyRef>
                </FramedVehicleJourneyRef>
                <PublishedLineName>FRONTRUNNER</PublishedLineName>
                <OriginRef>FR801164</OriginRef>
                <DestinationRef>FR601084</DestinationRef>
                <Monitored>True</Monitored>
                <VehicleLocation>
                    <Longitude>-111.904274</Longitude>
                    <Latitude>40.625053</Latitude>
                </VehicleLocation>
                <ProgressRate>1</ProgressRate>
                <CourseOfJourneyRef>18124</CourseOfJourneyRef>
                <VehicleRef>108</VehicleRef>
                <MonitoredCall>
                    <StopPointRef>FR301081</StopPointRef>
                    <VisitNumber>1</VisitNumber>
                    <VehicleAtStop>false</VehicleAtStop>
                    <Extensions>
                        <EstimatedDepartureTime>2912</EstimatedDepartureTime>
                        <Direction>To Ogden</Direction>
                        <Distance>132285.03109158284</Distance>
                    </Extensions>
                </MonitoredCall>
                <Extensions>
                    <LastGPSFix>2019-02-16T22:37:20</LastGPSFix>
                    <Scheduled>False</Scheduled>
                    <Bearing>10.410927719684226</Bearing>
                    <Speed>79.067224214902424</Speed>
                    <DestinationName>Ogden</DestinationName>
                </Extensions>
            </MonitoredVehicleJourney>
        </MonitoredStopVisit>
        <Extensions>
            <StopName>FARMINGTON STATION</StopName>
            <StopLongitude>-111.903667000</StopLongitude>
            <StopLatitude>40.987266000</StopLatitude>
            <StopLocation>Utah</StopLocation>
        </Extensions>
    </StopMonitoringDelivery>
</Siri>

1 Ответ

0 голосов
/ 26 мая 2019

convertResponseTypes должен иметь значение true, если вы хотите обработать ответ.

...