POSTing 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.

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

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

Правильный формат отправки дат в службу WCF использует: /Date(53244000000)/ где число в скобках – это число миллисекунд с 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+")/"; 

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

 inputparam.put("DateTime", datetime); 

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

Согласно 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

Я должен обновить ответ на этот вопрос, мне нужно было сделать то же самое, и я использовал принятый ответ, но полученная дата была неправильной, она давала мне дату недели раньше (не знаю почему). Я мало знаю о типе даты 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 с библиотекой Jackson для JSON.

Чтобы добавить полный ответ, можно использовать этот способ для даты, которую вы хотите сериализовать с помощью джексона.

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

Это код, который я использую для отправки с 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); 
Intereting Posts
Android, как отобразить диалоговое окно от ошибки try catch? Android Studio 3.0 Предварительный просмотр Отсутствует Импорт при рефакторинге кода Котлина Как установить мой град для окончательной версии apk Пользовательский внешний вид ActionBar в Android 4.3 Как получить привязанный к Android сервис, чтобы выжить при перезапуске конфигурации Android и настройка альфа для (изображения) вида альфа Эквивалент RelativeLayout в Flutter OpenGL «Недопустимая операционная ошибка» После того, как функция glDrawElements на телефоне Android Как обрабатывать изменение ориентации экрана, когда диалог выполнения и фоновый поток активны? Использование доступных ресурсов Панель поиска или индикатор хода с несколькими цветами Проблемы с изменением положения ImageView в Android Проигрыватель RTMP / RTSP в реальном времени без использования веб-браузера (WOWZA-сервера) на Android Как создать блокировку (concurrent.locks.Lock) в Android? Как открыть URL-адрес кнопки в браузере по умолчанию или в веб-браузере