Я работаю над проектом Angular, который предусматривает отправку данных (как JSON) на сервер с помощью HTTP-запроса POST / PUT. База данных представляет собой список JSON, к которому добавляется новый одиночный JSON каждый раз, когда запрос POST / PUT отправляет ему новый JSON. В каждом запросе PUT / POST шаблон JSON выглядит следующим образом:
{
"prop1": "123456",
"prop2": "abc",
"prop3": "xyz"
}
Давайте назовем выше JSON класса Hero, который имеет те же поля / свойства.
Список JSON в базе данных выглядит примерно так:
[
{
"prop1": "123456",
"prop2": "abc",
"prop3": "xyz"
},
{
"prop1": "456789"
"prop2": "abcd"
"prop3": "xyzz"
},
.....
]
Теперь я также использую HTTP-запрос GET для получения JSON из базы данных с помощью поля «prop1». Чтобы указать запрос на основе "prop1", я использую шаблон следующего типа, указанный на официальном Angular веб-сайте https://angular.io/guide/http
import {HttpParams} from "@angular/common/http";
/* GET heroes whose name contains search term */
searchHeroes(prop1Value: string): Observable<Hero[]> {
prop1Value = prop1Value.trim();
// Add safe, URL encoded search parameter if there is a search term
const options = prop1Value ? { params: new HttpParams().set('prop1', prop1Value) } : {};
return this.http.get<Hero[]>(this.heroesUrl, options)
.pipe(catchError(this.handleError<Hero[]>('searchHeroes', [])));
}
Проблема заключается в том, он извлекает все записи JSON, то есть весь список JSON из серверной части, вместо того, чтобы возвращать только JSON со значением поля "prop1" в качестве prop1Value.
Я опробовал несколько Варианты для свойства 'options' следующие, но все они работают одинаково, то есть извлекают весь список JSON, хранящихся в базе данных, вместо одного JSON, удовлетворяющего запросу.
const options = { params: new HttpParams().set('prop1', prop1Value) };
const params = new HttpParams({fromString: 'prop1='+prop1Value});
const options = {params};
Я также sh, чтобы уточнить еще одну вещь. Вместо того, чтобы иметь надлежащую базу данных, я просто создал папку с именем «api» прямо в папке «sr c». Внутри папки «api» я создал 2 папки: «folder1» и «folder2». Внутри 'folder1' у меня есть файл json с именем 'recordslist. json', который содержит список JSON. Я запускаю свою веб-страницу интерфейса на localhost:9000
и только что указал api/folder1/recordslist.json
в качестве пути (значения) к herosUrl
. Обратите внимание, что запрос GET работает, просто часть запроса / фильтра не работает, т.е. вместо получения спецификаций c JSON, удовлетворяющих запросу, он получает весь список JSON. Пожалуйста, помогите мне в решении этой проблемы.
Другая проблема, с которой я сталкиваюсь, заключается в том, что мой запрос POST / PUT вообще не работает. В браузере-> проверять-> консоль выдает различные типы ошибок, в основном 504 (время ожидания шлюза). Из-за этого он не может написать / добавить новый JSON в список JSON. Обратите внимание, что целевой URL такой же, то есть api/folder1/recordslist.json
Мой запрос PUT выглядит следующим образом:
/** PUT: update the hero on the server. Returns the updated hero upon success. */
updateHero (hero: Hero): Observable<Hero> {
return this.http.put<Hero>(this.heroesUrl, hero)
.pipe(
catchError(this.handleError('updateHero', hero))
);
}
Я также пробовал следующие варианты:
/** PUT: update the hero on the server. Returns the updated hero upon success. */
updateHero (hero: Hero): Observable<Hero> {
return this.http.put<any>(this.heroesUrl, hero)
.pipe(
catchError(this.handleError('updateHero', hero))
);
}
/** PUT: update the hero on the server. Returns the updated hero upon success. */
updateHero (hero: Hero) {
return this.http.put<any>(this.heroesUrl, hero)
.pipe(
catchError(this.handleError('updateHero', hero))
);
}
Пройдя много статей о Inte rnet, включая Stackoverflow, я также дважды проверил различные другие вещи, упомянутые людьми.
Например, я увидел следующий код в proxy.conf.json
file
{
"/api": {
"target": {
"port": 8080},
"secure": false
}
}
Включая это, я также попробовал следующие варианты этого:
{
"/api": {
"target": {
"port": 3000},
"secure": false
}
}
{
"/api": {
"target": "http://localhost:8080",
"secure": false
}
}
{
"/api": {
"target": "http://localhost:3000",
"secure": false
}
}
{
"/api": {
"target": "http://localhost:3000",
"secure": false,
"pathRewrite": {
"^/api": ""
}
}
}
{
"/api": {
"target": "http://localhost:3000",
"secure": false,
"pathRewrite": {
"^/api": ""
},
"changeOrigin": true
}
}
Ошибки в Inspect- > Консоль в основном относилась к следующим: «Внутренняя ошибка сервера», «Тайм-аут шлюза», «Плохой шлюз».
В командной строке в основном ошибка, отображаемая при выполнении запроса PUT, была примерно следующей:
Error occurred while trying to proxy request /api/folder1/recordslist.json from localhost:9000 to (port 8080) (ECONNREFUSED) nodejs.org/api/errors.html#errors_common_system_errors)
Я также подтвердил, что приведенный ниже код существует в файле angular. json:
"serve": {
"builder": "@angular-devkit/build-angular:dev-server",
"options": {
"browserTarget": "your-application-name:build",
"proxyConfig": "src/proxy.conf.json"
}
Из моего анализа я думаю, что есть некоторая проблема с часть прокси-сервера, из-за которой запрос PUT не может Обратись к моему JSON файлу. Однако странно, что запрос GET может извлечь записи из того же файла.
Я просмотрел несколько ссылок на Inte rnet, таких как https://angular.io/guide/build
, https://github.com/angular/angular-cli/blob/master/docs/documentation/stories/proxy.md
, https://github.com/saikat/react-apollo-starter-kit/issues/20
https://blog.angular-university.io/angular-http/
et c.
Мне так и не удалось найти решение обеих моих проблем. Я действительно прошу кого-нибудь помочь с обеими этими проблемами:
- Получение указанных c записей с использованием HTTP-запроса Get из моего
api/folder1/recordslist.json
файла - Обеспечение работы HTTP PUT и возможность добавьте JSON к моему
api/folder1/recordslist.json
файлу
Поверьте, я действительно много пытался решить эту проблему. Таким образом, это может занять что-то действительно сложное. Любая помощь приветствуется.
Обратите внимание, что в GET rqst я хочу, чтобы мое значение prop1Value передавалось с использованием переменной, а не кодировалось жестко, например "prop1='123456'"
. Скорее чем-то вроде prop1Value = "123456"; "prop1="+prop1Value;
Также, пожалуйста, дайте мне знать, почему работает запрос GET, а запрос PUT не выполняется.