我有一个Angular应用程序,可以与heroku上托管的API进行通信。简单地说,这是一个电影数据库,您可以在其中添加电影并从收藏夹中删除。
添加电影的请求:
addMovie(username: any, movieId: any): Observable<any> {
const token = localStorage.getItem('token');
return this.http.post(apiUrl + `users/${username}/movies/${movieId}`, {headers: new HttpHeaders(
{
Authorization: 'Bearer ' + token,
}
)}).pipe(
map(this.extractResponseData),
catchError(this.handleError)
);
}
以及删除电影:
deleteMovie(username: any, movieId: any): Observable<any> {
const token = localStorage.getItem('token');
return this.http.delete(apiUrl + `users/${username}/movies/${movieId}`, {headers: new HttpHeaders(
{
Authorization: 'Bearer ' + token,
}
)}).pipe(
map(this.extractResponseData),
catchError(this.handleError)
);
}
两个请求完全相同,但POST请求出于某种原因会删除授权标头,而DELETE请求则不会。当查看这两个请求的飞行前请求时,POST请求的飞行前甚至不会请求授权标头的余量,而DELETE请求的飞行前请求会删除授权标头。
POST的起飞前:
curl "https://somesite.com/users/tester/movies/6123fbc6a2a0fea2b1f81fd1" ^
-X "OPTIONS" ^
-H "Connection: keep-alive" ^
-H "Accept: */*" ^
-H "Access-Control-Request-Method: POST" ^
-H "Access-Control-Request-Headers: content-type" ^
-H "Origin: http://localhost:4200" ^
-H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.93 Safari/537.36" ^
-H "Sec-Fetch-Mode: cors" ^
-H "Sec-Fetch-Site: cross-site" ^
-H "Sec-Fetch-Dest: empty" ^
-H "Referer: http://localhost:4200/" ^
-H "Accept-Language: de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7" ^
删除的飞行前:
curl "https://somesite.com/users/tester/movies/61240c5da2a0fea2b1f81fd9" ^
-X "OPTIONS" ^
-H "Connection: keep-alive" ^
-H "Accept: */*" ^
-H "Access-Control-Request-Method: DELETE" ^
-H "Access-Control-Request-Headers: authorization" ^
-H "Origin: http://localhost:4200" ^
-H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.93 Safari/537.36" ^
-H "Sec-Fetch-Mode: cors" ^
-H "Sec-Fetch-Site: cross-site" ^
-H "Sec-Fetch-Dest: empty" ^
-H "Referer: http://localhost:4200/" ^
-H "Accept-Language: de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7" ^
用PUT替换POST会导致相同的问题。
POST请求中的第二个参数是正文。POST请求中的第三个参数是选项。DELETE请求中的第二个参数是选项。目前,您正在POST请求的正文中发送身份验证标头,但它属于选项。
你可以送一个空的尸体
addMovie(username: any, movieId: any): Observable<any> {
const token = localStorage.getItem('token');
return this.http.post(apiUrl + `users/${username}/movies/${movieId}`, {}, {headers: new HttpHeaders(
{
Authorization: 'Bearer ' + token,
}
)}).pipe(
map(this.extractResponseData),
catchError(this.handleError)
);
}
问题内容: 当我从HttpPost中使用setHeader设置“ Authorization”标头时,主机名将从请求中消失,并且始终返回错误400(错误请求)。相同的代码在纯Java(没有android)上可以正常工作,并且当我在android上删除设置“ Authorization”标头时也可以正常工作,但是我需要授权。这是一个代码(域已更改): 方法getB64Auth()返回使用“ Base
我正在使用 MEAN 堆栈用户注册和登录示例 我想将图像上传到Cloudinary,但收到此错误: XMLHttpRequest无法加载https://api.cloudinary.com/v1_1/xxxx/upload.请求标头字段授权不被预检响应中的Access-Control-Allow-Headers允许。 如何为Cloudinary的请求删除此标头?
客户端通过按附录B使用“application/x-www-form-urlencoded”格式向授权端点URI的查询部分添加下列参数构造请求URI: response_type 必需的。值必须设置为“token”。 client_id 必需的。如2.2节所述的客户端标识。 redirect_uri 可选的。如3.1.2节所述。 scope 可选的。如3.3节所述的访问请求的范围。 state 推
客户端通过按附录B使用“application/x-www-form-urlencoded”格式向授权端点URI的查询部分添加下列参数构造请求URI: response_type 必需的。值必须被设置为“code”。 client_id 必需的。如2.2节所述的客户端标识。 redirect_uri 可选的。如3.1.2节所述。 scope 可选的。如3.3节所述的访问请求的范围。 state 推
当我发布带有授权头的请求API时,我在角4中有一个问题? 令牌来自firebase auth 我用这个叫邮局 回复403!!! 请求URL:https://us-central1-xxxxxx-prod.cloudfunctions.net/api/post请求方法:选项 状态代码:403 远程地址:216.58。198.51:443 引用方策略:降级时无引用 响应头 访问控制允许方法:获取、发布
我正在尝试从Google API获取一个授权代码,如步骤1(设置授权参数)所述(HTTP/REST)。 正如我在那里读到的,谷歌授权服务器有以下强制性查询字符串参数:client_id、redirect_uri和范围,所以我的href看起来像这样: <代码>https://accounts.google.com/o/oauth2/v2/auth?client_id=123002756467-dmq
请看下面生成的guzzle请求数据。 我在这里做错了什么?请分享你的想法。谢谢你。
但我很困惑为什么Observable会在POST请求中返回英雄数据,或者根本不是成功代码的数据。我理解为什么GET请求会使用类型断言,但不太明白这是如何工作的。