我正在尝试将DateTime
作为参数发送到通过JSON编码的WCF RESTful服务公开的方法。请求如下所示:
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中有多个条目。
有谁知道如何做到这一点?
更新:问题出在服务器端并且已经解决。
答案 0 :(得分:7)
将日期发布到WCF服务的正确格式是:
/Date(53244000000)/
括号中的数字是自1970 UTC午夜以来的毫秒数。
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);
答案 1 :(得分:2)
以防这有助于某人:
据微软称,WCF使用QueryStringConverter进行网址解析。因此,使用此代码(稍微修改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
答案 2 :(得分:0)
我必须更新这个问题的答案,我需要做同样的事情并且我使用了接受的答案,但获得的日期是错误的,它给了我一个星期的日期(不知道为什么)。我不太了解Java的Date类型,但我知道他们的一些方法已被弃用。
据说我认为这是针对这种情况的最新正确答案。希望帮助其他人
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卡住了很多)
我正在使用它来使用Jackson Library for JSON的RESTful WCF。
要添加完整的答案,可以使用此方式为您希望使用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;
}
答案 3 :(得分:0)
这是我用来从Android Java发送到.NET WebApp的代码。使用W3C XML架构中的日期创建一个JSON对象:
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);