Trying to access the following API but keep getting an error when access it. The url is correct and works perfectly when run through postman.
let data = this.http.get<any>('http://chargepoints.dft.gov.uk/api/retrieve/registry/lat/53.790224/long/-1.563929/dist/3/format/json');
Just this call alone returns this error
CONSOLE ERROR
file:///app/tns_modules/#angular/core/bundles/core.umd.js:15769:28:
ERROR {
"headers": {
"normalizedNames": {},
"lazyUpdate": null,
"headers": {}
},
"status": 0,
"statusText": "Unknown Error",
"url":"http://chargepoints.dft.gov.uk/api/retrieve/registry/lat/53.790224/long/-1.563929/dist/3",
"ok": false,
"name": "HttpErrorResponse",
"message": "Http failure response for http://chargepoints.dft.gov.uk/api/retrieve/registry/lat/53.790224/long/-1.563929/dist/3: 0 Unknown Error",
"error": {
"line": 1298,
"column": 38,
"sourceURL": "file:///app/tns_modules/nativescript-angular/zone-js/dist/zone-nativescript.js",
"originalStack": "ZoneAwareError#file:///app/tns_modules/nativescript-angular/zone-js/dist/zone-nativescript.js:1298:38\nfile:///app/tns_modules/tns-core-modules/http/http-request/http-request.js:97:37\nUIApplicationMain#[native code]\n_start#file:///app/tns_modules/tns-core-modules/application/application.js:275:26\nrun#file:///app/tns_mo<…>
If I simply change the path to a different api it works absolutely fine.
Can anyone point me in the right direction as to what i'm missing.
So i've updated the AndroidManifest and that works fine now, however via iOs I still get the same problem.
you need pass content type in your HTTP call
let httpOptions = { headers: new HttpHeaders(
{
'Content-Type': 'application/json'
})}
this.http.get<any>(url, httpOptions).subscribe(payloadResponse => {
console.log('response received', payloadResponse);
}, error => {
// failed
});
Related
I'm trying to use the v3 javascript sdk to invoke a AWS Lambda function, and I'm having problems getting any meaningful response.
My code looks like so...
const { Lambda } = require("#aws-sdk/client-lambda");
const client = new Lambda();
const params = {
FunctionName: "MyLamdaFuncton",
Payload: JSON.stringify({ "action": "do_something" }),
InvocationType: "Event"
};
client.invoke(params)
.then((response) => {
console.log(JSON.stringify(response,null,4));
})
.catch((err) => {
console.error(err);
})
I can confirm from checking the CloudWatch logs that the lambda function works as exepcted. However this is the response I get in my NodeJS code...
{
"$metadata": {
"httpStatusCode": 202,
"requestId": "d6ba189d-9156-4f01-bd51-efe34a66fe34",
"attempts": 1,
"totalRetryDelay": 0
},
"Payload": {}
}
How do I get the actual response and status from the Lambda function?
If I change the payload above to intentionally throw an exception in my Lambda, the response in the console is still exactly the same.
update:
The Lambda function is written in Ruby. The response is returned like so...
{ statusCode: 200, body: JSON.generate(response.success?) }
where "response" is from another service it calls internally.
I've figured out what I was doing wrong. The issue was the "InvocationType". I got it working by changing to...
InvocationType: "RequestResponse"
Then I had to extract the response data like so...
const response_data = JSON.parse(new TextDecoder("utf-8").decode(response.Payload))
My AWS ApiGateway invokes this lambda function :
const handler = (event, context) => {
const theResponse = {
"statusCode": 200,
"isBase64Encoded": false,
"headers": {
"Content-Type": "application/json"
},
"body": "hello, world"
};
switch (event.httpMethod) {
case 'GET':
theResponse["body"] = `method ${event.httpMethod} detected`;
break;
default:
theResponse["statusCode"] = 404;
theResponse["body"] = `Unsupported method ${event.httpMethod} detected`;
break;
}
return theResponse;
};
module.exports = {
handler,
};
Any thoughts to why this errors with :
{"message": "Internal server error"}
Received response. Status: 200, Integration latency: 344 ms
Endpoint response body before transformations: null
Execution failed due to configuration error: Malformed Lambda proxy response
Method completed with status: 502
I tried replacing return (theResponse); with return JSON.stringify(theResponse); but this also returns the same error.
However if I replace return theResponse; with return {"statusCode":200, "body":"hello, world"}; then the API executes without errors.
Looks to me like a lamda_proxy integration issue but I can't see why. thanks.
Bearrider!
I guess it is related to the way you are building your response object:
Try stringify only the body attribute:
case 'GET':
theResponse["body"] = JSON.stringify(`method ${event.httpMethod} detected`);
break;
default:
theResponse["statusCode"] = 404;
theResponse["body"] = JSON.stringify(`Unsupported method ${event.httpMethod} detected`);
break;
}
I'm working with an AWS Lambda with serverless framework and I want to return a custom http status code when an error occurs but I'm always getting a 502 status code when I call my endpoint with axios.
module.exports.handler = async (event, context, callback) => {
try {
// some stuff
} catch (err) {
// error here
let myErrorObj = {
errorType : "InternalServerError",
httpStatus : 500,
requestId : context.awsRequestId,
trace : {
"function": "abc()",
"line": 123,
"file": "abc.js"
},
body: err
}
callback(JSON.stringify(myErrorObj));
}
}
But the object I'm getting back contains the property status: 502 and data.message: "Internal server error"
Any ideas of what is going on here?
status code 502 indicates the lambda's response to API Gateway is in an incorrect format.
The correct response for an async function (if not integration method stated in serverless YAML file, it would use Lambda Proxy Integration):
export const dummyFunction = async (event, context, callback) =>
{
// ... logic
return {
statusCode: 500,
body: JSON.stringify({...data}),
}
};
Callback is only for non-async function only. Please refer to full documentation.
Are you using API Gateway with your Lambda? If so, what you are returning in the callback is incorrect. The object you return must match this format: https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html#api-gateway-simple-proxy-for-lambda-output-format
So you can either just callback(err) and let AWS generate a 500 or if you want the added error context something like:
let myErrorObj = {
statusCode : 500,
body: JSON.stringify({
requestId : context.awsRequestId,
trace : {
"function": "abc()",
"line": 123,
"file": "abc.js"
}
error: err
}
})
}
callback(null, myErrorObj);
If you want requestId and trace attributes you would need to add them into the body.
I use Serverless-Authentication-boilerplate and want to map custom error response. But it always return 500 error.
authorize.js
// Authorize
function authorize(event, callback) {
let providerConfig = config(event);
try {
let data = utils.readToken(event.authorizationToken, providerConfig.token_secret);
console.log("Decrypted data: " + JSON.stringify(data));
let methodArn = event.methodArn.replace(/(GET|POST|PUT|DELETE)/g, '*').replace(/mgnt.+/g, 'mgnt/*');
console.log(`Change methodArn to: ${methodArn}`);
// TODO: handle expiration time validation
callback(null, utils.generatePolicy(
data.id, // which is $context.authorizer.principalId
'Allow',
methodArn));
} catch (err) {
console.log(err);
callback('401 Unauthenticated');
}
}
s-function.json
responses:{
"401 Unauthenticated.*": {
"statusCode": "401"
},
"default": {
"statusCode": "200",
"responseModels": {
"application/json;charset=UTF-8": "Empty"
},
"responseTemplates": {
"application/json;charset=UTF-8": ""
}
}
}
After ask to Amazon Web Services.
Unfortunately the mapping of the Authorizer is not currently configurable and every returned error from a lambda function will map to a 500 status code in API gateway. Moreover, the mapping is performed on an exact string match of the output, so, in order to return the intended 401 Error to the client, you should execute a call to 'context.fail('Unauthorized');.
Finally, I change
callback('401 Unauthenticated');
to
context.fail('Unauthorized');
and work fine.
Sharing to whom may encounter this.
I am setting up a new angular app and encountered a strange error anytime I tried to make am ajax request with $http.
I have the following code:
srnApp.controller('WallCtrl', [
'$scope', '$http',
function($scope, $http) {
$http.post('/api', {
"method":"wallStuff"
}).success(function(data, status, headers, config) {
console.log("SUCCESS retrieving wall: \n", data);
}).error(function(data, status, headers, config) {
console.log("ERROR getting wall: \n", data, status, headers, config);
});
]);
Every time the request is made I get the following error object before the error callback is called:
Exception {
message: "",
result: 2153644038,
name: "",
filename: "myServer.net/js/angular.min.js",
lineNumber: 78,
columnNumber: 0,
inner: null,
data: null
}
What exactly does this mean and how can I work around it?
I figured out the problem. My resource was not the same as the place from which the js was served so the browser would not allow the request. I fixed this by changing some server side stuff.