2017-04-26 216 views
1

我張貼使用JSONREST Web服務POST請求

[DataContract(Namespace = "http://localhost:30366/avtorji")] 
public class Avtor 
{ 
    [DataMember] 
    public int idAvtor { get; set; } 
    [DataMember] 
    public string ime { get; set; } 
    [DataMember] 
    public string priimek { get; set; } 
    [DataMember] 
    public DateTime datum_rojstva { get; set; } 

    public Avtor() { } 
} 

這個對象這是我的要求:

{ 
    "idAvtor": 4, 
    "ime": "M Vaqqas", 
    "priimek": "Noob", 
    "datum_rojstva": "2014-01-03 23:28:56" 
} 

我的功能是

public void DodajAvtorja(Avtor avtor) 
{ 
    string connString = null; 

    try 
    { 
     connString = "server=localhost;userid=;password;database="; 
     MySqlConnection conn = new MySqlConnection(connString); 
     MySqlCommand comm = conn.CreateCommand(); 
     //avtor.datum_rojstva.ToString("yyyy-MM-dd HH:mm:ss") 
     comm.CommandText = "INSERT INTO avtor (idAvtor, ime, priimek, datum_rojstva)" 
      +" VALUES (@idAvtor, @ime, @priimek, @datum_rojstva)"; 

     comm.Parameters.AddWithValue("@idAvtor", avtor.idAvtor); 
     comm.Parameters.AddWithValue("@ime", avtor.ime); 
     comm.Parameters.AddWithValue("@priimek", avtor.priimek); 
     comm.Parameters.AddWithValue("@datum_rojstva", avtor.datum_rojstva); 

     conn.Open(); 

     int dodanih = comm.ExecuteNonQuery(); 
     if (dodanih > 0) 
     { 
      UriTemplateMatch match = WebOperationContext.Current.IncomingRequest.UriTemplateMatch; 

      UriTemplate template = new UriTemplate("/avtor/{idAvtor}"); 
      Uri novAvtorUri = template.BindByPosition(match.BaseUri, avtor.idAvtor.ToString()); 
      WebOperationContext.Current.OutgoingResponse.SetStatusAsCreated(novAvtorUri); 
     } 
     conn.Close(); 
    } 
    catch (Exception) 
    { 

     throw; 
    } 
} 

它給了我一個錯誤「400錯誤請求」在它運行之前。我假設這是由於DateTime屬性。你甚至可以發送日期時間嗎?那麼解決方案是什麼?

謝謝你的幫忙!

+1

我想我需要更多的信息在這裏。錯誤的請求可能意味着很多事情。如果您忘記發送我不喜歡的特定標頭,我現在可以創建一個Web服務來返回錯誤請求。這是錯誤中唯一的消息嗎?您是否擁有您要發佈的網絡服務? – KSib

+0

是的,我擁有這項服務,我編輯了這個問題 – klemsi123

+0

如果你轉到你要發佈和調試的web服務,它不會縮小發生錯誤的那一行嗎?我無法想象客戶會得到所有的信息(至少它可能不應該?) – KSib

回答

1

WCF使用DataContractJsonSerializer進行JSON序列化。根據docs此串行器使用以下格式爲DateTime

DateTime值顯示爲JSON字符串的"/Date(700000+0500)/",其中第一個數字(700000中所提供的實施例)是在格林尼治標準時間的毫秒數的形式時區,自1970年1月1日午夜以來的正常(非夏令時)時間。該數字可能爲負值,代表早期時間。在該示例中,由"+0500"組成的部分是可選的,並指示時間類型爲Local種類 - 也就是說,應該在反序列化時將其轉換爲本地時區。如果不存在,則將時間反序列化爲Utc。實際數字(本例中爲「0500」)及其符號(+或 - )被忽略。

因此,你需要用這種方式來格式化"datum_rojstva"

{ 
    "datum_rojstva": "/Date(1388791736000)/", 
    "idAvtor": 4, 
    "ime": "M Vaqqas", 
    "priimek": "Noob" 
} 

如需幫助等格式的日期見例如How do I format a Microsoft JSON date?

有關Microsoft選擇此格式的一些歷史記錄,請參閱An Introduction to JavaScript Object Notation (JSON) in JavaScript and .NET: ASP.NET AJAX: Inside JSON date and time string