花费数小时与简单的POST请求对抗Web API控制器。
Here's the response header from Postman:
Access-Control-Allow-Headers → Content-Type
Access-Control-Allow-Methods → GET, POST, PUT, DELETE, OPTIONS
Access-Control-Allow-Origin → *
Cache-Control → no-cache
Content-Length → 2153
Content-Type → application/json; charset=utf-8
Date → Wed, 04 Nov 2015 23:26:14 GMT
Expires → -1
Pragma → no-cache
Server → Microsoft-IIS/10.0
X-AspNet-Version → 4.0.30319
X-Powered-By → ASP.NET
X-SourceFiles → =?UTF-8?B?QzpcVXNlcnNcSnVsaWFcRG9jdW1lbnRzXFZpc3VhbCBTdHVkaW8gMjAxM1xQcm9qZWN0c1xUd2lsZHlcQVBJXGFwaVxUZXN0XHRlc3Rc?=

我尝试了这两种POST方法都没有成功:
[Route("api/{Test}/test")]
[HttpPost]
public void PostByProducts(Test t)
{
Console.Write(t.Name);
}

更新:下面的代码替换为最终有效的代码。注意,我添加了Name =" PostData"这是Controller的名称。否则,得到" null reference"错误。 "数据数据"本身就是模特中的一个类。
[ResponseType(typeof(Data))]
[Route("api/{Test}/testpost/", Name="PostData")]
public IHttpActionResult PostData(Data data)
{
int rValue = 0;
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
else
{
if (data != null)
{
rValue = repo.PostTestMe(data);
}
else
{
return BadRequest();
}
}
return CreatedAtRoute("PostData", rValue, data);
}

#1我的班级"测试"无论请求内容类型如何,始终以null为单位。我在Postman中尝试了所有这些,包括json。阅读一些SO答案,我确实在模型类中添加了一个空构造函数(" Test")
在#2上(旧:从角度发布时我得到空值)现在也使用更新的代码发布角度。当我从邮递员发帖时工作。
我在我的智慧结束。我想要做的就是从Angular发布一个简单的表单。
更新:现在它适用于Postman。我在函数中得到一个非null值,并在Postman中得到这个响应:
Access-Control-Allow-Headers → Content-Type
Access-Control-Allow-Methods → GET, POST, PUT, DELETE, OPTIONS
Access-Control-Allow-Origin → *
Cache-Control → no-cache
Content-Length → 1308
Content-Type → application/json; charset=utf-8
Date → Thu, 05 Nov 2015 03:15:26 GMT
Expires → -1
Pragma → no-cache
Server → Microsoft-IIS/10.0
X-AspNet-Version → 4.0.30319
X-Powered-By → ASP.NET
X-SourceFiles → =?UTF-8?B?QzpcVXNlcnNcSnVsaWFcRG9jdW1lbnRzXFZpc3VhbCBTdHVkaW8gMjAxM1xQcm9qZWN0c1xUd2lsZHlcQVBJXGFwaVx0ZXN0cG9zdA==?=

Angular code :( formdata直接来自html表单,使用form.Field1,form.Field2等引用,对应于C#模型类)
factory.postForm = function(formdata) {
return $http({
url: 'http://domain.com/api/test/testpost',
data: JSON.stringify(formdata),
method: 'POST',
headers: {
'Content-Type': 'application/json; charset=utf-8'
}
}).success(function(response) {
console.log('posted ' + formdata)
});
}

(旧:仍然在API post函数中获取null。)一切正常。
最终更新:
平心而论,当我将源代码上传到共享主机上的实时服务器,并且API托管在同一个域下,只是一个不同的项目时,一切正常,我获得了201 Created OK响应。
所以,这是一个CORS问题,我想,这很有意思,因为一切在本地主机上可以正常用于GET请求,但是POST给了我很多困难。
顺便说一下,我最终没有使用[FromBody] - 它没有使用它。更新:结束为路线添加名称。一切正常。
答案 0 :(得分:0)
我之前遇到过类似的问题,在我的情况下,在类参数解决问题之前添加[FromBody]。
在您的情况下,测试方法必须如下所示。
[HttpPost]
public IHttpActionResult PostTest([FromBody]Test test)
{
}
可以找到FromUri和FromBody的详细说明here。
答案 1 :(得分:0)
我已经花了数小时在stackoverflow和google中四处寻找解决方案,这是我为解决该问题所做的事情
在Angular中使用HttpClientModule
时,无需调用JSON.stringify(formdata)
,因为data参数根据需要进行了字符串化
@Injectable()
export class ParkingService {
constructor(private http: HttpClient) { }
create(parking: Parking) {
const requestUrl = environment.apiUrl + 'parking' ;
const headerOptions = new HttpHeaders();
headerOptions.set('Content-Type', 'application/json');
//In this line is my issue
return this.http.post(requestUrl, JSON.stringify(parking), {headers: headerOptions}) ;
}
}
我将这一行更改为此行,并且该行有效了(假设它是由邮递员提供的)
return this.http.post(requestUrl, parking, {headers: headerOptions}) ;
如果您的角度客户端使用其他端口/机器上的Web API,则需要在该API中启用CORS。对于.Net Core,如果它的某些其他编程语言以相同的方式查找它,这里是一些很好的答案How to enable CORS in ASP.net Core WebAPI