web-dev-qa-db-ja.com

415サポートされていないメディアタイプ-POST json to lightData 2012のODataサービス

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"}}
25
PaddleFish

この問題は、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つの方法のいずれかで修正できます。

  1. POSTリクエストでContent-Typeを「application/json; odata = verbose」にするか、または
  2. 要求にDataServiceVersionヘッダーを含め、v3未満に設定します。例えば:

    DataServiceVersion: 2.0;
    

(オプション2は、リクエストペイロードでv3機能を使用していないことを前提としています。)

57
Jen S