Reputation: 1279
I've a problem when I try to do PATCH request in an angular 7 web application. In my backend I have:
app.use((req, res, next) => {
res.set({
"Access-Control-Allow-Origin": "*",
"Access-Control-Allow-Methods": "*",
"Access-Control-Allow-Headers": "'Access-Control-Allow-Headers: Origin, Content-Type, X-Auth-Token'",
});
next();
});
In my frontend service, I've:
patchEntity(ent: any, id) {
let headers = new Headers({ 'Content-Type': '*' });
let options = new RequestOptions({ headers: headers });
return this.http.patch('my_url', ent).map((res: Response) => res.json());
};
The error is:
Access to XMLHttpRequest at 'my_url' from origin 'http://localhost:4200' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: It does not have HTTP ok status.
What can I to do? Thanks.
Upvotes: 88
Views: 509798
Reputation: 104
In my case, I use this header at the bottom of ".htaccess":
Header always set Access-Control-Allow-Origin "https://example.com"
Header always set Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS"
Header always set Access-Control-Allow-Headers "Origin, X-Requested-With, Content-Type,Authorization, Accept"
Header always set Access-Control-Allow-Credentials "true"
Upvotes: 0
Reputation: 477
In my case, the error was due to a missing '/' in service.ts. I was using Django for the backend.
getData(id: number): Observable<any> {
return this.http.get<any>(`${this.APIurl}/data/${id}`);
}
So, I added a '/' at the end.
getData(id: number): Observable<any> {
return this.http.get<any>(`${this.APIurl}/data/${id}/`);
}
Upvotes: 0
Reputation: 11
Adding proxy in package.json or bypassing with chrome extension is not really a solution. Just make sure you've enabled CORS in your server side before you have registered your routes. Given example is in Node.js and Express.js. Hope this helps!
app.use(cors())
app.use('/posts', postRoutes)
Upvotes: 0
Reputation: 57
for those who using ASP.net Core in the Backend
ADD this to program.cs
builder.Services.AddCors(c =>
{
c.AddPolicy("AllowOrigin", options => options.AllowAnyOrigin().AllowAnyMethod().
AllowAnyHeader());
});
app.UseCors("AllowOrigin");
Upvotes: 1
Reputation: 21
In my case, I got the same below error while I am trying to access my URL.
Access to XMLHttpRequest at 'https://XXX-XXX-XXX-default-rtdb.asia-southeast1.firebasedatabase.app/' from origin 'http://localhost:4200' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: It does not have HTTP ok status.
The code I used to send this request is below,
this.http
.put(
"https://XXX-XXX-XXX-default-rtdb.asia-southeast1.firebasedatabase.app/",
data
)
.subscribe((response) => {
console.log(response);
});
I tried searching for a solution to my issue and couldn't find the exact solution. Anyhow I managed to figure out my mistake and here is my solution.
For my case, the error is due to invalid URL. I am supposed to send with a .json
at the end of URL for firebase to consider it as a valid URL. (https://firebase.google.com/docs/database/rest/start)
After appending .json
to my URL, my http requests got success.
this.http
.put(
"https://XXX-XXX-XXX-default-rtdb.asia-southeast1.firebasedatabase.app/.json",
data
)
.subscribe((response) => {
console.log(response);
});
Upvotes: 1
Reputation: 119
I had this issues and it was an syntax error in my action definition
def self.rate_skills(params)
data = {}
data = where(individual_id: params[:individual_id]).select(:tool_name, :score)group('category').order(score: :desc).first(3)
data
end
the issue is that I was the period before "group"
def self.rate_skills(params)
data = {}
data = where(individual_id: params[:individual_id]).select(:tool_name, :score).group('category').order(score: :desc).first(3)
data
end
Upvotes: 0
Reputation: 350
Your error:
Access to XMLHttpRequest at
'my_url'
from origin 'http://localhost:4200' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: It does not have HTTP ok status.
My error:
Access to XMLHttpRequest at
'localhost:3000/api/todo'
from origin 'http://localhost:4200' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https.
(Even though a bit different error but i'll answer anyway)
Now two questions here:
Ans. Putting 'http://' before api i used, means 'http://localhost:3000/api/todo'.
Ans. Can't say for sure but i dont see your api url instead it says 'my_url' (comparing both errors). I thik you may've passed string instead of variable.
I'll be happy if this helps anyone. Because this cost me almost 2hr and now it's midnight(almost).
Upvotes: 12
Reputation: 9885
I ran into the same issue even though my API was using cors and had the proper headers.
So for me, the issue was that I was making an insecure request. I was accessing my API over the http protocol, and that was causing the error.
I just changed from
http://api.example.com
to https protocol
https://api.example.com
and it fixed everything.
You can also create a simple proxy on your website to forward your request to the external site. For example, if you are trying to fetch some data from your website (my-website.com) to (another-website.com) and you make a POST request, you can have cors issues, but if you fetch the data from your own domain you will be good.
Here is how to create a simple proxy forwarding the request https://stackoverflow.com/a/20354642/7602110
So instead of making request to
POST https://api.example.com/event/create
You'll want to make the request to
POST https://my-website.com/api/event/create
I know that is some extra work, and sometimes you don't have the ability to do it, but that will definitely prevent you from having cors issues.
Upvotes: 9
Reputation: 10227
use this in Node
app.use(function (req, res, next) {
//Enabling CORS
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Methods", "GET,HEAD,OPTIONS,POST,PUT");
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type,
Accept, x-client-key, x-client-token, x-client-secret, Authorization");
next();
});
And in angular the request is
auth(login): Promise<any> {
return new Promise((resolve, reject) => {
this._http.post('url:3000/api/auth/login', { ...login })
.subscribe((response: any) => {
resolve(response);
});
});
}
Upvotes: 7
Reputation: 948
There are two ways this can be handled:
Click on window -> type run and hit enter -> in the command window copy:
chrome.exe --user-data-dir="C://Chrome dev session" --disable-web-security
This will open a new "Chrome" window where you can work easily. This is a temporary solution. Every time you will have to work with this chrome window.
In the backend code, the developer needs to add an annotation @Crossorigin right above the CRUD api call method.
Let me know if it works.
Upvotes: 75
Reputation: 31
I ran into the same issue some time ago. Below piece of code worked for me at the backend. The backend was written in express, node.
app.use(function (request, response, next) {
response.header("Access-Control-Allow-Origin", "*");
response.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
next();
});
Upvotes: 2
Reputation: 59
If you are using Tomcat try this: full documentation
HttpServletResponse response = (HttpServletResponse) servletResponse;
HttpServletRequest request = (HttpServletRequest) servletRequest;
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Credentials", "true");
response.setHeader("Access-Control-Allow-Methods", "GET, POST, PATCH, PUT, DELETE, OPTIONS, HEAD");
response.setHeader("Access-Control-Allow-Headers", "Origin, Accept, X-Requested-With, Content-Type, "
+ "Access-Control-Request-Method, Access-Control-Request-Headers, Authorization");
if ( request.getMethod().equals("OPTIONS") ) {
response.setStatus(HttpServletResponse.SC_OK);
return;
}
filterChain.doFilter(servletRequest, servletResponse);
Then in web.xml
<filter>
<filter-name>cors</filter-name>
<filter-class>classYouImplementTheCodeAbove</filter-class>
</filter>
<filter-mapping>
<filter-name>cors</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
If you are using other go to https://enable-cors.org/server.html and search for it
Upvotes: 0
Reputation: 122
This problem is not on your frontend angular code it is related to backend,
Try below steps in your backend code :
1.npm install cors
2.put app.use(cors())
in main express route file.(enables all CORS requests)
may be it works for you.
reference link : https://expressjs.com/en/resources/middleware/cors.html
Upvotes: 3