#angular #httpclient
#angular #httpclient
Вопрос:
Изо всех сил пытаясь заставить простой http post работать, вот код, который у меня есть:
var config = {
headers : {
'Content-Type': 'application/json'
}
}
var data = {
"gender":"M"
};
this.http.post<any>("http://localhost:8080/rest/endpoint", JSON.stringify(data), config)
.subscribe(
(val) => {
console.log("POST call successful value returned in body",
val);
},
response => {
console.log("POST call in error", response);
},
() => {
console.log("The POST observable is now completed.");
}
);
}
Этот запрос вызывается нажатием кнопки, и при выполнении я вижу на вкладке Chrome network, что был выполнен http-запрос OPTIONS, который вернул GET, HEAD, POST, PUT, DELETE, OPTIONS, а затем POST был выполнен, но, похоже, он не отправил телоданные, которые я намеревался отправить, ниже приведены на вкладке сеть:
**General**
Request URL: http://localhost:8080/rest/endpoint
Request Method: OPTIONS
Status Code: 200
Remote Address: [::1]:8080
Referrer Policy: no-referrer-when-downgrade
**Response Headers:**
Allow: GET, HEAD, POST, PUT, DELETE, OPTIONS
Content-Length: 0
Date: Mon, 22 Apr 2019 11:18:51 GMT
**Request Headers:**
Accept: */*
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9,pt-BR;q=0.8,pt;q=0.7
Access-Control-Request-Headers: content-type
Access-Control-Request-Method: POST
Connection: keep-alive
Host: localhost:8080
Origin: http://localhost:4200
User-Agent: Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Mobile Safari/537.36
Комментарии:
1. developer.mozilla.org/en-US/docs/Web/HTTP/CORS
2. Вам не нужно вводить данные в строку, если вы используете
HttpClient
, передавайтеdata
напрямую (как объект).3. Я попробовал объект напрямую, не ограничивая его, тот же результат.
4. boreq, я думал, что CORS не будет проблемой, поскольку angular и API работают локально, нет? Я намерен развернуть angular и API в разных поддоменах одного домена, сработает ли это?
5. Он работает после разрешения CORS.
Ответ №1:
В Angular лучше всего поддерживать сервис и компонент отдельно.
При использовании angular cli вы можете сгенерировать новую службу с помощью ng g service ServiceName
Добавьте / включите сервис в свой appmodule (корневой модуль) в массив providers, чтобы сделать его доступным во всем мире.Вы также можете сделать службу локальной, включив ее в определенный файл component.ts.
Я предоставлю вам базовый outlook / working. В service.ts импортируйте необходимые модули.
import { Injectable } from '@angular/core';
import { HttpClient, HttpParams, HttpErrorResponse } from "@angular/common/http";
import { Observable } from "rxjs";
@Injectable({
providedIn: 'root'
})
export class serviceName {
private url = `http://localhost:8080/rest/endpoint`
constructor(private http: HttpClient) { }
//method
public newGender(data): Observable<any> {
const params = new HttpParams()
.set('gender', data.gender)
return this.http.post(`${this.url}`, params)
}
В component.ts
constructor(service:serviceName){}
//subscribe to service now
//method
public methodName=()=>{
let data = {
"gender":"M"
};
this.service.newGender(data).susbcribe(
response=>{
//your response
})
} //end method (call this method if needed)
Комментарии:
1. Я разделил вызов на службу, как было предложено, но это не имело никакого значения, в любом случае, спасибо, я вижу, что теперь он лучше организован.
2. Вы импортировали httpclientmodule в корневой модуль?
3. Да, он импортирован, я начинаю понимать, что это действительно проблема CORS, на что ссылается борек в своем комментарии в вопросе, но пока не уверен.
4. установили ли вы allowedCorsOrigin = «*» в серверной части?
5. Пытаясь настроить это на данный момент, этого не произошло, но ошибка сначала не выглядела как проблема CORS.