2017-10-14 9 views
1

Je suis en train d'envoyer une fonction corps POST à un AWS Lambda utilisant le iOS (Swift) SDK généré par API AWS GATEWAY, mais le corps est toujours vide transmis.API Gateway: Corps de requête vide?

Pour ce faire, je mis en place un modèle:

{ 
    "$schema": "http://json-schema.org/draft-04/schema#", 
    "title": "InputModel", 
    "type": "object", 
    "required" : ["name"], 
    "properties": { 
     "name": { "type": "string" }, 
    } 
} 

, que je compris dans le Ressources $ ->/test -> POST -> Méthode d'exécution -> Méthode Demande -> Demande du corps panneau .

Puis j'ai déployé l'API et téléchargé et inclus le SDK généré par la passerelle API. Maintenant, je fais appel à l'API (comme recommandé dans Use Generated iOS SDK (Swift) to Call API) comme ceci:

let apiClient = APITestClient.default() 
let body = APITest() 
body!.name = "HOLA" 

apiClient.testPost(body: body!).continueWith { task -> Void in ... } 

Mais le corps ma fonction Lambda reçoit est toujours vide {}, que je suis arrivé dans l'API passerelle journaux:

(c421a895-b0c7-11e7-89a6-891dcbadf1f0) Method request body before transformations: 
{} 

et la fonction Lambda grumes:

2017-10-14T10:09:29.418Z c424b611-b0c7-11e7-99c1-251bdb6a1eac Request: 
{ 
    "resource": "/test", 
    "path": "/test", 
    "httpMethod": "POST", 
    "headers": { 
     "Accept": "application/json", 
     "Accept-Encoding": "br, gzip, deflate", 
     "Accept-Language": "en-us", 
     "CloudFront-Forwarded-Proto": "https", 
     "CloudFront-Is-Desktop-Viewer": "true", 
     "CloudFront-Is-Mobile-Viewer": "false", 
     "CloudFront-Is-SmartTV-Viewer": "false", 
     "CloudFront-Is-Tablet-Viewer": "false", 
     "CloudFront-Viewer-Country": "ES", 
     "content-type": "application/json", 
     "Host": "9hlt8n48wd.execute-api.eu-west-1.amazonaws.com", 
     "User-Agent": "aws-sdk-iOS/2.6.4 iOS/11.0 en_US", 
     "Via": "2.0 9ee2752d23ce7be13204dc3880c3ca6b.cloudfront.net (CloudFront)", 
     "X-Amz-Cf-Id": "39uT89_umng7zPCNHqn3WdLlNJ6zFbQ5fmLVzJJNFcud-7pdZYJ1mg==", 
     "X-AMZ-Date": "20171014T100929Z", 
     "x-amz-security-token": "---", 
     "X-Amzn-Trace-Id": "---", 
     "X-Forwarded-For": "---", 
     "X-Forwarded-Port": "443", 
     "X-Forwarded-Proto": "https" 
    }, 
    "queryStringParameters": null, 
    "pathParameters": null, 
    "stageVariables": null, 
    "requestContext": { 
     "path": "/production/test", 
     "accountId": "037641059503", 
     "resourceId": "hfza9c", 
     "stage": "production", 
     "requestId": "---", 
     "identity": { 
      --- 
     }, 
     "resourcePath": "/test", 
     "httpMethod": "POST", 
     "apiId": "---" 
    }, 
    "body": "{}", 
    "isBase64Encoded": false 
} 

Pourquoi le corps est-il toujours vide? Dois-je initialiser le corps différemment de moi? Ou y a-t-il une autre étape où le corps est défriché?


Edit: Je suis encore mal, mais en invoquant la normale AWS SDK iOS:

let apiClient = APITestClient.default() 
let apiGatewayRequest = AWSAPIGatewayRequest(httpMethod: "POST", urlString: "/test", queryParameters: nil, headerParameters: nil, httpBody: ["name":"example"]) 
apiClient.invoke(apiGatewayRequest).continueWith { task -> Void in ... } 

fonctionne parfaitement bien. Pourquoi AWS prend-il même la peine de générer un SDK API Gateway spécial ?!


Edit 2: Le modèle API

public class APITest : AWSModel { 

    var example: String? 

    public override static func jsonKeyPathsByPropertyKey() -> [AnyHashable : Any]!{ 
     var params:[AnyHashable : Any] = [:] 
     params["name"] = "name" 

     return params 
    } 
} 

qui est alors appelé par

public func testPost() -> AWSTask<APITest> { 
     let headerParameters = [ 
        "Content-Type": "application/json", 
        "Accept": "application/json", 

       ] 

     let queryParameters:[String:Any] = [:] 

     let pathParameters:[String:Any] = [:] 

     return self.invokeHTTPRequest("POST", urlString: "/test", pathParameters: pathParameters, queryParameters: queryParameters, headerParameters: headerParameters, body: nil, responseClass: APITest.self) as! AWSTask<APITest> 
    } 
+0

Pouvez-vous essayer une réponse fausse de demande d'intégration de la passerelle API? –

+0

J'ai essayé, mais le corps est toujours vide. Peut-il être que le SDK généré est incompatible avec Swift 4 de XCode 9.0? – Knowledge

+0

Pouvez-vous tester votre point de terminaison API avec Postman ou un autre client HTTP? – dashmug

Répondre

1

J'ai le même problème. Impossible de trouver une solution pour le moment. J'ouvre une demande d'assistance à Amazon et vous indique s'il existe une solution. Très frustrant.

0

je dû ajouter manuellement les @objcMembers attribut à la classe modèle de paramètres générés:

@objcMembers public class MyParamsModel : AWSModel