我在共享 OVH 上制作了一个托管 API 的 API,后端使用 Symfony 7。 前端基于 Angular 18.2 一切工作正常,除了第一个 API 调用总是比另一个调用慢。
我用 Curl 做了连接器,然后换成了 Guzzle,它改善了响应时间,但总是太慢。 最初我用 AngularJS 1.82 做了 Front,然后我改为 Angular 18.2 它并没有提高性能,但我可以使用 RXJS 等现代工具来改进 API 调用。
您对改善首次呼叫响应时间有什么想法吗?
这是我用于创建令牌的适配器代码和一个简单的 GET 代币
public function generateCreatioToken() {
$client = new Client();
$options = [
'form_params' => [
'client_id' => $this->clientId,
'client_secret' => $this->clientSecret,
'grant_type' => 'client_credentials'
]];
$request = new Request( 'POST', $this->oauthurl .'/connect/token',
['headers' => ['User-Agent' => null]]);
$res = $client->sendAsync($request, $options)->wait();
return json_decode($res->getBody());
}
获取
/*
* READ
* Requête en GET sur CRM
* $apiQuery: array dont le contenu des éléments est encodé en URL
*/
public function WSGETBPM($collection, $apiQuery, $token, $nbresult = 10000) {
$client = new Client();
$headers = [
'Accept' => 'application/json; odata=verbose',
'Authorization' => 'Bearer '.$token,
'User-Agent' => null
];
$targetUrl = $this->urlapi . '/0/ServiceModel/EntityDataService.svc/' . $collection;
if (count($apiQuery) > 0) {
$targetUrl .= '?' . implode('&', array_map(function ($item) {
return $item[0] . '=' . $item[1];
}, array_map(null, array_keys($apiQuery), $apiQuery)));
}
$request = new Request('GET', $targetUrl, $headers);
$res = $client->sendAsync($request)->wait();
return $res->getBody();
}
使用 Angular 我的服务代码:
getOrderNumberById(orderId: string): Observable<OrderValidation> {
const options = { params: new HttpParams().set('orderId', orderId) };
return this.http.post<OrderValidation>(this.url + 'Creatio/getOrderNumberById', options).pipe(
retry(3),
catchError(this.handleError)
)
}
使用拦截器:
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
const authToken = this.authService.getAuthToken();
const authReq = request.clone({
setHeaders: {
'Authorization': `${authToken}`,
'Content-Type': 'application/json; charset=utf-8'
}
})
在我的 API 适配器上我添加了 Guzzle 缓存:
$stack = HandlerStack::create();
$stack->push(new CacheMiddleware(), 'cache');
// Initialize the client with the handler option
$client = new Client(['handler' => $stack]);
在.htaccess中:
<ifModule mod_headers.c>
Header set Connection keep-alive
</ifModule>
我添加了一个计划任务,每小时至少进行一次 API 调用。
看起来不错。