400(неверный запрос) при публикации объекта Json
Я делаю почтовый запрос для электронной почты службы wcf - это мой объект, имеющий атрибуты subject и body. Когда я пытаюсь сделать ajax-вызов, я получаю ошибку 400 Bad Request, это мой код ниже. Я не знаю, как поместить объект в функцию stringify.
{
"email": {
"subject": "b",
"body": "d"
}
}
$('#Button1').click(function() {
var email = {
subject: $("#Text1").val(),
body: $("#Text1").val(),
}
$.ajax({
url:"http://localhost:29143/Restwebservice.svc/sendmail",
type: 'post',
cache: false,
contentType: "application/json; charset=utf-8",
dataType: 'json',
//data: JSON.stringify(email)
data: JSON.stringify(email),
success: function (data) {
$('#target').html(data.msg);
}
});
2 ответа
Вы не показали нам sendmail
метод, однако я предполагаю, что из структуры данных вызова ajax это должно выглядеть так:
[DataContract]
public class EmailEntity
{
[DataMember]
public string subject { get; set; }
[DataMember]
public string body { get; set; }
}
Теперь sendmail
метод будет выглядеть так
[WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json,
ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.WrappedRequest)]
public void sendmail(EmailEntity emailentity)
{
............
}
Обратите внимание, что тип запроса переносится, поэтому при публикации данных из ajax в идеале вы должны создать emailentity
сначала объект, который будет работать как объект-оболочка.
var emailentity = {};
emailentity.subject = "Test subject";
emailentity.body = "Test body";
var jsonObj = JSON.stringify(emailentity);
var dataToSend = '{"emailentity":'+jsonObj+'}';
этот dataToSend
будет опубликован сейчас через ajax.
$.ajax({
type: "POST",
async: false,
data: dataToSend,
url: "../path/myService.svc/sendmail",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function () {
alert("success");
},
error: function () {
alert("Error");
}
});
Надеюсь это поможет.
Плохой запрос возникает, когда json является недопустимым, здесь эта ошибка связана с тем, что у вас там есть объект под названием "электронная почта", а затем при нажатии кнопки 1 вы определяете новую переменную с именем "электронная почта". Здесь вместо того, чтобы ссылаться на предыдущий объект электронной почты, вы создаете новую переменную и пытаетесь присвоить значения ее членам, когда нет члена для "var email". попробуйте сделать что-то вроде этого
Object email = new Object();
email.subject =$("#Text1").val();
email.body = $("#Text1").val();
А теперь зафиксируйте этот объект 'email', но убедитесь, что на стороне сервера вы получаете тот же объект, что и электронная почта, потому что, если отправка и получение объектов не совпадают, это вызывает неверный запрос.