【发布时间】:2017-06-13 03:32:06
【问题描述】:
我正在使用什么:
使用 Node 和 NPM 的 Angular 4 快速入门种子。
目标:
将数据发布到 .json 文件。即在 people.json 中的数组中添加一个新人
问题:
当我使用 http.post 方法将数据发布到 .json 文件时,我收到 404 错误,提示找不到 file.json。
如果我使用 http.get,它会很好地查找和检索数据。我传入的URL路径一模一样。
代码:
people.service.ts:
import { Injectable } from '@angular/core';
import { Http, Response, Headers, RequestOptions } from '@angular/http';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/catch';
import 'rxjs/add/operator/map';
import { Person} from './person';
@Injectable()
export class PeopleService
{
private testUrl = './data/people.json';
constructor(private http: Http) {}
Create(param: any): Observable<Person>
{
let headers = new Headers({ 'Content-Type': 'application/json' });
let options = new RequestOptions({ headers: headers });
return this.http.post(this.testUrl, body, options)
.map(this.extractData)
.catch(this.handleError);
}
/*
HELPER/ERROR
*/
private extractData(res: Response)
{
let body = res.json();
return body.data || { };
}
private handleError (error: Response | any)
{
let errMsg: string;
if (error instanceof Response)
{
const body = error.json() || '';
const err = body.error || JSON.stringify(body);
errMsg = `${error.status} - ${error.statusText || ''} ${err}`;
} else
{
errMsg = error.message ? error.message : error.toString();
}
console.error(errMsg);
return Observable.throw(errMsg);
}
}
person-detail.component.ts
import { Component, Input, OnInit } from '@angular/core';
import { ActivatedRoute, Params } from '@angular/router';
import { Location } from '@angular/common';
import { Person} from './person';
import { PeopleService } from './people.service';
@Component({
selector: 'person-detail',
templateUrl: './person-detail.component.html',
styleUrls: ['./person-detail.component.css']
})
export class PersonDetailComponent implements OnInit
{
@Input() person: Person;
errorMessage: string;
ngOnInit(): void{}
constructor(
private peopleService: PeopleService,
private route: ActivatedRoute,
private location: Location
){}
Add()
{
this.peopleService.Create(this.person).subscribe(/*person
=> person = this.person, error => this.errorMessage = <any>error*/);
}
}
编辑:
根据关于需要服务器端 API 来发布到的 cmets,我编写了一个很小的 test.php 文件,我得到了一个“Unexpected token
在阅读这篇文章SyntaxError: Unexpected token < in JSON at position 0 at Object.parse (native) (AngularJS) 之后,听起来我在我的 json 之前遇到了一个 html 错误,导致 JSON 中出现了意外的令牌,但我不知道我的 php 终端可能会遇到什么错误说“PHP注意:C中的数组到字符串转换:...”
people.service.ts(仅调整后的行)
import { Http, Response, Headers, RequestOptions } from '@angular/http';
private testUrl = 'http://localhost:8080/test.php';
Create(param: any): Observable<Person>
{
let headers = new Headers({ 'Content-Type': 'application/json' });
let urlParams = new URLSearchParams();
urlParams.append('method', 'add');
let options = new RequestOptions({ headers: headers, search: urlParams
});
return this.http.post(this.testUrl, param, options)
.map(this.extractData)
.catch(this.handleError);
}
test.php
<?php
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Headers: Content-type");
$method = $_SERVER['REQUEST_METHOD'];
//$request = explode('/', trim($_SERVER['PATH_INFO'],'/'));
$input = json_decode(file_get_contents('php://input'),true);
echo "<br>";
echo "<br>";
echo "Request method: ".$method;
echo "<br>";
//echo "Request: ".$request;
echo "<br>";
echo "Request input: ".$input;
?>
PHP 正在 PHP 内置 Web 服务器上运行,此命令是从项目文件夹中的 test.php 位置输入的:
php -S localhost:8080 test.php
【问题讨论】:
-
为什么要发布到 json 文件?该错误意味着此文件不存在或无法由发布请求处理。无论如何,如果你的 json 文件不在 API 后面,这根本不应该工作。
-
我不明白你的反对意见,请解释一下。另外,我还没有构建一个 php api,所以我使用 json 来测试没有服务器的功能。继《英雄之旅》教程之后,下一步是从 .json 文件中获取数据。我已经这样做了,所以我尝试将数据发布到它作为我的下一步。为什么它不起作用?
-
您不能只发布到文件,您必须发布到正在等待发布请求的服务。构建您提到的 API 并发布到该 API。
-
那么,我不能发布到文件的原因是因为它必须在服务器上?我认为 api 只是一种向用户隐藏功能的方法,但仍然使用方法发布到文件。但是,根据您刚才所说,它似乎必须在服务器上,因此对于 php api,我将发布到 php,然后 php 会将解码的 json 数据添加到文件中。这或多或少是正确的理解吗?
-
@slanden 好吧,我假设您在使用 api 时会发布将某些内容放入数据库并且没有“文件”的帖子。但这是真的,您不能发布到项目中的静态文件。没有可能。
标签: angular