У меня есть клиент в Angular, и мой сервер находится в C ++. Я знаю, что лучше использовать узел, но использование сервера C ++ является ограничением. Я использую это сервер Я нашел на GitHub. Когда я делаю запрос httpClient.get, он возвращает ошибку.
Код на сервере:
int send_response(int fd, char *header, char *content_type, char *body) {
const int max_response_size = 65536;
char response[max_response_size];
// Get current time for the HTTP header
time_t t1 = time(NULL);
struct tm *ltime = localtime(&t1);
// How many bytes in the body
int content_length = strlen(body);
int response_length = sprintf(response,
"%s\r\n""Access-Control-Allow-Origin: %s\r\n""Access-Control-Allow-Methods: %s\r\n""Content-Length: %d\r\n""Content-Type: %s\r\n""Date: %s" // asctime adds its own newline
"Connection: close\r\n""\r\n" // End of HTTP header
"%s",
header,
"*",
"POST, GET",
content_length,
content_type,
asctime(ltime),
body
);
// Send it all!
int rv = send(fd, response, response_length, 0);
if (rv < 0)
perror("send");
return rv;
}
void get_d20(int fd) {
char response_body[8];
sprintf(response_body, "%d", 5);
send_response(fd, "HTTP/1.1 200 OK", "text/plain", response_body);
}
И это мой код клиента:
public my_function(): void {
let theResp;
this.getServer().subscribe((resp) => {
theResp = resp;
});
console.log('Return of get: ' + theResp);
}
public getServer(): Observable<any> {
const httpOptions = {
headers: new HttpHeaders({
'Authorization': '*'
})
}
return this.httpClient.get('http://SERVER_IP_ADRESS:3490/d20', httpOptions);
}
Каждый раз, когда я пытаюсь это сделать, я получаю одну и ту же ошибку:
zone.js:2969 OPTIONS http://SERVER_IP_ADRESS:3490/d20 0 ()
core.js:1601 ERROR HttpErrorResponse {headers: HttpHeaders, status: 0, statusText: "Unknown Error", url: null, ok: false, …}
Я знаю, что это проблема CORS, но я не могу найти решение. Что я могу сделать, чтобы получить мой HTTP-запрос на получение и получить ответ?
Спецификация HTTP требует \r\n
и не \n
,
Взгляни на https://github.com/Microsoft/cpprestsdk, легко создать сервер C ++.
Что касается кода, который вы используете, вам, вероятно, нужно изменить функцию
void handle_http_request(int fd)
Чтобы разобраться с глаголом ОПЦИИ что-то вроде
else if (strcmp(request_type, "OPTIONS") == 0) {
if (strcmp(request_path, "/d20") == 0) {
options_d20(fd, body);
} else {
resp_404(fd, request_path);
}
}
А затем реализуйте новую функцию options_d20, которая, вероятно, потребует добавления в буфер заголовков следующих заголовков:
"Access-Control-Allow-Origin":"*"
"Access-Control-Allow-Methods":"GET, OPTIONS"
"Access-Control-Max-Age":"3600"
"Access-Control-Allow-Headers":"Content-Type, Access-Control-Allow-Headers,Authorization, X-Requested-With"
Но я просто догадываюсь.