ejemplos - jquery consume rest service example
Jquery Ajax Publicar json para webservice (6)
Estoy tratando de publicar un objeto JSON en un servicio web de asp.net.
Mi hijo se ve así:
var markers = { "markers": [
{ "position": "128.3657142857143", "markerPosition": "7" },
{ "position": "235.1944023323615", "markerPosition": "19" },
{ "position": "42.5978231292517", "markerPosition": "-3" }
]};
Estoy usando el json2.js para encadenar mi objeto json.
y estoy usando jquery para publicarlo en mi servicio web.
$.ajax({
type: "POST",
url: "/webservices/PodcastService.asmx/CreateMarkers",
data: markers,
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function(data){alert(data);},
failure: function(errMsg) {
alert(errMsg);
}
});
Estoy teniendo el siguiente error:
"Primitiva JSON inválida:
He encontrado un montón de publicaciones relacionadas con esto y parece ser un problema muy común, pero nada intento solucionar el problema.
Cuando firebug lo que se publica en el servidor se parece a esto:
markers% 5B0% 5D% 5Bposition% 5D = 128.3657142857143 & markers% 5B0% 5D% 5BmarkerPosition% 5D = 7 & markers% 5B1% 5D% 5Bposition% 5publicidadPPPPP.P.P.P. 5D = 42.5978231292517 y marcadores% 5B2% 5D% 5BmarkerPosition% 5D = -3
Mi función de servicio web que está siendo llamada es:
[WebMethod]
public string CreateMarkers(string markerArray)
{
return "received markers";
}
-
markers
no es un objeto JSON. Es un objeto normal de JavaScript. - api.jquery.com/jQuery.ajax :
Datos a enviar al servidor. Se convierte en una cadena de consulta , si no es ya una cadena.
Si desea enviar los datos como JSON, primero debe codificarlos:
data: {markers: JSON.stringify(markers)}
jQuery no convierte objetos o arrays a JSON automáticamente.
Pero asumo que el mensaje de error viene de interpretar la respuesta del servicio. El texto que devuelves no es JSON. Las cadenas JSON tienen que estar entre comillas dobles. Así que tendrías que hacer:
return "/"received markers/"";
No estoy seguro de si su problema real es enviar o recibir los datos.
Me he encontrado con este también y esta es mi solución.
Si se encuentra con una excepción de objeto json no válida al analizar datos, aunque sepa que su cadena json es correcta, establezca una cadena de los datos que recibió en su código ajax antes de analizarlos en JSON:
$.post(CONTEXT+"servlet/capture",{
yesTransactionId : yesTransactionId,
productOfferId : productOfferId
},
function(data){
try{
var trimData = $.trim(JSON.stringify(data));
var obj = $.parseJSON(trimData);
if(obj.success == ''true''){
//some codes ...
Mencionó el uso de json2.js para alinear sus datos, pero los datos POSTed parecen ser JSON codificados con URLE Es posible que ya los haya visto, pero esta publicación sobre la primitiva JSON no válida explica por qué JSON está codificada como URLE.
Aconsejaría no pasar una cadena JSON en serie sin procesar manualmente a su método . ASP.NET automáticamente deserializará JSON los datos POST de la solicitud, por lo que si está serializando manualmente y enviando una cadena JSON a ASP.NET, en realidad tendrá que JSON serializar su cadena serializada JSON.
Sugeriría algo más en este sentido:
var markers = [{ "position": "128.3657142857143", "markerPosition": "7" },
{ "position": "235.1944023323615", "markerPosition": "19" },
{ "position": "42.5978231292517", "markerPosition": "-3" }];
$.ajax({
type: "POST",
url: "/webservices/PodcastService.asmx/CreateMarkers",
// The key needs to match your method''s input parameter (case-sensitive).
data: JSON.stringify({ Markers: markers }),
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function(data){alert(data);},
failure: function(errMsg) {
alert(errMsg);
}
});
La clave para evitar el problema de la primitiva JSON no válida es pasar a jQuery una cadena JSON para el parámetro de data
, no un objeto de JavaScript, de modo que jQuery no intente URLEcodificar sus datos.
En el lado del servidor, haga coincidir los parámetros de entrada de su método con la forma de los datos que está pasando:
public class Marker
{
public decimal position { get; set; }
public int markerPosition { get; set; }
}
[WebMethod]
public string CreateMarkers(List<Marker> Markers)
{
return "Received " + Markers.Count + " markers.";
}
También puede aceptar una matriz, como Marker[] Markers
, si lo prefiere. El deserializador que utiliza ASMX ScriptServices (JavaScriptSerializer) es bastante flexible y hará todo lo posible para convertir sus datos de entrada en el tipo de servidor que especifique.
Por favor, siga esto para hacer una llamada ajax al servicio web de java var param = {feildName: feildValue}; JSON.stringify ({data: param})
$.ajax({
dataType : ''json'',
type : ''POST'',
contentType : ''application/json'',
url : ''<%=request.getContextPath()%>/rest/priceGroups'',
data : JSON.stringify({data : param}),
success : function(res) {
if(res.success == true){
$(''#alertMessage'').html(''Successfully price group created.'').addClass(''alert alert-success fade in'');
$(''#alertMessage'').removeClass(''alert-danger alert-info'');
initPriceGroupsList();
priceGroupId = 0;
resetForm();
}else{
$(''#alertMessage'').html(res.message).addClass(''alert alert-danger fade in'');
}
$(''#alertMessage'').alert();
window.setTimeout(function() {
$(''#alertMessage'').removeClass(''in'');
document.getElementById(''message'').style.display = ''none'';
}, 5000);
}
});
Probé la solución de Dave Ward. La parte de datos no se estaba enviando desde el navegador en la parte de carga útil de la solicitud posterior, ya que el tipo de contenido está configurado en "application/json"
. Una vez que quité esta línea todo funcionó muy bien.
var markers = [{ "position": "128.3657142857143", "markerPosition": "7" },
{ "position": "235.1944023323615", "markerPosition": "19" },
{ "position": "42.5978231292517", "markerPosition": "-3" }];
$.ajax({
type: "POST",
url: "/webservices/PodcastService.asmx/CreateMarkers",
// The key needs to match your method''s input parameter (case-sensitive).
data: JSON.stringify({ Markers: markers }),
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function(data){alert(data);},
failure: function(errMsg) {
alert(errMsg);
}
});
Tengo consulta,
$("#login-button").click(function(e){ alert("hiii");
var username = $("#username-field").val();
var password = $("#username-field").val();
alert(username);
alert("password" + password);
var markers = { "userName" : "admin","password" : "admin123"};
$.ajax({
type: "POST",
url: url,
// The key needs to match your method''s input parameter (case-sensitive).
data: JSON.stringify(markers),
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function(data){alert("got the data"+data);},
failure: function(errMsg) {
alert(errMsg);
}
});
});
Estoy publicando los detalles de inicio de sesión en json y obteniendo una cadena como "Success"
, pero no obtengo la respuesta.