Based on the information here http://docs.valence.desire2learn.com/res/course.html#actions I would expect that to 'update' a courseOffering I would specify a PUT with a CourseOfferingInfo block, which only contains a few attributes. Every time I try this, I get a 404, not found - even using the same route for a successful GET (404 says org doesn't exist OR org is not an offering - neither is true). However, if I specify a CreateCourseOffering block (directly from a previous GET), the PUT works fine. Is this correct and the documentation not? Or are there other things I should look for in this scenario? The documentation says use CreateCourseOffering for the POST to create an offering… I simply want to update one attribute of that offering and as such thought the PUT was the way to go.
Desire2Learn Valence API, PUT CourseOffering 404
95 Views Asked by Chris Tatem At
1
There are 1 best solutions below
Related Questions in DESIRE2LEARN
- Swift Syntax Error : Type 'AnyObject' cannot be implicitly downcast
- GPUImage giving multiple GL_INVALID_ errors as soon as any GPUImage class is used
- CCSpine by cocos2d-objc-ext not working
- CCClippingNode on Android not working
- CCActionCallBlock usage in Cocos2d Swift
- Cocos2d-Swift : Playing Sound Crashed
- Swift Version of Cocos2d Code : sprite1.colorRGBA
- Using CCScrollView in Cocos2d V3
- Cocos2d-Swift v3.x Sprite Builder : In iPad iPhone sd images are used. -ipad suffix ignored
- Cocos2d-Swift : CCProgressNodeTypeBar not found in Swift
Related Questions in VALENCE
- Swift Syntax Error : Type 'AnyObject' cannot be implicitly downcast
- GPUImage giving multiple GL_INVALID_ errors as soon as any GPUImage class is used
- CCSpine by cocos2d-objc-ext not working
- CCClippingNode on Android not working
- CCActionCallBlock usage in Cocos2d Swift
- Cocos2d-Swift : Playing Sound Crashed
- Swift Version of Cocos2d Code : sprite1.colorRGBA
- Using CCScrollView in Cocos2d V3
- Cocos2d-Swift v3.x Sprite Builder : In iPad iPhone sd images are used. -ipad suffix ignored
- Cocos2d-Swift : CCProgressNodeTypeBar not found in Swift
Trending Questions
- UIImageView Frame Doesn't Reflect Constraints
- Is it possible to use adb commands to click on a view by finding its ID?
- How to create a new web character symbol recognizable by html/javascript?
- Why isn't my CSS3 animation smooth in Google Chrome (but very smooth on other browsers)?
- Heap Gives Page Fault
- Connect ffmpeg to Visual Studio 2008
- Both Object- and ValueAnimator jumps when Duration is set above API LvL 24
- How to avoid default initialization of objects in std::vector?
- second argument of the command line arguments in a format other than char** argv or char* argv[]
- How to improve efficiency of algorithm which generates next lexicographic permutation?
- Navigating to the another actvity app getting crash in android
- How to read the particular message format in android and store in sqlite database?
- Resetting inventory status after order is cancelled
- Efficiently compute powers of X in SSE/AVX
- Insert into an external database using ajax and php : POST 500 (Internal Server Error)
Popular # Hahtags
Popular Questions
- How do I undo the most recent local commits in Git?
- How can I remove a specific item from an array in JavaScript?
- How do I delete a Git branch locally and remotely?
- Find all files containing a specific text (string) on Linux?
- How do I revert a Git repository to a previous commit?
- How do I create an HTML button that acts like a link?
- How do I check out a remote Git branch?
- How do I force "git pull" to overwrite local files?
- How do I list all files of a directory?
- How to check whether a string contains a substring in JavaScript?
- How do I redirect to another webpage?
- How can I iterate over rows in a Pandas DataFrame?
- How do I convert a String to an int in Java?
- Does Python have a string 'contains' substring method?
- How do I check if a string contains a specific word?
If you use the "create" POST route with a
CreateCourseOffering
block, this will create a new course offering, and send back the CourseOffering block for the newly created course offering (this will include the org unit ID value for the new org unit you've built).If you want to update an existing course offering, you should, as you suspected, use the "update" PUT route with a
CourseOfferingInfo
block. Note that you must provide valid information for all the fields in this block, since when used successfully, the LMS will use all the properties you specify in that block for new values for the org unit. TheStartDate
andEndDate
fields are particularly finicky: you must provide either a validUTCDateTime
value (notice that the three-digit millisecond specifier in these values is mandatory) or a JSONnull
value if the field is not applicable.Why a 404? What you're seeing with the 404s and the data you're passing is likely down to the way the back-end service is doing data binding. It tries to de-serialize your provided JSON data (and query parameters) into data objects it can read/manipulate -- if you provide a JSON block that contains a superset of the properties it's expecting, then this may work (for example, if you provide a
CourseOffering
block when you're expected to provide aCourseOfferingInfo
) as the binding layer may ignore fields it doesn't need. If the binding process fails, because you provide a value for a property that can't be bound to the data type expected, or because you fail to provide a JSON property field it expects, then this can cause the service to return a 404 (because binding/de-serializing incoming parameterized data happens at the same time as matching the URL route to an underlying service handler).If you provide a JSON structure (and query parameters) that the web-service can bind to its expected data objects, but the values you provide are invalid or nonsensical, then this can cause the underlying service handler to respond with a 400 (signalling an Invalid Request). But in order to get this far, your parameterized data still needs to get properly deserialized and bound into data objects for the underlying service to examine.
We'll be updating the documentation to more explicitly draw out this fact. The safest policy from the calling client perspective is to pass valid JSON structures that are exactly what's expected by the individual routes, especially since the underlying back-end service implementation might change how it handles incoming requests.