2016-05-28 79 views
0

我必須編寫一個小小的C#控制檯應用程序(但我的.NET知識幾乎爲NULL)來向PHP API發出POST請求,爲此我使用HttpClient實例。該API接受這樣c#字典作爲哈希表的值

{ 
    "User": { 
     "email": "[email protected]", 
     "password": "something" 
    }, 
    "Establishment": { 
     "id": 147 
    } 
} 

一個JSON做就怎麼做一些這方面的研究是我到目前爲止已經完成後是這樣的:

 static async Task RunAsync() 
     { 
      using (var client = new HttpClient()) 
      { 
       client.BaseAddress = new Uri("http://italdelo.web.development.co/"); 
       client.DefaultRequestHeaders.Accept.Clear(); 
       client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 

       try 
       { 
        // HTTP POST 
        Dictionary<string, string> user = new Dictionary<string, string>(); 
        Dictionary<string, int> establishment = new Dictionary<string, int>(); 
        HashTable postdata = new HashTable(); 

        user.Add("email","[email protected]"); 
        user.Add("password","something"); 
        establishment.Add("id",147); 
        postdata.Add("User",user); 
        postdata.Add("Establishment",establishment); 


        HttpResponseMessage response = await client.PostAsJsonAsync("apiname/service", postdata); 
        response.EnsureSuccessStatusCode(); // Throw if not a success code. 
       } 
       catch (HttpRequestException e) 
       { 
        Console.WriteLine("Exception details: " + e.ToString()); 
       } 
      } 
     } 

運行這段代碼,我得到這個錯誤信息:

Severity Code Description Project File Line Suppression State Error CS0246 The type or namespace name 'HashTable' could not be found (are you missing a using directive or an assembly reference?) ProjectName C:\Users\...\Program.cs 47 Active 

我知道錯誤是我想要設置的JSON發送到API,這是一個包含值(哈希表的鍵值符號)辭書散列表的方式。我很確定這是愚蠢的,但我真的不知道如何設置這個JSON的API,我沒有選擇,我需要使用C#。你能幫我請給我一些關於如何解決這個問題的建議,或以另一種方式完成這項工作嗎?提前致謝。

+3

一種常見的方法是創建對象(用戶,建立,等等),然後用Json.Net序列化你的對象。 http://www.newtonsoft.com/json –

回答

0

您可以創建一個類,作爲使用API​​的參數。

//you classes 
public class Parameter 
{ 
    public User user { get; set;} 
    public Establishment {get; set;} 
} 
public class User 
{ 
    public string email {get; set;} 
    public string password {get; set} 
} 

public class Establishment 
{ 
    public int id {get;set;} 
} 

//你的API調用方法:

`var p = new Parameter 
     { 
      Establishment = new Establishment 
      { 
       id = 123 
      }, 
      User = new User 
      { 
       email = "email", 
       password = "password" 
      } 
     }; 

HttpResponseMessage response = await client.PostAsJsonAsync("apiname/service", p);

+0

謝謝@Jeric Cruz的回覆,雖然我對你的建議並不幸運,但是得到了這個錯誤:「異常詳細信息:System.Net.Http.HttpRequestException:響應狀態碼不表示成功:ProjectName.Program中的System.Net.Http.HttpResponseMessage.EnsureSuccessStatusCode()中的<內部服務器錯誤> d:在C:\ RouteToProject.cs中的MoveNext()。但是,當我通過Postman向API發送請求時,它可以正常工作,所以API沒有問題。我真的很感謝您提供更多的幫助。謝謝。 –

+0

嘗試使用PostAsync並添加格式化程序MediaTypeFormatter formatter = new MyCustomFormatter(); –

+0

var response = await client.PostAsync(「apiname/service」,p,formatter); –

0

使用C#匿名類

var payload = new{ 
    User=new { 
     email= "[email protected]", 
     password= "something" 
    }, 
    Establishment=new { 
     id= 147 
    } 
} 

然後用newtonsoft json.net

var json = JsonConvert.SerializeObject(payload); 
+0

謝謝@ pm100您的迴應,但我嘗試了您的建議,並得到此錯誤:「異常詳細信息:System.Net.Http.HttpRequestException:響應狀態代碼不表示成功:500 <內部服務器錯誤>」。但是,當我通過Postman向API發送請求時,它可以正常工作,所以API沒有問題。你以前見過這個嗎?謝謝。 –

+0

這意味着請求上的服務器禁止訪問。如果「同樣的」請求與郵遞員一致,那麼從上面的c#代碼拷貝中就有一個輸入錯誤。看看JSON並將其與郵差有效載荷 – pm100