AndroidからWCF Restful JSONサービスへのDateTimeを投稿する
-
02-10-2019 - |
質問
私はaを送ろうとしています 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にいくつかのエントリがあるため、正しく解析されません。
誰かがこれを行う方法を知っていますか?
アップデート: :問題はサーバー側にあり、解決されました。
解決
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);
他のヒント
これが誰かに役立つ場合に備えて:
Microsoftによると、WCFはaを使用します 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を使用して私のために機能しました
この質問に対する答えを更新する必要があります。同じことをする必要があり、受け入れられた答えを使用しましたが、取得した日付は間違っていました。1週間前に日付を与えていました(理由はわかりません)。 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のためだけに詰まっていました)
JSON用のJackson LibraryでRestful WCFを消費するために使用しています。
完全な回答を追加するために、ジャクソンとシリアル化する日付にこの方法で使用できます。
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に送信するために使用するコードです。 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);