Создать провайдера OData для Excel — Power query показывает $ metadata xml

Я создаю провайдера OData для использования с Excel с библиотекой PHP: https://github.com/Algo-Web/POData

Мне удалось доставить образец данных в браузер в моей локальной сети с помощью:

http://dss.example.com/proto/odata.svc/Samples?$ = Формат JSON

{
"value":[
{
"id":"1","firstName":"Rebbecca","lastName":"Didio","companyName":"Brandt, Jonathan F Esq","address":"171 E 24th St","city":"Leith","state":"TA","post":"7315","phone1":"03-8174-9123","phone2":"0458-665-290","email":"[email protected]","web":"http://www.brandtjonathanfesq.com.au"},{
"id":"2","firstName":"Stevie","lastName":"Hallo","companyName":"Landrum Temporary Services","address":"22222 Acoma St","city":"Proston","state":"QL","post":"4613","phone1":"07-9997-3366","phone2":"0497-622-620","email":"[email protected]","web":"http://www.landrumtemporaryservices.com.au"},{
"id":"3","firstName":"Mariko","lastName":"Stayer","companyName":"Inabinet, Macre Esq","address":"534 Schoenborn St #51","city":"Hamel","state":"WA","post":"6215","phone1":"08-5558-9019","phone2":"0427-885-282","email":"[email protected]","web":"http://www.inabinetmacreesq.com.au"},{
"id":"4","firstName":"Gerardo","lastName":"Woodka","companyName":"Morris Downing & Sherred","address":"69206 Jackson Ave","city":"Talmalmo","state":"NS","post":"2640","phone1":"02-6044-4682","phone2":"0443-795-912","email":"[email protected]","web":"http://www.morrisdowningsherred.com.au"},{
"id":"5","firstName":"Mayra","lastName":"Bena","companyName":"Buelt, David L Esq","address":"808 Glen Cove Ave","city":"Lane Cove","state":"NS","post":"1595","phone1":"02-1455-6085","phone2":"0453-666-885","email":"[email protected]","web":"http://www.bueltdavidlesq.com.au"},{
"id":"6","firstName":"Idella","lastName":"Scotland","companyName":"Artesian Ice & Cold Storage Co","address":"373 Lafayette St","city":"Cartmeticup","state":"WA","post":"6316","phone1":"08-7868-1355","phone2":"0451-966-921","email":"[email protected]","web":"http://www.artesianicecoldstorageco.com.au"},
...
}

и соответствующие метаданные на http://dss.example.com/proto/odata.svc/$ метаданных

<?xml version="1.0" encoding="UTF-8"?>
<edmx:Edmx xmlns:edmx="http://schemas.microsoft.com/ado/2007/06/edmx" xmlns="http://schemas.microsoft.com/ado/2009/11/edm" xmlns:cg="http://schemas.microsoft.com/ado/2006/04/codegeneration" xmlns:annotation="http://schemas.microsoft.com/ado/2009/02/edm/annotation" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" Version="3.0">
<edmx:DataServices m:MaxDataServiceVersion="3.0" m:DataServiceVersion="3.0">
<Schema Namespace="Proto">
<EntityType OpenType="false" Abstract="false" Name="Sample">
<Key>
<PropertyRef Name="id"/>
</Key>
<Property Name="id" Type="Edm.Int64" Nullable="false"/>
<Property Name="firstName" Type="Edm.String" Nullable="false"/>
<Property Name="lastName" Type="Edm.String" Nullable="false"/>
<Property Name="companyName" Type="Edm.String" Nullable="false"/>
<Property Name="address" Type="Edm.String" Nullable="false"/>
<Property Name="city" Type="Edm.String" Nullable="false"/>
<Property Name="state" Type="Edm.String" Nullable="false"/>
<Property Name="post" Type="Edm.String" Nullable="false"/>
<Property Name="phone1" Type="Edm.String" Nullable="false"/>
<Property Name="phone2" Type="Edm.String" Nullable="false"/>
<Property Name="email" Type="Edm.String" Nullable="false"/>
<Property Name="web" Type="Edm.String" Nullable="false"/>
</EntityType>
<EntityContainer Name="Proto" m:IsDefaultEntityContainer="true">
<EntitySet Name="Proto" EntityType="Proto.Sample" cg:GetterAccess="Public"/>
</EntityContainer>
</Schema>
</edmx:DataServices>
</edmx:Edmx>

Через запись заголовков я подтвердил, что Excel делает следующие запросы:

Запрос 1 для того, что кажется всеми данными. Библиотека отвечает JSON на это

User-Agent: Microsoft.Data.Mashup (https://go.microsoft.com/fwlink/?LinkID=304225)
MaxDataServiceVersion: 3.0
OData-MaxVersion: 4.0
Accept: application/json;odata.metadata=minimal;q=1.0,application/json;odata=minimalmetadata;q=0.9,application/atomsvc+xml;q=0.8,application/atom+xml;q=0.8,application/xml;q=0.7,text/plain;q=0.7
Accept-Encoding: gzip, deflate
Connection: Keep-Alive

Запрос 2 только для JSON

User-Agent: Microsoft.Data.Mashup (https://go.microsoft.com/fwlink/?LinkID=304225)
OData-MaxVersion: 4.0
Accept: application/json;odata.metadata=minimal
Accept-Encoding: gzip, deflate
Host: ds1.example.com

Библиотека отвечает JSON на это

Запрос 3 для atom / xml

Методом проб и ошибок я решил вернуть метаданные здесь

User-Agent: Microsoft.Data.Mashup (https://go.microsoft.com/fwlink/?LinkID=304225)
MaxDataServiceVersion: 3.0
Accept: application/json;odata=minimalmetadata;q=1.0,application/atomsvc+xml;q=0.8,application/atom+xml;q=0.8,application/xml;q=0.7,text/plain;q=0.7
Accept-Encoding: gzip, deflate
Host: ds1.example.com
---Request Start: /proto/odata.svc/Samples---
User-Agent: Microsoft.Data.Mashup (https://go.microsoft.com/fwlink/?LinkID=304225)
MaxDataServiceVersion: 3.0
Accept: application/atomsvc+xml;q=0.8,application/atom+xml;q=0.8,application/xml;q=0.7,text/plain;q=0.7
Accept-Encoding: gzip, deflate

Однако это отображает метаданные XML в PowerQuery как результаты запроса.

Я также изменил свой бэкэнд OData, чтобы он возвращал xml, как при запросе через браузер: http: /dss.example.com/proto/odata.svc/Samples

Для этого варианта Excel показывает ошибку:

«Одата: данный URL не указывает ни на службу OData, ни на канал:»

Я новичок в OData, цель здесь — доставить данные таблиц через веб-портал, не требуя установки чего-либо на компьютер под управлением Excel, в противном случае я бы использовал ODBC

7

Решение

От документация :

OData поддерживает два формата представления ресурсов на основе XML
Формат Atom и формат JSON. Как описано в HTTP
В спецификации [RFC2616] клиенты могут указать свои предпочтения
представление ресурса путем включения заголовка запроса на принятие с
список типов MIME, которые он может обработать.

Это означает, что вы можете использовать только два форматы АТОМ и JSON.
Однако по умолчанию metadataвернуть формат XML. Это означает, что вы можете изменить формат и для ResourcePath по умолчанию.

Algo-Web / POData имеет BaseService.php,
Есть перечисление TargetKind. TargetKind имеет РЕСУРС.
РЕСУРС это сущность (как Samples в вашем проекте http://dss.example.com/proto/odata.svc/Samples).

Я думаю, что вам нужно изменить BaseService.php в этом случае:

case TargetKind::RESOURCE():
return HttpProcessUtility::selectMimeType(
$requestAcceptText,
array_merge(
[MimeTypes::MIME_APPLICATION_ATOM],
$baseMimeTypes
)
);

и изменить MimeTypes::MIME_APPLICATION_ATOM в MimeTypes.MIME_APPLICATION_XML,

например

return HttpProcessUtility::selectMimeType(
$requestAcceptText,
array_merge(
[MimeTypes::MIME_APPLICATION_XML],
$baseMimeTypes
)
);
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]