cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 
tadm9280
Community Participant

Receive error Code 422 Unprocessable Entity using API in Javascript

Jump to solution

Hi,

I am trying to call Canvas api to update on gradebook custom column from javascript.  There's no problem when I use GET to retrieve information from gb API, but I ran into ' 422 Unprocessable Entity' when calling PUT or DELETE to update. I tried to convert to JSON format to pass in data during PUT call, still resulted in same status code.  Can anyone throw me idea what the error be possible caused?   Thanks!

Ruiling

>>>

function updateCustomfield(courseID, customID) {
   var formdata = new FormData();
   formdata.append("column[hidden]", "true");
   const requestOptions = {
                method: 'PUT',
                credentials : 'same-origin',

                body: formdata
   };

  putUrl =  "https://" +window.location.hostname +"/api/v1/courses/" + courseID + '/custom_gradebook_columns/' + customID;
    fetch(putUrl, requestOptions)
                .then(function(response) {
             console.log(response.status);
             console.log(response.text());
    });

}

>>>>

2 Solutions

Accepted Solutions
kona
Community Coach
Community Coach

 @tadm9280 , greetings! To help with this question, I'm sharing your question with the Canvas Developers group in Canvas. Hopefully, they'll be able to help!

Kona 

View solution in original post

0 Kudos
James
Community Champion

The 422 is that Canvas couldn't make sense out of your request. At first glance (without testing or looking at the documentation for other issues), I see that you are not sending the header to accept content-type: application/json.That is necessary if you use JSON. For PUT, I've had better success if I make it part of the query string and don't mess with the body.

putUrl = "https://" +window.location.hostname +"/api/v1/courses/" + courseID + '/custom_gradebook_columns/' + customID + '?column[hidden]=true';

The second potential issue would be getting the API token in there. In GET calls, I've been able to use the browser's cookies as credentials, but it seems every time I want to to POST or PUT, I need to look up the x-csrf cookie and include that, but I might be remembering non-API calls.

Sorry for the non-certainty in the answer. I've got a lot of things I'm trying to manage right now.

View solution in original post

4 Replies
kona
Community Coach
Community Coach

 @tadm9280 , greetings! To help with this question, I'm sharing your question with the Canvas Developers group in Canvas. Hopefully, they'll be able to help!

Kona 

View solution in original post

0 Kudos
James
Community Champion

The 422 is that Canvas couldn't make sense out of your request. At first glance (without testing or looking at the documentation for other issues), I see that you are not sending the header to accept content-type: application/json.That is necessary if you use JSON. For PUT, I've had better success if I make it part of the query string and don't mess with the body.

putUrl = "https://" +window.location.hostname +"/api/v1/courses/" + courseID + '/custom_gradebook_columns/' + customID + '?column[hidden]=true';

The second potential issue would be getting the API token in there. In GET calls, I've been able to use the browser's cookies as credentials, but it seems every time I want to to POST or PUT, I need to look up the x-csrf cookie and include that, but I might be remembering non-API calls.

Sorry for the non-certainty in the answer. I've got a lot of things I'm trying to manage right now.

View solution in original post

James
Community Champion

Oops, I meant content-type: application/json if you want to send it as JSON. I think you may also have to stringify it.

I would give up on the JSON format though and just append it to the end of the URL as I suggested the first time.

tadm9280
Community Participant

Thanks so much for your prompt reply and info!  Yes. Passing in the CSRF-Token did the trick.