2016-10-07 24 views
1

编辑。建议小提琴手的人很棒。原来我张贴的API吓坏了,因为c#应用程序没有用户代理。因此,添加一个标头固定它发布与网络客户端返回400坏请求

我想用c#web客户端发布到api,但似乎是跑到墙上。我试图用这个代码发布json到api,但是我得到的是400个不好的请求,我不知道发生了什么。

output = "{ \"id\": \"xxxxxx\", \"company\": \"test\", \"fname\": \"test\", \"lname\": \"test\", \"member_level\": \"Member\",\"status\": \"active\"}"; 

using (var client = new WebClient()) 
{ 
    client.Headers.Add("token", "validtoken"); 
    client.Headers.Add("Content-Type", "application/json"); 
    client.UploadString(new Uri("url"), "POST", output); 
} 

我能够使用PowerShell成功发布使用webrequest,所以我知道URL和身份验证令牌是有效的。但无论出于何种原因,我无法让c#正确发布。这是正在运行的powershell命令

curl url -Method POST -H @{"token" = "token"} -ContentType "application/json" -Body '{ "id": "xxxxxx", "company": "test", "fname": "test", "lname": "test", "member_level": "test","status": "active"}' 
+2

安装[fiddler](http://www.telerik.com/fiddler)并查看两个HTTP请求。有什么区别。 – Liam

+0

适用于我的Fiddler - 确保“url”是一个真正的值,例如'code'http://127.0.0.1:8888'code' – Saltire

+0

任何不使用HttpClient的理由? –

回答

0

只需使用C#的内置功能来保持代码清洁。尽可能创建描述API通信合同的类。当不需要低级别控制时使用HttpClient。 HttpClient可以将这些对象作为JSON发送,并且通常不需要关心序列化问题。

这段代码应该在更换url部分后进行POST。由于你不发送令牌,这应该引发401错误 - 你没有被授权。添加您的有效令牌,删除评论,这个请求应该工作。

using System; 
using System.Collections.Generic; 
using System.Net.Http; 

public class User 
{ 
    public string Id { get; set; } 
    public string Company { get; set; } 
    public string FName { get; set; } 
    public string LName { get; set; } 
    public string MemberLevel { get; set; } 
    public string Status { get; set; } 
} 

class Program 
{ 
    static void CreateUser(User user) 
    { 
     using (var client = new HttpClient()) 
     { 
      // posts to https://yourawesomewebsite.com/api/users 
      client.BaseAddress = new Uri("https://yourawesomewebsite.com");    
      //client.Headers.Add("token", "validtoken"); 
      HttpResponseMessage response = client.PostAsJson("api/users", user); 
      response.EnsureSuccessStatusCode(); 
     } 
    } 

    static void Main() 
    {  
     // Create a new user 
     User user = new User 
     { 
      Id = "xxxxx", 
      Company = "Test", 
      FName = "Test", 
      LName = "Test", 
      MemberLevel = "Test", 
      Status = "Active" 
     }; 

     CreateUser(user); 
    } 
} 

参考

0

代替

client.UploadString(new Uri("url"), "POST", output); 

使用

client.UploadData(url, "POST", Encoding.UTF8.GetBytes(output));