【问题标题】:How send post with form-data in angular2如何在angular2中发送带有表单数据的帖子
【发布时间】:2017-03-17 10:33:48
【问题描述】:

我尝试使用 angular2 发布数据,但我在尝试发布时收到 400 错误请求... 在邮递员中进行测试,一切正常,我有 200 并且成功

但是,使用 angular2

我有一个 400 错误的请求 我做错了什么?谢谢 !

我的代码。 调用 API 的服务:

userAddReview(paramsObj) {
    let headers = new Headers();
    headers.append('Content-Type', 'application/json; charset=UTF-8');
    let params = this.util.transformRequest(paramsObj);
    console.log('sending request');
    return this.authHttp.post(this.wpApiURL + '/users-reviews/reviews?' + params, JSON.stringify({}), { headers: headers })
        .map(
            res => {
                let newReview = res.json();
                this.reviews.push(newReview);
                console.log(this.reviews);
                return newReview;
            }
        );
}

帖子组件:

submitReview(form) {
    console.log(this.review, form);
    let params = {
        id: this.review.post,
        user_id: this.wp.getCurrentAuthorId(),
        name: this.wp.getCurrentAuthorId(),
        email: this.wp.getCurrentAuthorId(),
        title:  this.review.rating_title,
        description: this.review.rating_comment,
        rating:     this.review.rating_score,
    };
    console.log("Review", params);
    this.review.author = this.wp.getCurrentAuthorId();
    this.wp.userAddReview(params)
            .subscribe(
                data => {
                    this.statusMessage = "Review added successfully!";
                    //clear form
                    form.reset();
                },
                error => {
                    console.log(error._body);
                    this.statusMessage = error._body;
                }
    );

模板:

<form name="reviewForm" #reviewForm="ngForm" novalidate *ngIf="showPanel()">
    <div *ngIf="!reviewText.valid && (reviewText.dirty || reviewText.touched)" class="alert alert-danger padding">review is required</div>

    <div class="padding">{{statusMessage}}</div>
    <ion-input type="text" [(ngModel)]="review.rating_score" #reviewScore="ngModel" name="reviewScore" placeholder="enter your review score..." required></ion-input>
    <ion-input type="text" [(ngModel)]="review.rating_title" #reviewTitle="ngModel" name="reviewTitle" placeholder="enter your review title..." required></ion-input>
    <ion-textarea
        [(ngModel)]="review.rating_comment"
        #reviewText="ngModel"
        name="reviewText"
        type="text"
        rows="2"
        placeholder="enter your review..."
        required
        >
    </ion-textarea>

    <ion-grid>
        <ion-row>
            <ion-col *ngIf="!isEditMode"><button ion-button block (click)="submitReview(reviewForm)" [disabled]="!reviewForm.valid">Add</button></ion-col>
            <ion-col *ngIf="isEditMode"><button ion-button block (click)="updateReview(reviewForm)" [disabled]="!reviewForm.valid">Update</button></ion-col>
            <ion-col width-33><button ion-button block (click)="onCancel()">Cancel</button></ion-col>
        </ion-row>
    </ion-grid>

</form>

<p *ngIf="!showPanel() && auth.authenticated()" (click)="isEditing = true;">Add Review</p>
<p *ngIf="!auth.authenticated()" (click)="reviewFormNotAuthClicked()">Add Review (login required)</p>

【问题讨论】:

  • 我已经回答了这样的问题......让我找到那个......
  • 是的,here it is

标签: angular post


【解决方案1】:

克里斯将参数连同标题一起发送,下面是代码

let url= `${this.wpApiURLl}users-reviews/reviews`;
  let params = new URLSearchParams;
  params.append('id', id);
  params.append('user_id', user_id);
 return this.authHttp.post( url,  { headers:headers,  search:params })
.map(
            res => {
                let newReview = res.json();
                this.reviews.push(newReview);
                console.log(this.reviews);
                return newReview;
            }
        );

【讨论】:

  • 谢谢!但我有同样的错误。我的请求有效载荷与您的代码是: {headers: {Content-Type: ["application/json; charset=UTF-8"]},...} headers : {Content-Type: ["application/json; charset=UTF- 8"]} 内容类型:["application/json;charset=UTF-8"] 0:"application/json;charset=UTF-8" 搜索:"id=5&user_id=1&name=1&email=1&title=sdsd&description=sdqffqs&rating =5"
  • 使用 URLSearchParams 分配参数 let params = new URLSearchParams; params.append('id', id); params.append('user_id', user_id);并将参数与标题一起发送
  • 谢谢!我试过了,但它不起作用,请参阅下一条消息。
  • 好的...我只是输入参数(而不是 { search : params} 并且它的工作...
【解决方案2】:

@Venkateswaran,没有比这更好的了:

    let params = new URLSearchParams;
    params.append('id', '5');
    params.append('user_id', '1');
    console.log('sending request');
    return this.authHttp.post(url, { search:params })
        .map(
            res => {
                let newReview = res.json();
                this.reviews.push(newReview);
                console.log(this.reviews);
                return newReview;
            }
        )
        .subscribe(
                data => {
                    this.statusMessage = "Review added successfully!";
                    //clear form
                    form.reset();
                },
                error => {
                    console.log(error._body);
                    this.statusMessage = error._body;
                }
    );
}

请求paylod为空:

{
  "search": {
    "rawParams": "",
    "queryEncoder": {},
    "paramsMap": {}
  }
}

【讨论】:

    【解决方案3】:

    从请求和图像来看,您似乎是通过 url 而不是请求的正文发送表单数据。 改变:

    return this.authHttp.post(this.wpApiURL + '/users-reviews/reviews?' + params, JSON.stringify({}), { headers: headers })
    

    收件人:

    return this.authHttp.post(this.wpApiURL + '/users-reviews/reviews', params, { headers: headers })
    

    记得将 params 设置为 URLSearchParams 对象。 let params = new URLSearchParams()

    【讨论】:

    • 谢谢 Suraj,尽管删除了 stringify,问题仍然存在。
    • 将参数设置为 URLSearchParams 并作为正文发送
    • 我试过了,我把代码贴在上一条消息上,但是我的resquest payload是空的。
    • 好的...我只是输入参数(而不是 { search : params} 并且它的工作...
    猜你喜欢
    • 2017-04-10
    • 1970-01-01
    • 2017-08-08
    • 1970-01-01
    • 1970-01-01
    • 2017-06-05
    • 1970-01-01
    • 2020-10-22
    • 2017-08-27
    相关资源
    最近更新 更多