Angular HTTP POST 请求抛出 net::ERR_HTTP2_PROTOCOL_ERROR 错误
Angular HTTP POST Request throwing net::ERR_HTTP2_PROTOCOL_ERROR error
我有自己的 API 和 POST
路线,工作方式如下,
Server
// Handling CORS with a simple lazy CORS
$app->options('/{routes:.+}', function ($request, $response, $args) {
return $response;
});
$app->add(function ($req, $res, $next) {
$response = $next($req, $res);
return $response
->withHeader('Access-Control-Allow-Origin', '*')
->withHeader('Access-Control-Allow-Headers', 'X-Requested-With, Content-Type, Accept, Origin, Authorization, application/json')
->withHeader('Access-Control-Allow-Methods', 'GET, POST')
->withHeader('Content-Type','application/json')
->withHeader('X-Powered-By','Mercurial API');
});
...
$app->post('/api/log', function( Request $request, Response $response){
$category = $request->getParam('category');
$value = $request->getParam('value');
return logQuery($category, $value, $response);
});
当我从其他来源发送 HTTP POST 请求时,服务器响应正常,Kindly click here to see the example
category:"SOME CAT"
value:"SOME VAL"
但是当我通过我的 Angular 应用程序发送相同内容时,
const httpOptions = {
headers: new HttpHeaders({
'Content-Type':'application/json'
})
};
...
public putLog(category: string, value: string) {
// You can add new argument in header like,
// httpOptions.headers = httpOptions.headers.set('Authorization', 'my-new-auth-token');
const body = JSON.stringify({ category: category, value: value });
console.log(body);
return this.http.post<any>(this.apiUrl + '/log', body, httpOptions)
.subscribe(
data => {
console.log('PUT Request is successful.');
},
(err: HttpErrorResponse) => {
if (err.error instanceof Error) {
console.log('Client-side error occured.');
} else {
console.log('Server-side error occured.');
}
});
}
}
我收到以下错误。
{"category":"message","value":"asdasd"}
Server-side error occured.
OPTIONS https://sizilkrishna.000webhostapp.com/api/public/api/log net::ERR_HTTP2_PROTOCOL_ERROR
我做错了什么?
您是否缺少 post 请求中的请求参数?
{params: {categogy: '2', message: .., ...}}
因为当我将您的 link 与请求参数一起使用时,我得到了 200 个结果。但是您没有向后端发送请求参数。
使用 angular 发送请求参数或在您的后端期待一个请求正文。但我不熟悉node/express。但似乎就是这样。
您的 api 需要 HttpParams,因此您应该将参数设置为参数而不是正文:
const params = new HttpParams().set("category", category).set("value", value);
const httpOptions = {
headers: new HttpHeaders({
'Accept': 'application/json',
}),
params: params
};
然后将正文设置为 null
:
return this.http
.post<any>(
this.apiUrl + "/log",
null,
httpOptions
)
// .....
这似乎工作得很好:STACKBLITZ
找了几个小时终于找到了解决办法
我的问题是当我将 headers 传递给 http get 或 post 请求时我收到了 ERR_HTTP2_PROTOCOL_ERROR 错误
只有当我使用 angular http 并且 api 在 postman 或其他带有 headers.[=11 的在线 http post 工具上完美运行时,我才会看到这个问题=]
我做的解决方案是转到您的服务器端 php 文件(api 文件)
并确保它只返回一个不超过一个的回声,并检查是否有任何问题需要修复。
这是我的代码
import { HttpClient , HttpParams, HttpHeaders, HttpErrorResponse} from '@angular/common/http';
const httpOptions = {
headers: new HttpHeaders({
'Content-Type': 'application/json',
Authorization: 'Your-Api-Key'
})
};
console.log(httpOptions)
return this.http.get('http://localhost:8080/api.php',httpOptions).subscribe((data)=>{
console.log(data)
})
我有自己的 API 和 POST
路线,工作方式如下,
Server
// Handling CORS with a simple lazy CORS
$app->options('/{routes:.+}', function ($request, $response, $args) {
return $response;
});
$app->add(function ($req, $res, $next) {
$response = $next($req, $res);
return $response
->withHeader('Access-Control-Allow-Origin', '*')
->withHeader('Access-Control-Allow-Headers', 'X-Requested-With, Content-Type, Accept, Origin, Authorization, application/json')
->withHeader('Access-Control-Allow-Methods', 'GET, POST')
->withHeader('Content-Type','application/json')
->withHeader('X-Powered-By','Mercurial API');
});
...
$app->post('/api/log', function( Request $request, Response $response){
$category = $request->getParam('category');
$value = $request->getParam('value');
return logQuery($category, $value, $response);
});
当我从其他来源发送 HTTP POST 请求时,服务器响应正常,Kindly click here to see the example
category:"SOME CAT"
value:"SOME VAL"
但是当我通过我的 Angular 应用程序发送相同内容时,
const httpOptions = {
headers: new HttpHeaders({
'Content-Type':'application/json'
})
};
...
public putLog(category: string, value: string) {
// You can add new argument in header like,
// httpOptions.headers = httpOptions.headers.set('Authorization', 'my-new-auth-token');
const body = JSON.stringify({ category: category, value: value });
console.log(body);
return this.http.post<any>(this.apiUrl + '/log', body, httpOptions)
.subscribe(
data => {
console.log('PUT Request is successful.');
},
(err: HttpErrorResponse) => {
if (err.error instanceof Error) {
console.log('Client-side error occured.');
} else {
console.log('Server-side error occured.');
}
});
}
}
我收到以下错误。
{"category":"message","value":"asdasd"}
Server-side error occured.
OPTIONS https://sizilkrishna.000webhostapp.com/api/public/api/log net::ERR_HTTP2_PROTOCOL_ERROR
我做错了什么?
您是否缺少 post 请求中的请求参数?
{params: {categogy: '2', message: .., ...}}
因为当我将您的 link 与请求参数一起使用时,我得到了 200 个结果。但是您没有向后端发送请求参数。
使用 angular 发送请求参数或在您的后端期待一个请求正文。但我不熟悉node/express。但似乎就是这样。
您的 api 需要 HttpParams,因此您应该将参数设置为参数而不是正文:
const params = new HttpParams().set("category", category).set("value", value);
const httpOptions = {
headers: new HttpHeaders({
'Accept': 'application/json',
}),
params: params
};
然后将正文设置为 null
:
return this.http
.post<any>(
this.apiUrl + "/log",
null,
httpOptions
)
// .....
这似乎工作得很好:STACKBLITZ
找了几个小时终于找到了解决办法 我的问题是当我将 headers 传递给 http get 或 post 请求时我收到了 ERR_HTTP2_PROTOCOL_ERROR 错误 只有当我使用 angular http 并且 api 在 postman 或其他带有 headers.[=11 的在线 http post 工具上完美运行时,我才会看到这个问题=]
我做的解决方案是转到您的服务器端 php 文件(api 文件) 并确保它只返回一个不超过一个的回声,并检查是否有任何问题需要修复。
这是我的代码
import { HttpClient , HttpParams, HttpHeaders, HttpErrorResponse} from '@angular/common/http';
const httpOptions = {
headers: new HttpHeaders({
'Content-Type': 'application/json',
Authorization: 'Your-Api-Key'
})
};
console.log(httpOptions)
return this.http.get('http://localhost:8080/api.php',httpOptions).subscribe((data)=>{
console.log(data)
})