2016-01-28 11 views
7

Tworzę webhook do odbierania powiadomień z usługi innej firmy, wysyłają dane do treści POST o treści typu application/x-www-form-urlencoded.Zakodowany kod pocztowy do Amazon API Gateway

Ale to generuje ten sam błąd:

{"message": "Could not parse request body into json: Unrecognized token \'name\': was expecting \'null\', \'true\', \'false\' or NaN\n at [Source: [[email protected]; line: 1, column: 6]"} 

mogę odtworzyć błąd z następującym curl rozmowy:

% curl -v -X POST -d 'name=Ignacio&city=Tehuixtla' https://rl9b6lh8gk.execute-api.us-east-1.amazonaws.com/prod/mandrillListener 
* Trying 54.230.227.63... 
* Connected to rl9b6lh8gk.execute-api.us-east-1.amazonaws.com (54.230.227.63) port 443 (#0) 
* TLS 1.2 connection using TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 
* Server certificate: *.execute-api.us-east-1.amazonaws.com 
* Server certificate: Symantec Class 3 Secure Server CA - G4 
* Server certificate: VeriSign Class 3 Public Primary Certification Authority - G5 
> POST /prod/mandrillListener HTTP/1.1 
> Host: rl9b6lh8gk.execute-api.us-east-1.amazonaws.com 
> User-Agent: curl/7.43.0 
> Accept: */* 
> Content-Length: 27 
> Content-Type: application/x-www-form-urlencoded 
> 
* upload completely sent off: 27 out of 27 bytes 
< HTTP/1.1 400 Bad Request 
< Content-Type: application/json 
< Content-Length: 180 
< Connection: keep-alive 
< Date: Thu, 28 Jan 2016 12:29:40 GMT 
< x-amzn-RequestId: cd4d9232-c5ba-11e5-a158-b9b39f0b0599 
< X-Cache: Error from cloudfront 
< Via: 1.1 1915b8b49d2fbff532431a79650103eb.cloudfront.net (CloudFront) 
< X-Amz-Cf-Id: cxU2_b5DzIw4M_n3hJBFXTu9AVRBL3GpbQqUId9IxgS004DfLYqYmg== 
< 
* Connection #0 to host rl9b6lh8gk.execute-api.us-east-1.amazonaws.com left intact 
{"message": "Could not parse request body into json: Unrecognized token \'name\': was expecting \'null\', \'true\', \'false\' or NaN\n at [Source: [[email protected]; line: 1, column: 6]"} 

Gdybym owinąć ciało cudzysłów to działa dobrze:

% curl -v -X POST -d '"name=Ignacio&city=Tehuixtla"' https://rl9b6lh8gk.execute-api.us-east-1.amazonaws.com/prod/mandrillListener 
* Trying 54.230.227.19... 
* Connected to rl9b6lh8gk.execute-api.us-east-1.amazonaws.com (54.230.227.19) port 443 (#0) 
* TLS 1.2 connection using TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 
* Server certificate: *.execute-api.us-east-1.amazonaws.com 
* Server certificate: Symantec Class 3 Secure Server CA - G4 
* Server certificate: VeriSign Class 3 Public Primary Certification Authority - G5 
> POST /prod/mandrillListener HTTP/1.1 
> Host: rl9b6lh8gk.execute-api.us-east-1.amazonaws.com 
> User-Agent: curl/7.43.0 
> Accept: */* 
> Content-Length: 29 
> Content-Type: application/x-www-form-urlencoded 
> 
* upload completely sent off: 29 out of 29 bytes 
< HTTP/1.1 200 OK 
< Content-Type: application/json 
< Content-Length: 6 
< Connection: keep-alive 
< Date: Thu, 28 Jan 2016 12:33:20 GMT 
< x-amzn-RequestId: 50610606-c5bb-11e5-b140-5d837ffe26ed 
< X-Cache: Miss from cloudfront 
< Via: 1.1 a670cda0e28541e40881b95b60c672b7.cloudfront.net (CloudFront) 
< X-Amz-Cf-Id: mCLKL4eOnpUMd15IXQZw0RStJHw9Vdf3ivdCl37dcmno2JFOfxw0Vg== 
< 
* Connection #0 to host rl9b6lh8gk.execute-api.us-east-1.amazonaws.com left intact 
"true"% 

Lamba ma tylko jedną linię:

context.succeed('true'); 

W jaki sposób ustawić bramę api nie traktować ciała jako json?

Próbowałem dokumentacji o mapowaniu szablonów bez powodzenia, nawet próbowałem przekonwertować go do statycznego szablonu, bez żadnych zmiennych! We wszystkich przypadkach błąd występuje przed uzyskaniem dostępu do mojego kodu.

Odpowiedz

7

Spróbuj ustawić szablon mapowania następujące:

{ 
    "body" : $input.json('$') 
} 

Byłoby to ci konwertować ciąg w JSON i przekazać do lambda.

Z funkcji amazon docs: $input.json(x) oblicza wyrażenie JSONPath i zwraca wyniki jako ciąg znaków JSON.

+2

Jak odpowiedział @hayduke, ważne jest wdrożenie interfejsu API po tej zmianie, aby aplikacja została zastosowana. – jfredys

+0

@jfredys +1 +1 +1 +1 Po zmianie szablonu mapowania całkowicie zniknęło wdrożenie. Zmarnowany dwa dni. – droidlabour

3

Jest nie są całkowicie powiązane, ale jeśli jesteś nowicjuszem w Amazon API Gateway, konieczny był jeszcze jeden krok, o którym nie wiedziałem, że należy wdrożyć twój interfejs API po dodaniu szablonu mapowania, tak jak sugerowali inni. Kosztowało mnie to sporo czasu na debugowanie, ponieważ nie rozumiałem, dlaczego nadal otrzymuję ten błąd, nawet po opublikowaniu sugestii.

przypadku korzystania z konsoli AWS,

  • przejść do dowolnej szyby w swoim API
  • menu
  • wybrać czynności na najwyższym
  • Wybierz Deploy API z menu wybierz odpowiednią scenę i potwierdzić
Powiązane problemy