Wenn ich diesen Code habe
$.ajax({
type: 'POST',
//contentType: "application/json",
url: 'http://localhost:16329/Hello',
data: { name: 'norm' },
dataType: 'json'
});
in Fiddler kann ich folgende rohe Anfrage sehen
POST http://localhost:16329/Hello HTTP/1.1
Host: localhost:16329
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:10.0.2) Gecko/20100101 Firefox/10.0.2
Accept: application/json, text/javascript, */*; q=0.01
Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Referer: http://localhost:14693/WebSite1/index.html
Content-Length: 9
Origin: http://localhost:14693
Pragma: no-cache
Cache-Control: no-cache
name=norm
Ich versuche jedoch, den Inhaltstyp von application / x-www-form-urlencoded auf application / json festzulegen . Aber dieser Code
$.ajax({
type: "POST",
contentType: "application/json",
url: 'http://localhost:16329/Hello',
data: { name: 'norm' },
dataType: "json"
});
Erzeugt eine seltsame Anfrage (die ich in Fiddler sehen kann)
OPTIONS http://localhost:16329/Hello HTTP/1.1
Host: localhost:16329
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:10.0.2) Gecko/20100101 Firefox/10.0.2
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
Origin: http://localhost:14693
Access-Control-Request-Method: POST
Access-Control-Request-Headers: content-type
Pragma: no-cache
Cache-Control: no-cache
Warum ist das so? Was ist OPTIONEN, wenn es dort POST sein soll? Und wo ist mein Inhaltstyp auf application / json eingestellt? Und Anforderungsparameter sind aus irgendeinem Grund weg.
UPDATE 1
Auf der Serverseite habe ich einen wirklich einfachen RESTful-Service.
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class RestfulService : IRestfulService
{
[WebInvoke(
Method = "POST",
UriTemplate = "Hello",
ResponseFormat = WebMessageFormat.Json)]
public string HelloWorld(string name)
{
return "hello, " + name;
}
}
Aber aus irgendeinem Grund kann ich diese Methode nicht mit Parametern aufrufen.
UPDATE 2
Entschuldigung, dass Sie nicht so lange geantwortet haben.
Ich habe diese Header zu meiner Serverantwort hinzugefügt
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: Content-Type
Access-Control-Allow-Methods: POST, GET, OPTIONS
Es hat nicht geholfen, ich habe Methode Fehler vom Server nicht erlaubt .
Hier ist, was mein Geiger sagt
Jetzt kann ich sicher sein, dass mein Server POST, GET, OPTIONS akzeptiert (wenn die Antwortheader wie erwartet funktionieren). Aber warum "Methode nicht erlaubt"?
In WebView sieht die Antwort vom Server (siehe Raw- Antwort auf dem Bild oben) folgendermaßen aus
quelle
Antworten:
Es scheint, dass das Entfernen
http://
aus der URL-Option sicherstellt, dass der richtige HTTP-POST-Header gesendet wird.Ich glaube nicht, dass Sie den Namen des Hosts vollständig qualifizieren müssen. Verwenden Sie einfach eine relative URL wie unten.
Ein Beispiel von mir, das funktioniert:
Möglicherweise verwandt: jQuery $ .ajax (), $ .post sendet "OPTIONS" als REQUEST_METHOD in Firefox
Bearbeiten: Nach einigen weiteren Recherchen habe ich herausgefunden, dass der OPTIONS-Header verwendet wird, um herauszufinden, ob die Anforderung von der Ursprungsdomäne zulässig ist. Mit Fiddler habe ich den Antwortheadern von meinem Server Folgendes hinzugefügt.
Sobald der Browser diese Antwort erhalten hat, hat er die richtige POST-Anfrage mit JSON-Daten gesendet. Es scheint, dass der standardmäßige formularkodierte Inhaltstyp als sicher angesehen wird und daher keinen zusätzlichen domänenübergreifenden Überprüfungen unterzogen wird.
Es sieht so aus, als müssten Sie die zuvor genannten Header zu Ihrer Serverantwort auf die OPTIONS-Anforderung hinzufügen. Sie sollten sie natürlich so konfigurieren, dass Anforderungen von bestimmten Domänen und nicht von allen zugelassen werden.
Ich habe die folgende jQuery verwendet, um dies zu testen.
Verweise:
quelle
Ich kann Ihnen zeigen, wie ich es benutzt habe
quelle
Alles, was Sie tun müssen, damit dies funktioniert, ist hinzuzufügen:
als Feld für Ihre Post-Anfrage und es wird funktionieren.
quelle
type: "POST"
, sendet esOPTIONS
.Ich habe diese Bildschirme erkannt, verwende CodeFluentEntities und habe eine Lösung, die auch für mich funktioniert.
Ich benutze diese Konstruktion:
wie Sie sehen können, wenn ich benutze
oder
Alles funktioniert gut.
Ich bin mir nicht 100% sicher, ob es alles ist, was Sie brauchen, weil ich auch die Header geändert habe.
quelle
Wenn Sie dies verwenden:
AJAX sendet keine GET- oder POST-Parameter an den Server. Ich weiß nicht warum.
Ich habe heute Stunden gebraucht, um es zu lernen.
Benutz einfach:
quelle
Ich habe hier die Lösung für dieses Problem gefunden . Vergessen Sie nicht, VerbOPTIONEN im IIS App Service Handler zuzulassen.
Funktioniert gut. Vielen Dank, André Pedroso. :-)
quelle
Ich hatte das gleiche Problem. Ich führe eine Java Rest App auf einem JBoss Server aus. Aber ich denke, die Lösung ist auf einer ASP .NET-Webanwendung ähnlich.
Firefox ruft vorab Ihre Server- / Ruhe-URL auf, um zu überprüfen, welche Optionen zulässig sind. Dies ist die "OPTIONS" -Anforderung, auf die Ihr Server nicht entsprechend antwortet. Wenn dieser OPTIONS-Aufruf korrekt beantwortet wird, wird ein zweiter Aufruf ausgeführt, bei dem es sich um die eigentliche "POST" -Anforderung mit JSON-Inhalt handelt.
Dies geschieht nur, wenn ein domänenübergreifender Anruf ausgeführt wird. In Ihrem Fall rufen Sie '
http://localhost:16329/Hello
' auf, anstatt einen URL-Pfad unter derselben Domain '/ Hello' aufzurufen.Wenn Sie einen domänenübergreifenden Anruf tätigen möchten, müssen Sie Ihre Rest-Service-Klasse mit einer kommentierten Methode erweitern, die eine http-Anforderung "OPTIONS" unterstützt. Dies ist die entsprechende Java-Implementierung:
Ich denke, in .NET müssen Sie eine zusätzliche Methode hinzufügen, die mit Anmerkungen versehen ist
Dabei werden die folgenden Überschriften gesetzt
quelle
Ich habe die Lösung erhalten, die JSON-Daten per POST-Anfrage über jquery ajax zu senden. Ich habe unten Code verwendet
Ich habe
'Content-Type': 'text/plain'
im Header verwendet, um die rohen JSON-Daten zu senden.Denn wenn wir
Content-Type: 'application/json'
die in OPTION konvertierten Anforderungsmethoden verwenden, wird die VerwendungContent-Type: 'test/plain'
der Methode jedoch nicht konvertiert und bleibt als POST erhalten. Hoffentlich hilft das jemandem.quelle
Hallo, diese beiden Zeilen haben bei mir funktioniert.
Danke, Prashant
quelle