Question

Je suis en train d'envoyer un DateTime en tant que paramètre à une méthode exposée au cours d'un service WCF RESTful avec le codage JSON. La demande se présente comme suit:

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"}

J'ai essayé plusieurs formats pour le DateTime:

  • 2010-07-01T10:54:00 (qui est envoyé par l'application WCFTestClient sur Net.TCP et il obtient des résultats
  • \/Date(12345678+0100)\/
  • 01.07.2010 10:54:00

La définition de la méthode:

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

je reçois toujours la réponse suivante:

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}

Il semble que le DateTime n'est pas analysé correctement, car il y a plusieurs entrées dans la Llog pour ce moment-là.

Quelqu'un sait comment faire?

Mise à jour . Le problème était sur le côté serveur et a été résolu

Était-ce utile?

La solution

Le format correct pour les dates de publication au service WCF est en utilisant: /Date(53244000000)/ où le chiffre entre parenthèses est le nombre de millisecondes depuis 1970 UTC minuit.

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

Et puis utilisez comme ci-dessous

inputparam.put("DateTime", datetime);

Autres conseils

Juste au cas où cela aide quelqu'un:

Selon Microsoft, WCF utilise un QueryStringConverter pour faire l'analyse syntaxique url. Ainsi, en utilisant ce code (légère modification de l'exemple msdn):

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

nous obtenons le bon format pour les paramètres DateTime REST: 2010-01-01T01: 01: 01Z

Je l'ai lu que vous avez essayé ce format, mais je voulais juste confirmer que cela est bien la façon dont il est censé fonctionner. Je pensais à répondre car cette question a été soulevée en premier lorsque je cherchais pour cela.

Cela a fonctionné pour moi en utilisant .NET 4.0

Je dois mettre à jour la réponse à cette question, je devais faire la même chose et moi la réponse acceptée, mais la date obtenue est erronée, elle me donnait une date d'une semaine avant (je ne sais pas pourquoi). Je ne sais pas grand-chose sur le type de date de Java, mais je sais que certaines de leurs méthodes a été dépréciée.

Étant dit que je pense que c'est la plus récente réponse correcte de cette situation. L'espoir aide quelqu'un d'autre

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+")/";

Notez l'utilisation de date avec Majuscule « D » , cela est également nécessaire, car il provoque des problèmes avec la WCF (au moins sur mon cas, a été coincé beaucoup juste pour le D minuscule)

Je l'utilise pour consommer un RESTful WCF avec Bibliothèque Jackson pour JSON.

Pour ajouter une réponse complète, il peut être utilisé de cette façon pour une date que vous voulez être avec sérialisé 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);

    }



}

Et l'utiliser comme ceci dans votre définition de class'property

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

est un code que j'utilise pour envoyer à partir d'Android Java à .NET WebApp. Créer un objet JSON avec une date dans le schéma XML du 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);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top