2012-08-22 53 views
24

我在網上API有新的方法閱讀FromUri和FromBody同時

[HttpPost] 
public ApiResponse PushMessage([FromUri] string x, [FromUri] string y, [FromBody] Request Request) 

,其中請求類是像

public class Request 
{ 
    public string Message { get; set; } 
    public bool TestingMode { get; set; } 
} 

我正在做一個查詢到localhost /子彈頭/ PushMessage X = foo的& Y =酒吧PostBody:

{ Message: "foobar" , TestingMode:true } 

我這麼想嗎?

回答

26

賽後的身體通常是一個URI字符串是這樣的:

Message=foobar&TestingMode=true 

你必須確保在HTTP報頭包含

Content-Type: application/x-www-form-urlencoded 

編輯:因爲它仍然沒有工作,我自己創造了一個完整的例子
它打印正確的數據。
我也使用.NET 4.5 RC。

// server-side 
public class ValuesController : ApiController { 
    [HttpPost] 
    public string PushMessage([FromUri] string x, [FromUri] string y, [FromBody] Person p) { 
     return p.ToString(); 
    } 
} 

public class Person { 
    public string Name { get; set; } 
    public int Age { get; set; } 

    public override string ToString() { 
     return this.Name + ": " + this.Age; 
    } 
} 

// client-side 
public class Program { 
    private static readonly string URL = "http://localhost:6299/api/values/PushMessage?x=asd&y=qwe"; 

    public static void Main(string[] args) { 
     NameValueCollection data = new NameValueCollection(); 
     data.Add("Name", "Johannes"); 
     data.Add("Age", "24"); 

     WebClient client = new WebClient(); 
     client.UploadValuesCompleted += UploadValuesCompleted; 
     client.Headers["Content-Type"] = "application/x-www-form-urlencoded"; 
     Task t = client.UploadValuesTaskAsync(new Uri(URL), "POST", data); 
     t.Wait(); 
    } 

    private static void UploadValuesCompleted(object sender, UploadValuesCompletedEventArgs e) { 
     Console.WriteLine(Encoding.ASCII.GetString(e.Result)); 
    } 
} 
+1

只有如果我使用MVC結構這是真的。然而,這是web api,因此綁定與mvc不同。但是,謝謝你的回覆! – kkocabiyik

+0

確保HTTP頭包含「Content-Type:application/x-www-form-urlencoded」。 –

+0

您無法像純文本一樣發佈到web api mvc:S – kkocabiyik

0

您可以使用下面的代碼張貼在JSON請求體:

var httpClient = new HttpClient(); 
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 

Request request = new Request(); 
HttpResponseMessage response = httpClient.PostAsJsonAsync("http://localhost/Pusher/PushMessage?x=foo&y=bar", request).Result; 

//check if (response.IsSuccessStatusCode) 
var createResult = response.Content.ReadAsAsync<YourResultObject>().Result; 
1

在Web API使用的命名規則。帖子的方法應該以Post開始。

您應該將您的PushMessage重命名爲方法名稱PostMessage。

另外web api defaulty監聽(取決於你的路線)'api/values/Message',而不是Pusher/Pushmessage。

[HttpPost]屬性不是必需

+0

帖子的方法應以Post開頭。 :不需要 –

+0

這個答案是錯誤的。只有當沒有[HttpPost]屬性時,該方法才需要名字'Post'。 – ehsan88