أنا أطلب بيانات مخطط Salesforce. لها شكل
res = {
Id: { name, type, label },
IsDeleted: { type, name, label },
MasterRecordId: { type, name, label },
...and so on
}
لذلك ، الحقول ديناميكية.
في queries.js أحاول وصفها
export const GET_SALESFORCE_FIELDS = gql`
query SalesforceFields {
salesforceFields @rest(endpoint: "schemaservice", type: "SalesforceFields", path: "/fields") {
// What should be here??
}
}
`;
`
كيف يمكنني وصف الجزء الديناميكي؟ ليس لدي أي ملفات مخطط أو أدوات حل. فقط queries.js (لمزيد من الطلبات باستخدام useQuery) و client.js (حيث يتم تعريف ApolloClient الجديد)
"@ apollo / client": "^ 3.0.0-rc.10"،
"apollo-link-rest": "^ 0.8.0-beta.0"،
ssuvorov - هل تحققت من إجراء مكالمة الشبكة بنجاح؟
إذا كان الأمر كذلك ، فبناءً على إجابتك فقط كمثال: سأفعل شيئًا مثل:
export const GET_SALESFORCE_FIELDS = gql`
query SalesforceFields {
salesforceFields @rest(endpoint: "schemaservice", type: "SalesforceFields", path: "/fields") {
Id {
type, name, label
}
IsDeleted {
type, name, label
}
# …remaining fields
}
}
`;
- الآن ، قد لا يعمل هذا لأن GraphQL تتوقع أن يكون لكل نوع اسم ، لذلك بدلاً من ذلك قد تحتاج إلى تغيير هذا:
export const GET_SALESFORCE_FIELDS = gql`
query SalesforceFields {
salesforceFields @rest(endpoint: "schemaservice", type: "SalesforceFields", path: "/fields") {
- Id {
+ Id @type(name: "FieldDescriptor") {
type, name, label
}
- IsDeleted {
+ IsDeleted @type(name: "FieldDescriptor") {
type, name, label
}
# …remaining fields
}
}
`;
(هناك طريقة بديلة للقيام بذلك وهي باستخدام TypePatcher - موثق في المستندات)
إذا كان كل إدخال هو نفس مخطط الكائن ، فيمكنك حتى استخدام جزء لمساعدتك:
export const GET_SALESFORCE_FIELDS = gql`
query SalesforceFields {
salesforceFields @rest(endpoint: "schemaservice", type: "SalesforceFields", path: "/fields") {
Id @type(name: "FieldDescriptor") {
- type, name, label
+ ...FieldFrag
}
IsDeleted @type(name: "FieldDescriptor") {
- type, name, label
+ ...FieldFrag
}
# …remaining fields
}
+ fragment FieldFrag on FieldDescriptor {
+ type
+ name
+ label
+ }
}`;
إذا كنت تستخدم Salesforce بطريقة عامة ، ولا تعرف عدد الأعمدة التي ستحصل عليها ، فسيصبح الأمر أكثر تعقيدًا بعض الشيء ، وتحتاج إلى استخدام أداة ترقيع النوع لتغيير شكل API.
لا أستخدم Salesforce - ولكن إذا كنت أنا ، فسأفكر في سؤال ممثل Salesforce عما إذا كان لديهم عرض GraphQL رسميًا ، أو إذا كان لديهم عرضًا مباركًا من جهة خارجية للحصول عليه محليًا.
أظهر بحث سريع في google أن هذا موجود: https://appexchange.salesforce.com/appxListingDetail؟listingId=a0N3A00000G0l6nUAB - ولكن ليس لديه سوى مراجعة واحدة ، لذلك ليس لدي أي فكرة عما إذا كان جيدًا.
fbartho شكرا جزيلا
إذا كنت بحاجة إلى معالجة استجابة لجعل ذلك أسهل قليلاً ، فيمكنك استخدام نوع نوع باتشر ، والذي سيعطيك رابطًا لإعادة تشكيل الاستجابة بالكامل.
قد يبدو المخطط الأفضل / الأكثر عمومية كما يلي:
type MyResponse (
columns: [Column!]!
}
type Column {
name: String!
type: String!
label: String!
}
@ fbartho شكرا لمساعدتكم. هذه هي الطريقة التي قمت بحلها.
// queries.js
export const GET_SALESFORCE_FIELDS = gql`
query SalesforceFields {
salesforceFields @rest(endpoint: "schemaservice", type: "SalesforceFieldsPayload", path: "/fields") {
items @type(name: "Salesforce")
}
}
`;
// client.js
const restLink = new RestLink({
...,
typePatcher: {
SalesforceFieldsPayload: (
data,
outerType,
patchDeeper
) => {
if (data != null) {
data.items = Object.keys(data).map(field => ({ __typename: "Salesforce", ...data[field] }));
}
return data;
}
}
});