JSONを使用しているときにODataサービスに投稿すると、「エラー415:サポートされていないメディアタイプ」が発生します。
このかなり長い投稿の下部の解決策。
JSONを使用してGETできますが、試してすぐにPOSTこのエラーが発生します。
XMLを使用してGET/POSTもできますが、jsonを使用する必要があります。
このエラーは、リクエスト本文のjson形式ではなく、ヘッダーの何かが間違っていることを示していると思いますが、これも以下のように間違っている可能性があります。
私はFiddlerを使用してデバッグしようとしていますが、以下は結果です。
JSON POST
要求
POST http://scdb38:8888/bi.test/applicationdata.svc/Sharks HTTP/1.1
User-Agent: Fiddler
Host: scdb38:8888
Content-Length: 91
Accept: application/json;odata=verbose;
Content-Type: application/json;
{
"d":[
{
"Name":"Great White ",
"Food":"Surfers"
}
]
}
応答
HTTP/1.1 415 Unsupported Media Type
Cache-Control: private
Content-Length: 186
Content-Type: application/json;odata=verbose;charset=utf-8
Server: Microsoft-IIS/7.5
X-Content-Type-Options: nosniff
DataServiceVersion: 1.0;
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Wed, 16 Oct 2013 06:20:10 GMT
{"error":{"code":"1","message":{"lang":"en-AU","value":"<?xml version=\"1.0\" encoding=\"utf-16\"?><ExceptionInfo><Message>Unsupported media type requested.</Message></ExceptionInfo>"}}}
JSON GET
リクエストヘッダー
GET http://scdb38:8888/bi.test/applicationdata.svc/Sharks HTTP/1.1
User-Agent: Fiddler
Host: scdb38:8888
Content-Length: 0
Accept: application/json;odata=verbose;
Content-Type: application/json;
応答ヘッダー
HTTP/1.1 200 OK
Cache-Control: no-cache
Content-Length: 591
Content-Type: application/json;odata=verbose;charset=utf-8
Server: Microsoft-IIS/7.5
X-Content-Type-Options: nosniff
DataServiceVersion: 1.0;
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Wed, 16 Oct 2013 06:23:41 GMT
{"d":[{"__metadata":{"id":"http://scdb38:8888/BI.Test/ApplicationData.svc/Sharks(1)","uri":"http://scdb38:8888/BI.Test/ApplicationData.svc/Sharks(1)","etag":"W/\"X'00000000000007E4'\"","type":"LightSwitchApplication.Shark"},"Id":1,"RowVersion":"AAAAAAAAB+Q=","Name":"Tiger Shark","Food":"Penguins"},{"__metadata":{"id":"http://scdb38:8888/BI.Test/ApplicationData.svc/Sharks(2)","uri":"http://scdb38:8888/BI.Test/ApplicationData.svc/Sharks(2)","etag":"W/\"X'00000000000007E5'\"","type":"LightSwitchApplication.Shark"},"Id":2,"RowVersion":"AAAAAAAAB+U=","Name":"Grey Nurse","Food":"Lettuce"}]}
GETが正常に機能するときに、メディアタイプがPOSTでサポートされない理由はわかりません。 DataServiceVersion:1.0を使用し、アップグレードを調べましたが、LightSwitch 2012を使用しているため、LightSwitchアプリを中断せずに新しいバージョンを参照する際に問題が発生しました。 LightSwitch 2013は新しいバージョン(?)を使用していると思いますが、アップグレードすると新しい(技術的な)課題が発生します。私は回っていると感じていますが、これは私の最後の手段であり、同僚と話した後、これに失敗する唯一の他のオプションは、データベース上にデータモデルを作成し、これにODataサービスを作成することです。
---- UPDATE ----
それ以来、私はJen Sが提供する両方の修正を試みましたが、エラー:400 Bad Requestを受け取りました。
Odata = verboseを使用する
POST http://scdb38:8888/bi.test/applicationdata.svc/Sharks HTTP/1.1
Accept: application/json;odata=verbose;
Content-Type: application/json;odata=verbose;
Content-Length: 98
Host: scdb38:8888
{
"d":[
{
"Name":"Great White ",
"Food":"Surfers"
}
]
}
HTTP/1.1 400 Bad Request
Cache-Control: private
Content-Length: 201
Content-Type: application/json;odata=verbose;charset=utf-8
Server: Microsoft-IIS/7.5
X-Content-Type-Options: nosniff
DataServiceVersion: 1.0;
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Wed, 16 Oct 2013 23:31:09 GMT
{"error":{"code":"1","message":{"lang":"en-AU","value":"<?xml version=\"1.0\" encoding=\"utf-16\"?><ExceptionInfo><Message>An error occurred while processing this request.</Message></ExceptionInfo>"}}}
DataServiceVersionの使用:1.0
POST http://scdb38:8888/bi.test/applicationdata.svc/Sharks HTTP/1.1
Accept: application/json;odata=verbose;
Content-Type: application/json;
Content-Length: 98
Host: scdb38:8888
DataServiceVersion: 1.0;
{
"d":[
{
"Name":"Great White ",
"Food":"Surfers"
}
]
}
HTTP/1.1 400 Bad Request
Cache-Control: private
Content-Length: 201
Content-Type: application/json;odata=verbose;charset=utf-8
Server: Microsoft-IIS/7.5
X-Content-Type-Options: nosniff
DataServiceVersion: 1.0;
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Wed, 16 Oct 2013 23:31:09 GMT
{"error":{"code":"1","message":{"lang":"en-AU","value":"<?xml version=\"1.0\" encoding=\"utf-16\"?><ExceptionInfo><Message>An error occurred while processing this request.</Message></ExceptionInfo>"}}}
WebServiceVerionの使用:2.0
POST http://scdb38:8888/bi.test/applicationdata.svc/Sharks HTTP/1.1
Accept: application/json;odata=verbose;
Content-Type: application/json;
Content-Length: 98
Host: scdb38:8888
DataServiceVersion: 2.0;
{
"d":[
{
"Name":"Great White ",
"Food":"Surfers"
}
]
}
HTTP/1.1 400 Bad Request
Cache-Control: private
Content-Length: 201
Content-Type: application/json;odata=verbose;charset=utf-8
Server: Microsoft-IIS/7.5
X-Content-Type-Options: nosniff
DataServiceVersion: 1.0;
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Wed, 16 Oct 2013 23:38:23 GMT
{"error":{"code":"1","message":{"lang":"en-AU","value":"<?xml version=\"1.0\" encoding=\"utf-16\"?><ExceptionInfo><Message>An error occurred while processing this request.</Message></ExceptionInfo>"}}}
私はこれを解決して進歩していますか、それはjsonリクエストボディが間違って構造化されているだけの問題ですか?私は成功せずにいくつかの試みを試みましたが、XMLでの投稿は機能しています。
----- ソリューション ------
Json形式を使用してODataサービスに投稿するJenの助けに感謝します。
POST http://scdb38:8888/bi.test/applicationdata.svc/Sharks HTTP/1.1
Accept: application/json;odata=verbose;
Content-Type: application/json;
Content-Length: 62
Host: scdb38:8888
DataServiceVersion: 1.0;
{
"Name":"Great White ",
"Food":"Surfers"
}
HTTP/1.1 201 Created
Cache-Control: no-cache
Content-Length: 298
Content-Type: application/json;odata=verbose;charset=utf-8
ETag: W/"X'00000000000007E7'"
Location: http://scdb38:8888/BI.Test/ApplicationData.svc/Sharks(4)
Server: Microsoft-IIS/7.5
X-Content-Type-Options: nosniff
DataServiceVersion: 1.0;
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Thu, 17 Oct 2013 23:22:12 GMT
{"d":{"__metadata":{"id":"http://scdb38:8888/BI.Test/ApplicationData.svc/Sharks(4)","uri":"http://scdb38:8888/BI.Test/ApplicationData.svc/Sharks(4)","etag":"W/\"X'00000000000007E7'\"","type":"LightSwitchApplication.Shark"},"Id":4,"RowVersion":"AAAAAAAAB+c=","Name":"Great White ","Food":"Surfers"}}
この問題は、Content-Type
ヘッダーとAccept
ヘッダーの違いに関係しているようです。 HTTPでは、要求ペイロードと応答ペイロードでContent-Type
を使用して、現在のペイロードのメディアタイプを伝えます。 Accept
は、サーバーが応答ペイロードで使用できるメディアタイプを示すために、要求ペイロードで使用されます。
したがって、(GETリクエストのように)ボディのないリクエストにContent-Type
を含めることは意味がありません。 POSTリクエストを行うと、メッセージ本文が送信されるため、Content-Type
が重要になります。
サーバーがリクエストのContent-Type
を処理できない場合、415 HTTPエラーが返されます。 (サーバーがリクエストAccept
ヘッダー内のメディアタイプのいずれも満たすことができない場合、406エラーを返します。)
OData v3では、メディアタイプ「application/json」は、新しいJSON形式(「JSON light」)を意味すると解釈されます。サーバーがJSONライトの読み取りをサポートしていない場合、着信リクエストがJSONライトであることがわかると、415エラーがスローされます。ペイロードでは、リクエスト本文はJSONライトではなく冗長JSONであるため、サーバーはリクエストを処理できる必要があります。 JSONライトコンテンツタイプが表示されるため、そうではありません。
これは、次の2つの方法のいずれかで修正できます。
要求にDataServiceVersionヘッダーを含め、v3未満に設定します。例えば:
DataServiceVersion: 2.0;
(オプション2は、リクエストペイロードでv3機能を使用していないことを前提としています。)