2016-05-28 77 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