c# - mvc - Lectura FromUri y FromBody al mismo tiempo
frombody c# (3)
Tengo un nuevo método en la API web
[HttpPost]
public ApiResponse PushMessage( [FromUri] string x, [FromUri] string y, [FromBody] Request Request)
donde la clase de solicitud es como
public class Request
{
public string Message { get; set; }
public bool TestingMode { get; set; }
}
Estoy haciendo una consulta a localhost / Pusher / PushMessage? X = foo & y = bar con PostBody:
{ Message: "foobar" , TestingMode:true }
¿Me estoy perdiendo de algo?
La API web usa reglas de nombres. El método para una publicación debe iniciarse con Post.
Debe cambiar el nombre de su PushMessage al nombre de método PostMessage.
Además, la API web escucha de manera predeterminada (según su ruta) a ''api / values / Message'' y no a Pusher / Pushmessage.
El atributo [HttpPost] no es obligatorio
Puede usar el siguiente código para publicar json en el cuerpo de la solicitud:
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;
Un cuerpo de publicación suele ser una cadena de URI como esta:
Message=foobar&TestingMode=true
Debe asegurarse de que el encabezado HTTP contenga
Content-Type: application/x-www-form-urlencoded
EDITAR : Debido a que todavía no está funcionando, yo mismo creé un ejemplo completo.
Imprime los datos correctos.
También utilicé .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));
}
}