Pass komplexe parameter zu Web-API-service via javascript
Mache ich eine ASP.NET Web-API web-service, und ein HTML/javascript-Seite, um es zu testen. Das Problem das ich habe ist mit der übergabe eines komplexen Daten-parameter und es kommen richtig durch in den web-API-controller.
Ich weiß, es gibt zahlreiche ähnliche Fragen, und ich habe Sie gelesen und habe versucht, die Lösungen und noch nicht gelöst. Ich habe auch gelesen das einige JQuery-Dokumentation.
Hier mein controller:
public class TitleEstimateController : ApiController
{
public IHttpActionResult GetTitleEstimate([FromUri] EstimateQuery query)
{
//All the values in "query" are null or zero
//Do some stuff with query if there were anything to do
}
}
public class EstimateQuery
{
//Various fields
}
Der route-mapping in der WebApiConfig.cs:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{query}"
);
Und die javascript:
var uri = 'api/titleEstimate/';
var query = {
"username": $("#user").val(),
//other fields
};
$.getJSON(uri,query)
.done(function (data) {
$('#product').text("OK");
})
.fail(function (jqXHR, textStatus, err) {
$('#product').text('Error: ' + err);
});
Derzeit bin ich ein 404. Ich habe versucht $.getJSON(uri + '/' + query)
aber das hat nicht funktioniert entweder. Vorher war ich der Weitergabe dieser Objekt-ich war der Aufruf erfolgreich, so dass ich denke, das routing ist in der Regel OK. Ich habe versucht, eine Art Konverter, aber das hat nicht geholfen, immer noch einen 404. Erkennt jemand, was ich bin fehlt/falsch?
- Gibt es eine Ausnahme, die auf der server-Seite? Haben Sie überprüft, das "Ausgabe-Fenster"?
- Nichts in der debug-Ausgabe.
- Du machst das alles Prima, außer für die
uri
. Siehe die Antwort unten für details.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Antwort
Verwenden Sie die falschen
uri
. Sie müssenapi/titleEstimate/getTitleEstimate
. Das erklärt und aufgelöst wird, Ihre 404.Antwort auf folgefrage
Alles, was Sie tun fast funktioniert. Nach beheben der 404, werden Sie feststellen, dass Sie nicht erhalten den Wert
FromUri
, und Sie werden eine follow-up-Frage. So müssen Sie Ihre route ändern config so:Dann werden Sie nicht nur um Ihrer 404 erhalten aber auch die
FromUri
Wert, den Sie senden als query-string-Parameter.Demo
Hier ist ein Turnschuh für Beweise, die Berufung in dieser controller, die gehostet wird LIVE hier. Das einzige, was ich geändert habe in der funktionierenden version werden die
uri
zu beheben, die 404 und die route config, um sicherzustellen, erhalten Sie dasFromUri
Wert. Das ist alles.HTML
JavaScript
Dies auch gelingen wird.
Hinweis:, wir benötigen nur
domain
weil wir tun, cross-site-scripting-hier für demo-Zwecke.Dies wird 404.
Controller
Lesen Sie mehr details über WebApi-routing hier. Von es zu Lesen, können Sie wahrscheinlich kommen mit einer alternativen Lösung innerhalb Ihrer route config. Es gibt auch viele tolle Beispiele in diesem blog-post.
uri
, und wenn ich aktualisiert, die Geige, die ich vergaß zu setzen, die neue version als Basis. Das heißt, ich war mit/api/values/GetTitleEstimate
statt/api/titleEstimate/GetTitleEstimate
. Die verlinkte Geige funktioniert jetzt, da habe ich die neueste version als Basis.$('#product').text(data);
aber es ist nichts zu tun. Ich kann log oder alert mit dem Wert und es ist in Ordnung, aber der text () - Aufruf funktioniert nicht. Ich versucht, indem Sie in einem string-literal mit dem Wert, verschieben es an den Anfang der Funktion, indem es im Dokument.ready () keine Wirkung. Ich bin sicher, es ist etwas doof, aber wenn du keine Ahnung hast, was das könnte, wäre ich froh, es zu hören. Die div ist dies:<div id="product">Information goes here</div>
div
und anderenid
. Auch, erstellen Sie ein Turnschuh, dass Wiederholungen der Fehler ist; auf diese Weise können Sie genau den code, der produziert die Fehler.Zuerst würde ich versuchen, verwenden Sie die Attribut-routing-Funktion des web.api wie diese:
Wäre es auch hilfreich zu sehen, die Anfrage in Ihrem dev-tools. Ich bin nicht einverstanden mit Colin, dass Sie sollten machen dies zu einem POST, da HTTP-POST verwendet werden soll, um neue Elemente zu erstellen. Sie versuchen, Informationen zu bekommen, so dass HTTP-GET-macht Sinn.
Denke ich, Web.Api übernimmt Methoden sind Bekommt standardmäßig, aber declarating es mit dem HttpGet-Attribut wird sich sicher darum kümmern.
GET http://localhost:47503/api/titleEstimate/?username=whatever…&StreetSuffix=Street&County=Boulder&IsPrimary=on&State=CO&Unit=&Zip=80303 404 (Not Found)
ich bin bereit, verwenden Sie den POST wenn es das ist, was es braucht, aber ich Stimme zu, BEKOMMEN mehr Sinn macht, hier und es scheint, wie es funktionieren sollte.HttpGet
. Es ist nicht notwendig.Für komplexe Objekte, die ich in der Regel senden Sie Sie in den Textkörper der Meldung anstatt der URL.
Hätten Sie etwas dagegen, wenn ein ähnlicher Ansatz wie die Antwort auf diese Frage?
Wie gehen json POST-data-Web-API-Methode als Objekt
Wie es scheint, die einfacher/natürlicher Ansatz.
Etwas wie (ungetestet, aber sollte in der Nähe sein):