2016-04-27 59 views
0

我有以下代碼來獲取數據drom Canvas REST API這個數據包含的信息比如coursse的開始日期和結束日期。我必須更改這個end_date當然。我使用GET來獲取信息,如圖計劃:如何在Canvas中使用curl使用PUT指令rest api

#!/usr/bin/perl 
use strict; 
use JSON::Parse 'parse_json'; 

my $auth = "xxx"; 
my $curl = "curl -H 'Authorization: Bearer $auth'"; 

#system("curl -H 'Authorization: Bearer $auth'https://canvas.instructure.com/api/v1/courses"); 
#system("curl -H 'Authorization: Bearer $auth' https://canvas.instructure.com/api/v1/accounts/$accountid/analytics/current/grades"); 


system("$curl https://canvas.instructure.com/api/v1/courses/10300000000000133"); 

    my $json = '["golden", "fleece"]'; 
    my $perl = parse_json ($json); 

程序的輸出是:

{"id":10300000000000133,"name":"DOV DEV","account_id":10300000000000001,"start_at":"2014-07-01T13:31:00Z","grading_standard_id":null,"is_public":true,"course_code":"DOV DEV","default_view":"feed","enrollment_term_id":10300000000000001,"end_at":"2016-05-28T04:00:00Z","public_syllabus":false,"storage_quota_mb":15000,"is_public_to_auth_users":false,"hide_final_grades":false,"apply_assignment_group_weights":false,"calendar":{"ics":"https://canvas.instructure.com/feeds/calendars/course_Jo1suCoQU3XhYMBJNm3Ziu2POTG4GL6DjzHJ7PM4.ics"},"sis_course_id":null,"integration_id":null,"enrollments":[{"type":"teacher","role":"TeacherEnrollment","role_id":822,"user_id":10300000000020171,"enrollment_state":"active"}],"workflow_state":"available","restrict_enrollments_to_course_dates":false}host-155-246-165-53:~ ajinkyabobade$ 

獲取信息如上圖所示,我使用-X PUT命令後改變end_date。包括PUT的代碼如下

#!/usr/bin/perl 
use strict; 
use JSON::Parse 'parse_json'; 

my $auth = "xxx"; 
#my $accountid = "10300000000000133"; 
my $curl = "curl -H 'Authorization: Bearer $auth'"; 
#system("curl -H 'Authorization: Bearer $auth' https://canvas.instructure.com/api/v1/courses"); 
#system("curl -H 'Authorization: Bearer $auth' https://canvas.instructure.com/api/v1/accounts/$accountid/analytics/current/grades"); 


system("$curl https://canvas.instructure.com/api/v1/courses/10300000000000133 -X PUT -d 'end_at=2017-05-28T04:00:00Z' "); 

my $json = '["golden", "fleece"]'; 
my $perl = parse_json ($json); 

的END_DATE使用此代碼還我得到下面的輸出沒有變化,請幫助

{"id":10300000000000133,"name":"DOV DEV","account_id":10300000000000001,"start_at":"2014-07-01T13:31:00Z","grading_standard_id":null,"is_public":true,"course_code":"DOV DEV","default_view":"feed","enrollment_term_id":10300000000000001,"end_at":"2016-05-28T04:00:00Z","public_syllabus":false,"storage_quota_mb":15000,"is_public_to_auth_users":false,"hide_final_grades":false,"apply_assignment_group_weights":false,"calendar":{"ics":"https://canvas.instructure.com/feeds/calendars/course_Jo1suCoQU3XhYMBJNm3Ziu2POTG4GL6DjzHJ7PM4.ics"},"sis_course_id":null,"integration_id":null,"workflow_state":"available","restrict_enrollments_to_course_dates":false}host-155-246-165-53:~ ajinkyabobade$ 
+0

如果退出捲曲,最好使用'LWP'。由於正確的代碼取決於instructure.com API – Borodin

回答

0
#!/usr/bin/perl 
use strict; 
use warnings; 

use warnings顯示比普通use strict更多的問題;總是很好地將它們一起使用。

use JSON::Parse 'parse_json'; 
use LWP::UserAgent; 
use Data::Dumper; # just for output 

my $url = 'https://canvas.instructure.com/api/v1/courses/10300000000000133'; 
my $auth = 'xxx'; 

my $ua = LWP::UserAgent->new; 

查看http://search.cpan.org/perldoc?LWP::UserAgent的手冊。

的AUTH頭添加到所有即將到來的請求一次:

$ua->default_headers->header('Authorization' => "Bearer $auth"); 

創建一個子呼喚你的API。此子可合併共同一切所有API請求,並添加錯誤處理:

sub api { 
    my ($method, $args) = @_; 

@_持有調用子時傳遞的參數。 $method將獲得第一個參數:GET,POST,PUT或任何其他有效的HTTP方法,$args應包含要發送的參數。

創建一個請求對象:

my $req = HTTP::Request->new($method, $url); 
    $req->content($args) 
     if $args; 

運行的要求,實際上是調用API:

my $result = $ua->request($req); 

解析結果,並返回一個Perl的數據結構,如果請求成功(HTTP狀態碼200):

return parse_json($result->decoded_content) 
     if $result->is_success; 

否則報告錯誤。使用die可能會更好取決於你的腳本:

print "Error calling $method with ". 
     ($req->content // 'no body').":\n". 
     $result->as_string; 
} 

發行不帶任何參數的GET請求,並顯示Perl的結構返回:

print Dumper(api('GET')); 

問題帶有參數的PUT請求:

print Dumper(
    api('PUT' => 'end_at=2017-05-28T04:00:00Z'); 
); 

該腳本與上述CURL方法相比幾乎沒有什麼區別:

  • 它確實錯誤處理
  • 它不依賴於外部工具

如果您的REST API使用HTTP狀態代碼回覆500或404,你的腳本會忽略這一點,要求視爲成功的。該腳本會轉儲完整的HTTP響應。您可能需要通過閱讀$result->code來採取不同的HTTP代碼。

如果您沒有收到錯誤,但仍然沒有任何反應:嘗試對return parse_json(...) if $result->success發表評論以查看完整的HTTP響應。也許你從標題值中得到一個提示或者看到一些內容。

Canvas API documentation狀態:

POST和PUT請求還可以任選JSON格式 格式發送。

您可能要切換到JSON module可能在同一時間做from_jsonto_json

我沒有找到任何關於他們錯誤處理API文檔的信息。如果有疑問,嘗試生成一個錯誤(如使用無效的ID或查詢具有無效參數的GET API)以瞭解他們的錯誤如何。

嘗試另一次寫入(PUT)操作來查看您的問題是否與您的示例相關。

+0

謝謝,請您詳細說明:「my($ method,$ args)= @_;」 。請你告訴你的方法是什麼,你試圖通過你的代碼的論點是什麼。 –

+0

對答案添加了評論。 '$ method'是HTTP方法,'$ args'是參數(如果有的話)。 – Sebastian