2016-04-27 92 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