2016-04-27 14 views
0

データdrom Canvas REST APIを取得するためのコードは次のとおりです。このデータにはコースの開始日と終了日などの情報が含まれています。このend_dateを変更する必要がありますプログラムに示すように、コース.I使用は、情報を取得するためにGET:キャンバスレストパイのカールを使用してPUT命令を使用する方法

#!/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マニュアルを参照してください。

は、一度、すべての今後のリクエストに認証ヘッダを追加します。

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

は、あなたのAPIを呼び出すサブを作成します。このサブは、すべてのAPIリクエストに共通するすべてのものをマージし、エラー処理を追加することができます。

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

@_は、サブを呼び出す際に渡される引数を保持しています。 $methodは、最初の引数:GET,POST,PUTまたはその他の有効なHTTPメソッド$argsに送信する引数を含める必要があります。実際に呼び出して、API

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

実行要求:

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

結果を解析し、要求が成功した場合(HTTPステータスコードをPerlのデータ構造を返すの

リクエストオブジェクトを作成します。 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形式 形式で送信されても​​よいです。

    あなたは同時にfrom_jsonto_jsonを行うことができJSON moduleに切り替えることもできます。

    APIドキュメントのエラーハンドリングに関する情報が見つかりませんでした。不確かな場合は、エラーが発生したかどうかを確認するために、無効なIDを使用するか、無効な引数を指定してGET APIをクエリするなどのエラーを生成してみてください。

    別の書き込み(PUT)アクションを試して、問題がサンプルに関連しているかどうかを確認してください。

  • +0

    ありがとうございます。「my($ method、$ args)= @ _;あなたがあなたのコードに渡そうとしている議論とは何か、その方法とは何かを教えてください。 –

    +0

    答えにコメントを追加しました。 '$ method'はHTTPメソッドで、' $ args'は引数です(あれば)。 – Sebastian

    関連する問題