Closed 1letter closed 1 year ago
@1letter thanks for reporting this!
@davisagli @robgietema I guess this is something we want to investigate...
@tisto @davisagli @robgietema
The Problem is the DefaultJSONSummarySerializer
In the QuerystringSearchGet
Service the Get Paramter are copied to self.request["BODY"] but the Serializer use self.request.form to calculate the metadata fields.
def metadata_fields(self):
query = self.request.form
if not query:
# maybe its a POST request
query = json_body(self.request)
print(query)
"""
GET
{'query': '%7B%22query%22%3A%20%5B%7B%22i%22%3A%20%22portal_type%22%2C%20%22o%22%3A%20%22plone.app.querystring.operation.selection.is%22%2C%20%22v%22%3A%20%5B%22News%20Item%22%5D%7D%5D%2C%20%22metadata_fields%22%3A%20%5B%22image_scales%22%2C%20%22getIcon%22%5D%7D'}
{'query': '%7B%22query%22%3A%20%5B%7B%22i%22%3A%20%22portal_type%22%2C%20%22o%22%3A%20%22plone.app.querystring.operation.selection.is%22%2C%20%22v%22%3A%20%5B%22News%20Item%22%5D%7D%5D%2C%20%22metadata_fields%22%3A%20%5B%22image_scales%22%2C%20%22getIcon%22%5D%7D'}
{'query': '%7B%22query%22%3A%20%5B%7B%22i%22%3A%20%22portal_type%22%2C%20%22o%22%3A%20%22plone.app.querystring.operation.selection.is%22%2C%20%22v%22%3A%20%5B%22News%20Item%22%5D%7D%5D%2C%20%22metadata_fields%22%3A%20%5B%22image_scales%22%2C%20%22getIcon%22%5D%7D'}
POST
{'query': [{'i': 'portal_type', 'o': 'plone.app.querystring.operation.selection.is', 'v': ['News Item']}], 'metadata_fields': ['image_scales', 'getIcon']}
{'query': [{'i': 'portal_type', 'o': 'plone.app.querystring.operation.selection.is', 'v': ['News Item']}], 'metadata_fields': ['image_scales', 'getIcon']}
{'query': [{'i': 'portal_type', 'o': 'plone.app.querystring.operation.selection.is', 'v': ['News Item']}], 'metadata_fields': ['image_scales', 'getIcon']}
"""
additional_metadata_fields = query.get("metadata_fields", [])
if not isinstance(additional_metadata_fields, list):
additional_metadata_fields = [additional_metadata_fields]
additional_metadata_fields = set(additional_metadata_fields)
if "_all" in additional_metadata_fields:
fields_cache = self.request.get("_summary_fields_cache", None)
if fields_cache is None:
catalog = getToolByName(self.context, "portal_catalog")
fields_cache = set(catalog.schema()) | self.non_metadata_attributes
self.request.set("_summary_fields_cache", fields_cache)
additional_metadata_fields = fields_cache
return self.default_metadata_fields | additional_metadata_fields
Sidenote:
self.request["BODY"]
is an encoded string b'xxxx' not 'xxxxx'
Maybe that's the cleaner solution
class QuerystringSearchGet(Service):
"""Returns the querystring search results given a p.a.querystring data."""
def reply(self):
# We need to copy the JSON query parameters from the querystring
# into the request body, because that's where other code expects to find them
self.request["BODY"] = parse.unquote(
self.request.form.get("query", "{}")
).encode(self.request.charset)
querystring_search = QuerystringSearch(self.context, self.request)
return querystring_search()
https://community.plone.org/t/plone-6-0-4-endpoint-querystring-search-get-vs-post-get-method-didnt-return-metadata-fields/17407
In Plone 6.0.4 a GET Request to REST-API Endpoint
@querystring-search
is possible. I see two different results if i change from POST to GET Method. My Question: Why? It's a Bug or a Feature? The requestedmetadata_fields
are ignored in the GET Request, but in the POST Request all is fine.Endpoint @querystring-search with POST Method
This is one result item in the response of the POST request:
Endpoint @querystring-search with GET Method
This is one result item in the response of the GET request: