首页 文章

Angular2 - Http POST请求参数

提问于
浏览
78

我正在尝试发出POST请求,但我无法让它工作:

testRequest() {
      var body = 'username=myusername?password=mypassword';
      var headers = new Headers();
      headers.append('Content-Type', 'application/x-www-form-urlencoded');

      this.http
        .post('/api',
          body, {
            headers: headers
          })
          .subscribe(data => {
                alert('ok');
          }, error => {
              console.log(JSON.stringify(error.json()));
          });
}

我基本上想要复制这个http请求(不是ajax),就像它是由html表单生成的:

网址:/ api

参数:用户名和密码

8 回答

  • 91

    我认为 application/x-www-form-urlencoded 内容类型的正文不正确 . 你可以尝试使用这个:

    var body = 'username=myusername&password=mypassword';
    

    希望它对你有帮助,蒂埃里

  • 38

    更新 Angualar 4.3+

    现在我们可以使用 HttpClient 而不是 Http

    指南是here

    示例代码

    const myheader = new HttpHeaders().set('Content-Type', 'application/x-www-form-urlencoded')
    let body = new HttpParams();
    body = body.set('username', USERNAME);
    body = body.set('password', PASSWORD);
    http
      .post('/api', body, {
        headers: myheader),
      })
      .subscribe();
    

    Deprecated

    或者你可以这样做:

    let urlSearchParams = new URLSearchParams();
    urlSearchParams.append('username', username);
    urlSearchParams.append('password', password);
    let body = urlSearchParams.toString()
    

    Update Oct/2017

    angular4+ 开始,我们不需要 headers.toString() 个东西 . 相反,你可以像下面的例子那样做

    import { URLSearchParams } from '@angular/http';
    

    POST / PUT方法

    let urlSearchParams = new URLSearchParams();
    urlSearchParams.append('username', username);
    urlSearchParams.append('password', password);
    this.http.post('/api', urlSearchParams).subscribe(
          data => {
            alert('ok');
          },
          error => {
            console.log(JSON.stringify(error.json()));
          }
        )
    

    GET / DELETE方法

    let urlSearchParams = new URLSearchParams();
        urlSearchParams.append('username', username);
        urlSearchParams.append('password', password);
        this.http.get('/api', { search: urlSearchParams }).subscribe(
          data => {
            alert('ok');
          },
          error => {
            console.log(JSON.stringify(error.json()));
          }
        )
    

    对于JSON application/json Content-Type

    this.http.post('/api',
          JSON.stringify({
            username: username,
            password: password,
          })).subscribe(
          data => {
            alert('ok');
          },
          error => {
            console.log(JSON.stringify(error.json()));
          }
          )
    
  • 3

    在Angular2的更高版本中,如果将正确类型的对象作为 body 传递,则无需手动设置 Content-Type 标头并对主体进行编码 .

    你只需要这样做

    import { URLSearchParams } from "@angular/http"
    
    
    testRequest() {
      let data = new URLSearchParams();
      data.append('username', username);
      data.append('password', password);
    
      this.http
        .post('/api', data)
          .subscribe(data => {
                alert('ok');
          }, error => {
              console.log(error.json());
          });
    }
    

    这样,角度将为您编码身体,并将设置正确的 Content-Type 标头 .

    附:不要忘记从 @angular/http 导入 URLSearchParams ,否则它将无效 .

  • 6

    所以只是为了得到一个完整的答案:

    login(username, password) {
            var headers = new Headers();
            headers.append('Content-Type', 'application/x-www-form-urlencoded');
            let urlSearchParams = new URLSearchParams();
            urlSearchParams.append('username', username);
            urlSearchParams.append('password', password);
            let body = urlSearchParams.toString()
            return this.http.post('http://localHost:3000/users/login', body, {headers:headers})
                .map((response: Response) => {
                    // login successful if there's a jwt token in the response
                    console.log(response);
                    var body = response.json();
                    console.log(body);
                    if (body.response){
                        let user = response.json();
                        if (user && user.token) {
                            // store user details and jwt token in local storage to keep user logged in between page refreshes
                            localStorage.setItem('currentUser', JSON.stringify(user)); 
                        }
                    }
                    else{
                        return body;
                    }
                });
        }
    
  • 0

    对于那些使用HttpClient而不是Http的人来说,这些答案都已经过时了 . 我开始疯狂地思考,“我已经完成了URLSearchParams的导入,但是如果没有.toString()和显式 Headers ,它仍然无效!”

    使用HttpClient,使用HttpParams而不是URLSearchParams并注意 body = body.append() 语法,以便在我们使用不可变对象时在主体中实现多个参数:

    login(userName: string, password: string): Promise<boolean> {
        if (!userName || !password) {
          return Promise.resolve(false);
        }
    
        let body: HttpParams = new HttpParams();
        body = body.append('grant_type', 'password');
        body = body.append('username', userName);
        body = body.append('password', password);
    
        return this.http.post(this.url, body)
          .map(res => {
            if (res) {          
              return true;
            }
            return false;
          })
          .toPromise();
      }
    
  • -2

    如果有人正在努力 angular version 4+ (mine was 4.3.6) . 这是为我工作的示例代码 .

    首先添加所需的导入

    import { Http, Headers, Response, URLSearchParams } from '@angular/http';
    

    然后为api功能 . 这是一个登录样本,可以根据您的需要进行更改 .

    login(username: string, password: string) {
        var headers = new Headers();
        headers.append('Content-Type', 'application/x-www-form-urlencoded');
        let urlSearchParams = new URLSearchParams();
        urlSearchParams.append('email', username);
        urlSearchParams.append('password', password);
        let body = urlSearchParams.toString()
    
        return this.http.post('http://localhost:3000/api/v1/login', body, {headers: headers})
            .map((response: Response) => {
                // login successful if user.status = success in the response
                let user = response.json();
                console.log(user.status)
                if (user && "success" == user.status) {
                    // store user details and jwt token in local storage to keep user logged in between page refreshes
                    localStorage.setItem('currentUser', JSON.stringify(user.data));
                }
            });
    }
    
  • 40

    我使用多个参数的每个方法都遇到问题,但它对单个对象很有效

    API:

    [HttpPut]
        [Route("addfeeratevalue")]
        public object AddFeeRateValue(MyValeObject val)
    

    角度:

    var o = {ID:rateId, AMOUNT_TO: amountTo, VALUE: value};
    return this.http.put('/api/ctrl/mymethod', JSON.stringify(o), this.getPutHeaders());
    
    
    private getPutHeaders(){
        let headers = new Headers();
        headers.append('Content-Type', 'application/json');
        return new RequestOptions({
            headers: headers
            , withCredentials: true // optional when using windows auth
        });
    }
    
  • 4

    当我试图做类似的事情时,我降落在这里 . 对于application / x-www-form-urlencoded内容类型,您可以尝试将其用于正文:

    var body = 'username' =myusername & 'password'=mypassword;
    

    你尝试过的,分配给body的值将是一个字符串 .

相关问题