I have a new method in web api
[HttpPost] public ApiResponse PushMessage( [FromUri] string x, [FromUri] string y, [FromBody] Request Request)
where request class is like
public class Request
{
public string Message { get; set; }
public bool TestingMode { get; set; }
}
I’m making a query to localhost/Pusher/PushMessage?x=foo&y=bar with PostBody:
{ Message: "foobar" , TestingMode:true }
Am i missing something?
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
A post body is typically a URI string like this:
Message=foobar&TestingMode=true
You have to make sure that the HTTP header contains
Content-Type: application/x-www-form-urlencoded
EDIT: Because it’s still not working, I created a full example myself.
It prints the correct data.
I also used .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));
}
}
Method 2
The Web API uses naming regulations. The method for a post should be started with Post.
You should rename your PushMessage to method name PostMessage.
Also the web api defaulty listens (depending on your route) to ‘api/values/Message’ and not to Pusher/Pushmessage.
[HttpPost] attribute is not required
Method 3
You may use following code to post json in request body:
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;
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0