POSTing un DateTime de Android a un servicio WCF RESTful JSON

Estoy tratando de enviar un DateTime como un parámetro a un método expuesto a través de un servicio WCF RESTful con la codificación JSON. La solicitud se ve así:

 POST http://IP:PORT/LogService/json/GetLogEntriesByModule HTTP/1.1 Content-Length: 100 Content-Type: application/json Host: IP:PORT Connection: Keep-Alive User-Agent: Apache-HttpClient/UNAVAILABLE (java 1.4) Expect: 100-Continue {"maxentries":10,"upperdate":"1280703601462","lowerdate":"1277938801462","module":"Windows Service"} 

He probado varios formatos para el DateTime :

  • 2010-07-01T10:54:00 (que se envía por la aplicación WCFTestClient sobre NET.TCP y obtiene resultados
  • \/Date(12345678+0100)\/
  • 01.07.2010 10:54:00

La definición del método:

 LogEntry[] GetLogEntriesByModule( string module, DateTime lowerDate, DateTime upperDate, int maxEntries, out bool maxEntriesReached ) 

Siempre obtengo la siguiente respuesta:

 HTTP/1.1 200 OK Content-Length: 60 Content-Type: application/json; charset=utf-8 Server: Microsoft-HTTPAPI/2.0 Date: Fri, 02 Jul 2010 09:07:04 GMT {"GetLogEntriesByModuleResult":[],"maxEntriesReached":false} 

Parece que el DateTime no se analiza correctamente, porque hay varias entradas en el Llog para ese momento.

¿Alguien sabe sobre cómo hacer esto?

Actualización : El problema estaba en el lado del servidor y se ha resuelto.

    El formato correcto para publicar las fechas en el servicio WCF es: /Date(53244000000)/ donde el número entre paréntesis es el número de milisegundos desde 1970 UTC Midnight.

     Date dt = new Date(); long date = Date.UTC(dt.getYear(), dt.getMonth(), dt.getDay(), dt.getHours(),dt.getMinutes(), dt.getSeconds()); String senddate = "/date("+date+")/"; 

    Y luego usarlo como a continuación

     inputparam.put("DateTime", datetime); 

    Por si esto ayuda a alguien:

    Según Microsoft, WCF utiliza un QueryStringConverter para hacer el análisis de url. Así, utilizando este código (ligera modificación del ejemplo msdn):

     QueryStringConverter converter = new QueryStringConverter(); if (converter.CanConvert(typeof(DateTime))) { string strValue = converter.ConvertValueToString(DateTime.UtcNow, typeof(DateTime)); Console.WriteLine("the value = {0}", strValue); } 

    Obtenemos el formato adecuado para los parámetros REST de DateTime: 2010-01-01T01: 01: 01Z

    Leí que probó este formato, pero sólo quería confirmar que esta es de hecho la forma en que se supone que funciona. Pensé en responder ya que esta pregunta surgió primero cuando busqué esto.

    Esto funcionó para mí utilizando .NET 4.0

    Tengo que actualizar la respuesta a esta pregunta, necesitaba hacer lo mismo y usé la respuesta aceptada pero la Fecha obtenida estaba equivocada, me estaba dando una Fecha de una semana antes (No sé por qué). No sé mucho sobre el tipo de fecha de Java pero sé que algunos de sus métodos se han deprecated.

    Diciendo que creo que esta es la respuesta correcta más reciente para esta situación. La esperanza ayuda a otra persona

     import java.util.Date; import java.util.GregorianCalendar; import java.util.TimeZone; ..... final Calendar cal = GregorianCalendar.getInstance(TimeZone.getTimeZone("GMT")); cal.setTime(value); // Where Value is a Date final long date = cal.getTime().getTime(); final String senddate = "/Date("+date+")/"; 

    Tenga en cuenta el uso de la fecha con la mayúscula "D" , esto también es necesario porque causa problemas con el WCF (al menos en mi caso, se pegó mucho sólo para la minúscula D)

    Lo estoy usando para consumir un RESTful WCF con Jackson Library for JSON.

    Para agregar una respuesta completa se puede utilizar esta manera para una fecha que desea ser serializado con jackson.

     import java.io.IOException; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; import java.util.TimeZone; import org.codehaus.jackson.JsonGenerationException; import org.codehaus.jackson.JsonGenerator; import org.codehaus.jackson.annotate.JsonCreator; import org.codehaus.jackson.map.SerializerProvider; import org.codehaus.jackson.map.ser.std.SerializerBase; /** * @author HECTOR * */ public class SerializeRESTDate extends SerializerBase<Date> { public SerializeRESTDate() { // TODO Auto-generated constructor stub this(Date.class); } @JsonCreator protected SerializeRESTDate(Class<Date> t) { super(t); // TODO Auto-generated constructor stub } @Override public void serialize(Date value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonGenerationException { final Calendar cal = GregorianCalendar.getInstance(TimeZone.getTimeZone("GMT")); cal.setTime(value); final long date = cal.getTime().getTime(); final String senddate = "/Date("+date+")/"; jgen.writeString(senddate); } } 

    Y úsalo así en la definición de tu clase

     @JsonSerialize(using = SerializeRESTDate.class) @JsonProperty("InspectionDate") /** * @return the _InspectionDate */ public Date get_InspectionDate() { return _InspectionDate; } 

    Este es el código que utilizo para enviar desde Android Java a .NET WebApp. Cree un objeto JSON con una fecha en el esquema XML W3C:

     Calendar myCalendarObj = Calendar.getInstance(); // Snap a moment in time JSONObject jObj = new JSONObject(); // Create a JSON object (org.json.JSONObject) SimpleDateFormat jsonDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); // from java.text.SimpleDateFormat String senddate = jsonDateFormat.format(myCalendarObj.getTime()); jObj.put("a_date_field", senddate); 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.