Angular2 - Http POST请求参数
Angular2 - Http POST请求参数
我试图进行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表单发起的:
URL:/api
参数:用户名和密码
在Angular2的后续版本中,如果你传递了一个正确类型的对象作为body参数,就不需要手动设置Content-Type头和编码请求体。
你可以简单地这样做:
import { URLSearchParams } from "/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());
});
}
这样,Angular会为您编码请求体并设置正确的Content-Type头。
P.S.别忘了从/http中导入URLSearchParams,否则它将无法工作。
你知道是在哪个版本中添加了这个功能吗?
我不知道是在哪个版本中添加的,但在2.3.1及更高版本中可以使用。
它不起作用,你必须在参数上调用.toString(),而且你必须指定Content-Type,我使用的是Angular 4.0.3。
'myourhuckleberry在4.0.3版本上应该可以工作。看一下源代码github.com/angular/angular/blob/4.0.3/packages/http/src/…
对我来说不起作用,我已经在Github上报告了一个bug。
好吧。我忘记从/http中导入这个,否则它会识别为不同的类型,而不是Angular的类型。
'myourhuckleberry这个导入是我示例中的第一行,但你可能错过了它。从浏览器内置的类型中,你可以使用FormData
,Angular会将Content-Type设置为multipart/form-data,这也可以工作。
这不起作用,只有将参数添加到URL中才有效。
如果你将参数添加到URL中,这与在请求体中发送带有有效负载的POST请求是不同的。附加的URL参数被称为“查询字符串”。
'myourhuckleberry我看到你的评论,但仍然错过了它:)我以为我要疯了。对于阅读此文章的每个人:确保import { URLSearchParams } from "/http"
,否则它将导入lib.es6.d.ts中的默认值!(这将要求您手动提到内容类型并执行.toString())
这就是我转向React/Vue的原因,Angular太混乱了,如果你使用Vue/React,你可以选择最适合你的HTTP库。我不喜欢Observables,我可以选择一个使用Futures的库。有趣的事实是:Angular开发人员可能在他们自己制造的困境中挣扎:)个人而言,Vue看起来真的很简单!React在状态管理方面有点混乱,但我用微软的Resub解决了这个问题(我不是微软的粉丝,他们在所有教程中都宣传Azure,这让我很讨厌!)
虽然我只用Angular做过一个项目,它工作得很好,但它是一个框架,我记得总是有一些简单问题,而且最常见的是某个库的某个部分不工作,当我在Github上报告问题时,我完全被忽视了。如果它更简单一些会更好!我有点喜欢这些特殊属性,比如ngFor,但是导入方面有太多的复杂性。当你使用React或Vue时,你必须单独安装诸如路由和国际化等东西。
好的,我忘记导入URLSearchParams,现在一切都正常了,谢谢。
在使用Angular2进行Http POST请求时,有些人可能会遇到一个问题,即请求的参数无法正确传递。解决这个问题的方法如下:
问题的原因是请求的body不适用于"application/x-www-form-urlencoded"这种内容类型。可以尝试使用以下代码来解决这个问题:
var body = 'username=myusername&password=mypassword';
上述代码将参数以键值对的形式进行拼接,然后将其作为请求的body。
希望这个方法对你有帮助。
然而,这个解决方法并不是最佳的选择。可以使用URLSearchParams来代替上述方法,这种方法更加简洁。以下是一个更好的解决方法:
import { URLSearchParams } from "/http"; let params = new URLSearchParams(); params.set('username', 'myusername'); params.set('password', 'mypassword'); let body = params.toString();
上述代码中,首先导入URLSearchParams类,然后创建一个URLSearchParams对象。接下来,使用set方法设置参数的键值对。最后,通过调用toString方法将参数转换为字符串形式,即可作为请求的body。
对于需要设置"application/json"这种内容类型的请求,可以直接传递一个JSON对象作为请求的body。例如:
let body = JSON.stringify({username: 'myusername', password: 'mypassword'});
通过将JSON对象转换为字符串形式,即可作为请求的body。
希望以上解决方法对你有帮助!
Angular2中的Http POST请求参数问题的出现原因是使用了已经过时的Http模块。解决方法是使用更新的HttpClient模块来发送POST请求。
在更新后的Angular版本(4.3+)中,可以使用HttpClient模块来发送POST请求。示例代码如下:
import { HttpClient, HttpHeaders } from '@angular/common/http'; 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();
在之前版本的Angular中,可以使用URLSearchParams来发送POST请求。示例代码如下:
import { URLSearchParams } from 'angular2/http'; let urlSearchParams = new URLSearchParams(); urlSearchParams.append('username', username); urlSearchParams.append('password', password); let body = urlSearchParams.toString(); this.http.post('/api', body).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())); } )
需要注意的是,对于URLSearchParams的导入方式可能会有所不同,具体根据项目的导入方式进行调整。
关于boolean类型的处理,可以参考stackoverflow上的相关讨论。具体链接如下:
[typescript convert a bool to string value](https://stackoverflow.com/questions/14774907)
根据最新的回答,如果使用Angular的URLSearchParams,就不需要对其进行toString操作,也不需要设置Content-Type,Angular会自动推断。相关链接如下:
[github.com/angular/angular/blob/4.4.4/packages/http/src/static_request.ts#L134](https://github.com/angular/angular/blob/4.4.4/packages/http/src/static_request.ts#L134)
[github.com/angular/angular/blob/4.4.4/packages/http/src/static_request.ts#L157](https://github.com/angular/angular/blob/4.4.4/packages/http/src/static_request.ts#L157)
[github.com/angular/angular/blob/4.4.4/packages/http/src/body.ts#L54](https://github.com/angular/angular/blob/4.4.4/packages/http/src/body.ts#L54)