web-dev-qa-db-fra.com

Lire FromUri et FromBody en même temps

J'ai une nouvelle méthode en web api 

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

où la classe de demande est comme 

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

Je fais une requête à localhost/Pusher/PushMessage? X = toto & y = bar avec PostBody:

{ Message: "foobar" , TestingMode:true }

Est-ce que je manque quelque chose? 

24
kkocabiyik

Un corps de message est typiquement une chaîne d'URI comme ceci:

Message=foobar&TestingMode=true

Vous devez vous assurer que l'en-tête HTTP contient

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

EDIT: Comme cela ne fonctionne toujours pas, j'ai créé moi-même un exemple complet.
Il imprime les données correctes.
J'ai également utilisé .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));
    }
}
30
Johannes Egger

L'API Web utilise des règles de nommage. La méthode pour un post doit être démarrée avec Post.

Vous devez renommer votre PushMessage en nom de méthode PostMessage.

De plus, l’API Web écoute par défaut (selon votre itinéraire) «API/values ​​/ Message» et non Pusher/Pushmessage.

L'attribut [HttpPost] n'est pas requis

1
Gertjan

Vous pouvez utiliser le code suivant pour publier JSON dans le corps de la demande:

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;
0
napp