LTI1.3 AGS Certification - MIME Type for AGS Not Legal
LTI1.3 AGS Certification - MIME Type for AGS Not Legal
Since I joined my company 2 years ago, we have used the certification suite to certify our tool under the "LTI Advantage Complete (All Four Components Complete)". Each year, we received the certification for all 4 components. This year, I'm having trouble with the LTI Assignment & Grade Services 2.0 test. When I enable grade sync in our tool, I am seeing an error message of "MIME Type for AGS NOT Legal" in our logs when we attempt to get one or multiple line items. I am confused by this message because we have not changed our request headers at all in the past two years.
- Our types match the types in the AGS standard.
- I assume the title casing used in our request header keys (as opposed to the lower case in the response header keys) is not the issue because we have the same casing in our certified NRPS requests.
- I assume the inclusion of both the Accept and Content-Type request headers in a GET call is not the issue because we include both in our certified NRPS requests.
- I have re-tested this with the certification suite a few times with a few different setups and with direct calls in the application console (Ruby on Rails).
Below is a truncated & redacted example of a log from one of our requests.
Has anyone else experienced this? Does anyone have any ideas of what may have changed or how I can troubleshoot this issue?
My challenge is further compounded because I am still new to the tools I am using (Linux and Rails consoles). If anyone has an example of making running a CURL command for an AGS call so that I can confirm my understanding directly, I would appreciate it. If anyone has an LTI Postman collection, I would also be interested in that. Many thanks in advance!
{
"request_host":"ltiadvantagevalidator.imsglobal.org",
"request_uri":"/ltitool/rest/assignmentsgrades/20976/lineitems?resource_id=cumulative",
"method":"GET",
"status":406,
"request_headers": {
"User-Agent":"Faraday v1.10.3",
"Authorization":"Bearer REDACTED",
"Content-Type":"application/vnd.ims.lis.v2.lineitem+json",
"Accept":"application/vnd.ims.lis.v2.lineitem+json"
},
"response_headers": {
"server":"nginx/1.14.0 (Ubuntu)",
"date":"Fri, 01 Nov 2024 01:04:13 GMT",
"content-type":"application/vnd.ims.lis.v2.lineitem+json;charset=ISO-8859-1",
"content-length":49,
"connection":"keep-alive"
}
}
RESOLVED - Stricter Test Suite
It appears that the test suite is stricter now than when we previously tested and than our team understood the standard to define during original implementation. Section 3.2.1 indicates both single line and line set media types are available for the service. It does not indicate that there are restrictions based on end point. However, section 3.2.10 indicates that multiple lines can have the same
resource_id
within a given context. Because our tool does not support that, our team used the single line item media type.Our tool sends the Accept header for a single line (
application/vnd.ims.lis.v2.lineitem+json
) when targeting thelineitems
end point to look up aresource_id
. In this context, our tool expects at most one line to be returned so our team. When we do not specify aresource_id
for thelineitems
end point, we send the Accept header for the container (application/vnd.ims.lis.v2.lineitemcontainer+json
). Changing the Accept header type from the single line to the set when including the `resource_id` will allow our tool to complete certification.Because the 406 response returned a `Content-Type` header that matches the `Accept` header and the error message did not indicate the expected MIME type (and I'm learning), it took far longer to troubleshoot this than it might have otherwise.
AGS References
* 3.21. Media Types: https://www.imsglobal.org/spec/lti-ags/v2p0/#line-item-service-media-typ...
* 3.2.10. resource_id: https://www.imsglobal.org/spec/lti-ags/v2p0/#tool-resource-identifier-re...
* Example without resource_id: https://www.imsglobal.org/spec/lti-ags/v2p0/#example-getting-all-line-it...
* There is no resource_id example.