Отправка DateTime из Android в службу WCF RESTful JSON

Я пытаюсь отправить DateTime в качестве параметра методу, предоставляемому через службу WCF RESTful с кодировкой JSON. Запрос выглядит так:

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

Я пробовал несколько форматов для DateTime:

  • 2010-07-01T10:54:00 (который отправляется приложением WCFTestClient через NET.TCP и получает результаты
  • \/Date(12345678+0100)\/
  • 01.07.2010 10:54:00

Определение метода:

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

Я всегда получаю следующий ответ:

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}

Похоже, что DateTime анализируется неправильно, потому что для этого времени в Llog есть несколько записей.

Кто-нибудь знает, как это сделать?

Обновление: проблема была на стороне сервера и была решена.


person Hameno    schedule 02.07.2010    source источник
comment
На какой веб-сервис вы пытаетесь отправить данные? Если это документ с общедоступной документацией, возможно, там есть какая-то информация.   -  person matto1990    schedule 02.07.2010
comment
Это веб-сервис ForTheRecord (http'://4therecord.eu/), и у меня есть только интерфейсы API. Я связался с разработчиком этой программы, но я не знаю, ошибка ли это в Сервисе или что-то еще. Я ничего не нашел о том, как DateTime следует передавать в WebService.   -  person Hameno    schedule 02.07.2010


Ответы (4)


Правильный формат для публикации дат в службе WCF: /Date(53244000000)/, где число в скобках — это количество миллисекунд, прошедших с полуночи 1970 года по всемирному координированному времени.

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

А затем используйте его, как показано ниже

inputparam.put("DateTime", datetime);
person Ahmed Ebied    schedule 01.03.2011
comment
Я принял ваш ответ, потому что в целом он верен. Как я уже писал, на стороне сервера также была проблема, но она решена, и в этом странном формате все работает. - person Hameno; 02.03.2011
comment
Вы имеете в виду: inputparam.put("DateTime", senddate)? - person noelicus; 16.04.2016

На всякий случай это поможет кому-то:

Согласно Microsoft, WCF использует QueryStringConverter для сделать парсинг URL. Таким образом, используя этот код (небольшая модификация примера msdn):

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

мы получаем правильный формат для параметров DateTime REST: 2010-01-01T01:01:01Z

Я читал, что вы пробовали этот формат, но просто хотел подтвердить, что это действительно так, как он должен работать. Я думал об ответе, так как этот вопрос возник первым, когда я искал это.

Это сработало для меня, используя .NET 4.0

person esegura    schedule 26.10.2010

Я должен обновить ответ на этот вопрос, мне нужно было сделать то же самое, и я использовал принятый ответ, но полученная дата была неправильной, она давала мне дату за неделю до этого (не знаю почему). Я мало что знаю о типе Date в Java, но я знаю, что некоторые из их методов устарели.

Говорят, что я думаю, что это самый последний правильный ответ для этой ситуации. Надежда помогает кому-то еще

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

Обратите внимание на использование даты с прописной буквой "D", это также необходимо, потому что вызывает проблемы с WCF (по крайней мере, в моем случае, много застрял только для нижнего регистра D)

Я использую его для использования RESTful WCF с библиотекой Джексона для JSON.

Чтобы добавить полный ответ, его можно использовать таким образом для даты, которую вы хотите сериализовать с помощью 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);

    }



}

И используйте это так в определении свойства вашего класса

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

Это код, который я использую для отправки из Android Java в .NET WebApp. Создайте объект JSON с датой в 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);
person noelicus    schedule 17.04.2016