【问题标题】:How to make a Post request with "content type": "application/x-www-form-urlencoded"?如何使用“内容类型”发出 Post 请求:“application/x-www-form-urlencoded”?
【发布时间】:2018-04-04 09:11:55
【问题描述】:

我需要发出请求以获取 oAuth2 身份验证服务器中的令牌。

我可以在邮递员中发出请求并获取令牌,但不能从角度 4 发出相同的请求。

我的 CORS 配置良好,因为其他请求运行良好。

这里是 HTTP 请求的详细信息。

POST /oauth/token HTTP/1.1
Host: localhost:8080
Authorization: Basic YXBwbGljYXRpb246c2VjcmV0
Content-Type: application/x-www-form-urlencoded
Cache-Control: no-cache
Postman-Token: 9f9582e9-fe73-499f-d7f7-82498a974e39

grant_type=password&username=pedroetb&password=password

在 Angular 4 中,我尝试过这种方式

let headers = new Headers();
    headers.append('Content-Type', 'application/x-www-form-urlencoded');
    headers.append("Authorization","Basic YXBwbGljYXRpb246c2VjcmV0");

    var obtainTokenUrl = 'http://localhost:8080/oauth/token';

    this._http.post(obtainTokenUrl + "?grant_type=password&username=pedroetb&password=password", null, {headers: headers}).subscribe(response => {
      console.log(response);
    });

但这不起作用。

这是邮递员请求的截图 标题:

身体:

那么我怎样才能从 angular 4 发出同样的请求呢?

【问题讨论】:

    标签: node.js angular oauth-2.0 http-post


    【解决方案1】:

    这是我检索用户数据的简单代码。看,标题作为标题选项给出。您可以在docs查看更多内容

    createUser(user: User): Observable<User> {
        const submittedUser = JSON.stringify(user); // user is form-submitted data object
        const headers = new Headers ({ 'Content-Type': 'application/json' });
        const options = new RequestOptions({headers: headers});
        return this.http.post(baseURL + 'user/create', submittedUser, options)
          .map((response: Response) =>  {this.processHttpmsgService.extractData(response);})
          .catch(error=> Observable.throw(error));
      }
    

    Docs for HeaderOptions

    【讨论】:

    • 我可以发出普通的 api 请求,但不知道如何发送包含所有这些标头和表单数据的请求,例如 application/x-www-form-urlencoded。
    【解决方案2】:

    PostRequest(url:string,data:any) {

    var headers = new Headers();
    
    let req = JSON.stringify(data);
    
     this.onRequest("request: " + url + "data: " + req);
    
    headers.append ("content-Type","application/json");
    headers.append("charset","utf-8;");
    headers.append("Access-Control-Allow-Origin", "*");
    var token = localStorage.getItem('token');
    headers.append("Authorization","Bearer "+ token);
    
     let options = new RequestOptions({ headers: headers });
    console.log(options);
    
      // don't have the data yet
     return new Promise(resolve => {
    
       this.http.post(url,req,options)
       .map(res => res.json())
       .subscribe(data => {
         resolve(data);
    
         this.onSuccess(data);
      }
      ,error => {
     this.onError(error);
      }
      );
    });
    

    }

    别忘了导入 从'@angular/http'导入{Http, Headers,RequestOptions};

    【讨论】:

    • 当我提出请求时,我没有令牌。是为了获取令牌。实际上我如何发送grant_type、用户名和密码?
    • this.http.post(tokenURL,"username="+username+"&password="+ password + "&grant_type=password", { headers: headers })
    • 我试过这样。但它向我发送“XMLHttpRequest 无法加载 localhost:8080/oauth/…。预检响应具有无效的 HTTP 状态代码 400”
    • 很抱歉,但您似乎应该检查您的服务方法,因为它对我来说是一个很好的解决方案。
    • 第 7 行需要一个令牌。但是在这个请求中,我要求服务器给我一个令牌。
    猜你喜欢
    • 2014-03-30
    • 2017-12-18
    • 2019-12-24
    • 2017-08-26
    • 1970-01-01
    • 2020-04-21
    • 1970-01-01
    • 2021-02-03
    相关资源
    最近更新 更多