【问题标题】:Form post using promise not working使用 Promise 的表单帖子不起作用
【发布时间】:2018-09-17 05:48:55
【问题描述】:

我正在 Angular 4 中处理用户注册表单。我的 RestApi 工作正常。我试过使用邮递员。我不知道为什么表格没有发布。

我在控制台标题中收到以下错误:

Request Method: OPTIONS
Status Code: 405 Method Not Allowed

我已经尝试了以下代码。

register.component.html

<form (ngSubmit)="onRegister(userForm)" #userForm="ngForm">
    <div class="form-group">
        <label for="email">Email</label>
        <input type="text" class="form-control" id="email" placeholder="enter email" [(ngModel)]="user.email" name="email" #email = "ngModel" pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,3}$" required>
        <div *ngIf="email.invalid && (email.dirty || email.touched)"
        class="alert alert-danger">
            <div *ngIf = "email.errors?.required">Email field can't be blank</div>
            <div *ngIf = "email.errors?.pattern && email.touched">The email id doesn't seem right</div>
        </div>
    </div>
    <div class="form-group">
        <button type="reset" class="btn btn-default">Cancel</button>
        <button type="submit" class="btn btn-primary" [disabled]="!userForm.form.valid">Submit</button>
    </div>
</form>

register.component.ts

export class RegisterComponent implements OnInit {

    private user: User;
    userForm: FormGroup;
    // constructor(private auth: AuthService, private http: Http) {}
    constructor(private _fb: FormBuilder, private auth: AuthService, private http: Http) { } // form builder simplify form initialization


    ngOnInit() {
        this.user = new User({
            email:"", 
            password: { password: "" , confirmPassword: ""}, 
        })
    }

    onRegister(): void {
        console.log("this is me", this.user);
        this.auth.register(this.user)
        .then((user) => {
            // console.log(user.json());
        })
        .catch((err) => {
            console.log(err);
        });
    }

}

auth.service.ts

@Injectable()
export class AuthService {
    private BASE_URL: string = 'http://myapp.local/public_html';
    private headers: Headers = new Headers({'Content-Type': 'application/json'});

constructor(private http: Http) {}

// register = function(user) {
register(user): Promise<any> {
    console.log("This is registration page service", user);
    let url: string = `${this.BASE_URL}/user`;
    console.log("url", url);
    return this.http.post(url, user).toPromise();
}

}

【问题讨论】:

    标签: angular angular4-forms


    【解决方案1】:

    作为 POST 的一部分,尝试将 contentType 设置为 application/json。为此,您可以在帖子中提供 headers

    register(user): Promise<any> {
        const headers: Headers = new Headers();
        headers.append('Content-Type', 'application/json');
    
        const requestOptions = new RequestOptions({
            headers: headers
        });
    
        console.log("This is registration page service", user);
        let url: string = `${this.BASE_URL}/user`;
        console.log("url", url);
        return this.http.post(url, user, requestOptions).toPromise();
    }
    

    此外,在服务器端,根据您使用的框架,确保将HttpMethod 指定为Post

    在您的服务代码中,您已定义 Headers 对象,但您并未将其作为请求的一部分发送。

    另外,看看这两个处理类似问题的帖子:

    OPTIONS 405 (Method Not Allowed)

    WebAPI Delete not working - 405 Method Not Allowed

    【讨论】:

    • 是的,我已经尝试过您的解决方案,但结果仍然相同
    • 您使用的是哪种服务器端技术? ASP.NET,PHP?您是否也尝试使用 CORS?
    • 很遗憾,我对 PHP 了解不多。您必须查看您的服务器配置(我猜它是 Apache)并查看如何删除 OPTIONS HTTP 方法的限制。
    【解决方案2】:

    您是否尝试将方法更改为“POST”?可能是您的方法在端点上期望“POST”并且您通过“GET”发送它

    【讨论】:

    • 返回 this.http.get(url, user).toPromise();我试过使用get,我可以检索数据。我的问题是帖子
    • 您可以查看谷歌浏览器控制台网络选项卡以查看标头、请求和响应吗?这将帮助您确定您实际发布的内容。检查 Method ,它应该是 POST 那里。
    • 是的,我已经检查过了。响应说“方法不允许”,并且标题消息具有请求方法:选项状态代码:405 方法不允许。我已经在我的问题中提到了它们
    猜你喜欢
    • 1970-01-01
    • 2011-12-30
    • 2018-10-16
    • 2014-09-09
    • 1970-01-01
    • 2010-12-20
    • 1970-01-01
    • 1970-01-01
    • 2018-12-21
    相关资源
    最近更新 更多