Когда у меня есть этот код
$.ajax({
type: 'POST',
//contentType: "application/json",
url: 'http://localhost:16329/Hello',
data: { name: 'norm' },
dataType: 'json'
});
в Fiddler я вижу следующий необработанный запрос
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
Но я пытаюсь установить тип содержимого из application / x-www-form-urlencoded в application / json . Но этот код
$.ajax({
type: "POST",
contentType: "application/json",
url: 'http://localhost:16329/Hello',
data: { name: 'norm' },
dataType: "json"
});
Создает странный запрос (который я вижу в Fiddler)
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
Это почему? Что такое OPTIONS, когда он должен быть там POST? И где мой тип контента установлен на application / json? И параметры запроса ушли почему-то.
ОБНОВЛЕНИЕ 1
На стороне сервера у меня действительно простой сервис RESTful.
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class RestfulService : IRestfulService
{
[WebInvoke(
Method = "POST",
UriTemplate = "Hello",
ResponseFormat = WebMessageFormat.Json)]
public string HelloWorld(string name)
{
return "hello, " + name;
}
}
Но почему-то не могу вызвать этот метод с параметрами.
ОБНОВЛЕНИЕ 2
Извините, что не ответил так долго.
Я добавил эти заголовки в свой ответ сервера
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: Content-Type
Access-Control-Allow-Methods: POST, GET, OPTIONS
Это не помогло, у меня метод не разрешает ошибку с сервера.
Вот что говорит мой скрипач
Итак, теперь я могу быть уверен, что мой сервер принимает POST, GET, OPTIONS (если заголовки ответов работают так, как я ожидал). Но почему «Метод не разрешен»?
В ответе WebView от сервера (вы можете увидеть ответ Raw на картинке выше) выглядит так
источник
Ответы:
Казалось бы, удаление
http://
из опции url гарантирует отправку правильного заголовка HTTP POST.Я не думаю, что вам нужно полностью указывать имя хоста, просто используйте относительный URL-адрес, как показано ниже.
Пример моего, который работает:
Возможно, связано: jQuery $ .ajax (), $ .post отправка "OPTIONS" как REQUEST_METHOD в Firefox
Изменить: после некоторых дополнительных исследований я обнаружил, что заголовок OPTIONS используется, чтобы узнать, разрешен ли запрос из исходного домена. Используя fiddler, я добавил следующее в заголовки ответов с моего сервера.
Как только браузер получил этот ответ, он отправил правильный запрос POST с данными json. Казалось бы, тип содержимого по умолчанию с URL-адресом считается безопасным и поэтому не подвергается дополнительным междоменным проверкам.
Похоже, вам нужно будет добавить ранее упомянутые заголовки в ответ вашего сервера на запрос OPTIONS. Вы, конечно же, должны настроить их так, чтобы разрешать запросы от определенных доменов, а не от всех.
Я использовал следующий jQuery, чтобы проверить это.
Ссылки:
источник
Я могу показать вам, как я это использовал
источник
Итак, все, что вам нужно сделать, чтобы это сработало, - это добавить:
в качестве поля для вашего почтового запроса, и он будет работать.
источник
type: "POST"
, это отправкаOPTIONS
.Я узнал эти экраны, я использую CodeFluentEntities, и у меня есть решение, которое мне тоже подходит.
Я использую эту конструкцию:
как видите, если я использую
или
Все нормально работает.
Я не уверен на 100%, что это все, что вам нужно, потому что я также изменил заголовки.
источник
Если вы используете это:
AJAX не отправляет на сервер параметры GET или POST .... не знаю почему.
Сегодня мне потребовались часы, чтобы выучить это.
Просто используйте:
источник
Я нашел решение этой проблемы здесь . Не забудьте разрешить глагол OPTIONS в обработчике службы приложений IIS.
Работает отлично. Спасибо, Андре Педросо. :-)
источник
Я была такая же проблема. Я запускаю приложение java rest на сервере jboss. Но я думаю, что решение похоже на веб-приложение ASP .NET.
Firefox выполняет предварительный вызов вашего сервера / URL-адреса отдыха, чтобы проверить, какие параметры разрешены. Это запрос "OPTIONS", на который ваш сервер не отвечает соответствующим образом. Если на этот вызов OPTIONS дан правильный ответ, выполняется второй вызов, который является фактическим запросом POST с содержимым json.
Это происходит только при выполнении междоменного вызова. В вашем случае вызов '
http://localhost:16329/Hello
' вместо вызова URL-адреса в том же домене '/ Hello'Если вы намереваетесь выполнить междоменный вызов, вам необходимо улучшить свой класс обслуживания отдыха с помощью аннотированного метода, который поддерживает HTTP-запрос «OPTIONS». Это соответствующая реализация java:
Итак, я предполагаю, что в .NET вам нужно добавить дополнительный метод, аннотированный
где установлены следующие заголовки
источник
У меня есть решение для отправки данных JSON по запросу POST через jquery ajax. Я использовал код ниже
Я использовал
'Content-Type': 'text/plain'
в заголовке для отправки необработанных данных json.Потому что, если мы используем
Content-Type: 'application/json'
методы запроса, преобразованные в OPTION, но использованиеContent-Type: 'test/plain'
метода не преобразуется и остается как POST. Надеюсь, это кому-нибудь поможет.источник
Привет, эти две строчки у меня сработали.
Спасибо, Прашант
источник