Je travaille sur l'implémentation de PUT, POST et DELETE pour mon service. Mais chaque fois que j'essaie d'envoyer un fichier json au serveur, je reçois l'erreur 'Impossible de créer une classe abstraite'. J'ai généré mes données de requête en exécutant une instance de mon objet via un DataContractJsonSerializer
, en ajoutant le champ __type et en l'enveloppant dans {"obj": mydata}.POSTing JSON à WCF REST Endpoint
Je peux exécuter ce à travers un DataContractJsonSerializer
qui attend un BaseObj et il fonctionne très bien:
{"__type":"RepositoryItem:http:\/\/objects\/","Insert_date":null,"Modified_date":null,"insert_by":null,"last_modify_user_id":null,"modified_by":null, "external_id":"1234","internal_id":54322,"school_id":45,"type_name":0, "vendor_id":57}
Mon contrat de service est décoré avec un attribut ServiceKnownType
avec le RepositoryItem
et BaseObj
inclus dans la liste.
Je POSTer en utilisant jquery
$.ajax({
type: "POST",
url: "http://localhost/slnSDK/service.svc/create/repositoryitem.json?t=" + token,
data: data,
success: function(result) {
$("#input").html(result);
},
error: function(xhr, result, err) {
$("#htmloutput").html(xhr.responseText);
},
dataType: "json",
contentType: "application/json"
});
J'ai le point final suivant exposé:
<OperationContract(Action:=Api2Information.Namespace & "createJson")> _
<WebInvoke(Method:="POST", _
BodyStyle:=WebMessageBodyStyle.Bare, _
RequestFormat:=WebMessageFormat.Json, _
responseFormat:=WebMessageFormat.Json, _
UriTemplate:="/create/{objType}.json?t={token}")> _
Function createJson(ByVal objType As String, ByVal obj As BaseObj, ByVal token As String) As Integer
Et les objets suivants (IBaseObj a été omis car il peut être déduit par son implementor)
<DataContract(Namespace:="http://objects/")> _
Public Class RepositoryItem : Inherits BaseObj
' members backing properties have been omitted.
Public Sub New()
...
<DataMember()> _
Public Property type_name() As eType
...
' Override this to expose it as a property on the WebAPI
<DataMember()> _
Public Overrides Property internal_id() As Integer?
...
<DataMember()> _
Public Property external_id() As String
...
<DataMember()> _
Public Property vendor_id() As Integer
...
End Class
<DataContract(Namespace:="http://objects/")> _
<Serializable()> _
Public MustInherit Class BaseObj : Implements IBaseObj
' members backing properties have been omitted.
<DataMember()> _
Public Overridable Property insert_by() As String Implements IBaseObj.Insert_by
...
<DataMember()> _
Public Overridable Property Insert_date() As Nullable(Of Date) Implements IBaseObj.Insert_date
...
<DataMember()> _
Public Overridable Property modified_by() As String Implements IBaseObj.Modified_by
...
<DataMember()> _
Public Overridable Property Modified_date() As Nullable(Of Date) Implements IBaseObj.Modified_date
...
<DataMember()> _
Public Overridable Property last_modify_user_id() As Nullable(Of Integer) Implements IBaseObj.Last_modify_user_id
...
End Class
Sortie Fiddler de POST:
POST http://localhost/slnSDK/service.svc/create/repositoryitem.json?t= HTTP/1.1
Host: localhost
Connection: keep-alive
Referer: http://localhost/apitest.html
Content-Length: 265
Origin: http://localhost
X-Requested-With: XMLHttpRequest
Content-Type: application/json
Accept: application/json, text/javascript, */*; q=0.01
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.7 (KHTML, like Gecko) RockMelt/0.8.36.79 Chrome/7.0.517.44 Safari/534.7
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
Cookie: ASP.NET_SessionId=ywyooz45mi3c4d55h4ld4bec; x=lHOtsYBHvS/fKE7JQWzFTw==; y=XhfNVfYYQynJrIZ/odWFOg==
{"obj":{"__type":"RepositoryItem:http:\/\/objects\/","Insert_date":null,"Modified_date":null,"insert_by":null,"last_modify_user_id":null,"modified_by":null, "external_id":"1234","internal_id":54322,"school_id":45,"type_name":0, "vendor_id":57}}
Toute aide que vous pouvez fournir serait géniale. Merci!
J'ai mis à jour mon message pour refléter cela, mais cette requête HTTP a été capturée en utilisant Fiddler. En outre, merci pour les têtes sur les données de retour. –
Réponse mise à jour, les champs nuls sont-ils un problème? – amelvin
hm. Je l'ai essayé à nouveau avec des valeurs dans mes champs de chaînes nulles, pas de dés. –