2015-12-03 13 views
7

में एक एडब्ल्यूएस लैम्ब्डा समारोह आह्वान करने के लिए कैसे मैं कैसे स्विफ्ट में एक लैम्ब्डा समारोह आह्वान करने के लिए पर कोई दस्तावेज या उदाहरण नहीं मिल सकता है, लेकिन मैं प्रलेखन ऑब्जेक्टिव-सी और मैं का उपयोग कर से एक्सट्रपलेशन करने की कोशिश की है 'm अभी भी हो रही त्रुटियों:स्विफ्ट

"Error in myFunction: ValidationException: Supplied AttributeValue is empty, must contain exactly one of the supported datatypes"

ऐसा लगता है कि मैं सही ढंग से कार्य करने के लिए मानकों में गुजर नहीं कर रहा हूँ जब मैं तेजी से लैम्ब्डा समारोह आह्वान क्योंकि स्क्रिप्ट DynamoDB को लिखने की कोशिश करता है, लेकिन में से एक पैरामीटर खाली है (जब मैं जावास्क्रिप्ट/नोड में इसे आमंत्रित करता हूं तो यह लैम्ब्डा स्क्रिप्ट काम करता है)।

let lambda = AWSLambda.defaultLambda() 
    let request = AWSLambdaInvocationRequest() 
    var context = [String: String]() 
    let jsonString = "{\"email\":\"[email protected]\",\"name\":\"example\"}" 
    let jsonData = jsonString.dataUsingEncoding(NSUTF8StringEncoding) 
    request.clientContext = jsonData?.base64EncodedStringWithOptions(NSDataBase64EncodingOptions.Encoding64CharacterLineLength) 
    request.functionName = "myFunction" 
    lambda.invoke(request).continueWithBlock({ 
     (currentTask: AWSTask!) -> AWSTask in 
     if (currentTask.error != nil) { 
      // failed to execute. 
      print("Error executing: ", currentTask.error) 
      task.setError(currentTask.error) 
     } else { 
      print("token: ", currentTask.result) 
      task.setResult(currentTask.result) 
    } 
     return currentTask 
    }) 

उत्तर

5

आपको उस डेटा वाले पेलोड पैरामीटर को सेट करने की आवश्यकता है जिसमें वह डेटा है जिसे आप पास करना चाहते हैं।

let invocationRequest = AWSLambdaInvokerInvocationRequest() 
    invocationRequest.functionName = "myFunction" 
    invocationRequest.invocationType = AWSLambdaInvocationType.RequestResponse 
    invocationRequest.payload = ["email" : "[email protected]", "name" : "example"] 

    let lambdaInvoker = AWSLambdaInvoker.defaultLambdaInvoker() 
    let task = lambdaInvoker.invoke(invocationRequest).continueWithSuccessBlock() { (task) -> AWSTask! in 
     print("response: ", task.result) 
    } 
+0

ऑप्स, यह मेरे ऐप्स में से एक से एक खराब कॉपी पेस्ट था जो तेजी से लैम्ब्डा का उपयोग करता है। मैंने इसे अब उदाहरण से हटा दिया है। ऐप में मैं लैम्ब्डा अनुरोध को ViewController पर एक संपत्ति के रूप में संग्रहीत करता हूं, जो मुझे आवश्यक होने पर वर्तमान अनुरोध को रद्द करने की अनुमति देता है। –

+0

एंड्रॉइड के लिए समान ढूँढना, अगर कोई मदद कर सकता है! –

2

रयान फिजराल्ड़ के जवाब मुझे कई संकलन समय त्रुटियों देता है, लेकिन मैं इस संस्करण के साथ सफलता मिली है:

पहले, मैं पहुँच पहचान के साथ एक आरंभीकरण समारोह है। ध्यान दें कि यह उत्पादन कोड के लिए अनुशंसित सुरक्षित पहुंच विधि नहीं है, लेकिन यह परीक्षण और अन्य उद्देश्यों के लिए ठीक है। यह भी मान लिया गया है कि आप एक Constants.swift फ़ाइल है जहाँ आप सूचीबद्ध स्थिरांक को परिभाषित:

func initializeLambda() { 

     let credentialsProvider = AWSStaticCredentialsProvider.init(accessKey:Constants.AWS_ACCESS_KEY, secretKey: Constants.AWS_SECRET_KEY) 
     let defaultServiceConfiguration = AWSServiceConfiguration(region: Constants.AWS_REGION, credentialsProvider: credentialsProvider) 
     AWSServiceManager.defaultServiceManager().defaultServiceConfiguration = defaultServiceConfiguration 
    } 

शेष हम एक संस्करण पिछले संस्करण के लिए इसी तरह प्रदान कर सकते हैं के लिए। मैंने 'लेट टास्क' हटा दिया क्योंकि 'टास्क' का इस्तेमाल उनके उदाहरण में नहीं किया जाता है। इसके अतिरिक्त, मैंने कुछ JSON पार्सिंग की तार्किक रूपरेखा शामिल की है जिसे आप इनवॉक कार्य के अंदर कर रहे हैं। अंत में, मैं एक जारी WithBlock() में बदल गया है। यदि आप निरंतर WithSuccessBlock() का उपयोग करते हैं तो आप इस ब्लॉक में प्रवेश नहीं करेंगे जब अमेज़ॅन लैम्ब्डा अपनी टाइमआउट विंडो तक पहुंचता है या अनुरोध के साथ कुछ और गलत हो जाता है और आमतौर पर आप इन स्थितियों को यहां संभालना चाहते हैं।

self.initializeLambda() //Call our previously written initialization function 
    let invocationRequest = AWSLambdaInvokerInvocationRequest() 
    invocationRequest.functionName = "functionName" 
    invocationRequest.invocationType = AWSLambdaInvocationType.RequestResponse 
    invocationRequest.payload = ["key1" : "value1", "key2" : "value2"] 
    let lambdaInvoker = AWSLambdaInvoker.defaultLambdaInvoker() 
    lambdaInvoker.invoke(invocationRequest).continueWithBlock() { (task: AWSTask) -> AWSTask in 
     print("response: ", task.result) 
     //In here you'll likely be parsing a JSON payload 
     if let payload: AnyObject = task.result?.payload { 
       if let error: AnyObject = payload.objectForKey("error") { 
        //If there is an error key in the JSON dictionary... 
       } else { 
        //If the JSON dictionary has no error key... 
       } 
     return task; 
     }  
    } 

एक्सकोड 7.3 में स्विफ्ट 2.2 पर कार्यात्मक के रूप में परीक्षण और सत्यापित।