2016-10-07 94 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));