Подтвердить что ты не робот

415 Неподдерживаемый тип медиа - POST json для службы OData в lightwitch 2012

Я получаю сообщение об ошибке 415: Unsupported Media Type 'при отправке в службу OData при использовании JSON.

Решение в нижней части этого довольно длинного сообщения.

Я могу использовать JSON, но как только я попробую и POST, я получу эту ошибку.

Я также могу использовать GET/POST с использованием XML, но мне нужно использовать 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"}]}

Я не понимаю, почему тип мультимедиа не поддерживается для POST, когда GET работает нормально. Я понимаю, что я использую DataServiceVersion: 1.0 и искал обновление, но я использую LightSwitch 2012 и имею проблемы со ссылкой на более новую версию, не нарушая приложение LightSwitch. Я думаю, что LightSwitch 2013 использует более новую версию (?), Однако обновление для меня открывает новые (нетехнические) проблемы. Я чувствую, что я обхожусь в кругах, и это мое последнее средство, и, поговорив с коллегой, мой единственный другой вариант не подходит, это создать модель данных по базе данных и создать для нее службу OData.

---- ОБНОВЛЕНИЕ ----

С тех пор я попробовал оба исправления, предоставленные 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 работает.

----- РЕШЕНИЕ ------

Благодаря Jen помощь для публикации с использованием json-формата для службы OData работает для меня.

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"}}
4b9b3361

Ответ 1

Похоже, эта проблема связана с различием между заголовками Content-Type и Accept. В HTTP Content-Type используется в запросах и ответах для передачи типа носителя текущей полезной нагрузки. Accept используется в полезных данных запроса, чтобы сказать, какие типы носителей сервер может использовать в полезной нагрузке ответа.

Итак, наличие Content-Type в запросе без тела (например, ваш запрос GET) не имеет смысла. Когда вы выполняете запрос POST, вы отправляете тело сообщения, поэтому значение Content-Type имеет значение.

Если сервер не может обработать запрос Content-Type, он вернет ошибку 415 HTTP. (Если сервер не может удовлетворить ни один из типов медиа в заголовке запроса Accept, он вернет ошибку 406.)

В OData v3 тип мультимедиа "application/json" интерпретируется как новый формат JSON ( "JSON light" ). Если сервер не поддерживает чтение света JSON, он выдает ошибку 415, когда видит, что входящий запрос - это индикатор JSON. В вашей полезной нагрузке ваш орган запроса является подробным JSON, а не JSON, поэтому сервер должен иметь возможность обрабатывать ваш запрос. Это просто не потому, что он видит легкий тип содержимого JSON.

Вы можете исправить это одним из двух способов:

  • Сделайте заявку Content-Type "application/json; odata = verbose" в вашем запросе POST или
  • Включите заголовок DataServiceVersion в запросе и установите его меньше, чем v3. Например:

    DataServiceVersion: 2.0;
    

(Вариант 2 предполагает, что вы не используете какие-либо функции v3 в своей полезной нагрузке запроса.)