2016-09-26 5 views
0

を応答オブジェクトをお読みください。POSTのPerlで要求し、次のPerlで正確な同等性を記述しようとダンサールート内

Perlで未経験
curl -H "Content-Type: application/json" -X POST -d '{"user": { "uid":"13453"},"access_token":"3428D3194353750548196BA3FD83E58474E26B8B9"}' https://platform.gethealth.io/v1/health/account/user/ 

が、これは私が試したものです:

use HTTP::Request::Common; 
use LWP::UserAgent; 

get '/gethealthadduser/:id' => sub { 
    my $ua = LWP::UserAgent->new; 
    $ua->request(POST 'https://platform.gethealth.io/v1/health/account/user', [{"user": { "uid":param("id")},"access_token":config->{gethealthtoken}}]); 
}; 
+0

エラーなしが、私は唯一のネットワークコンソール上(GET/gethealthadduser)ダンサールートへの呼び出しではなく、ポストの要求を参照してください –

+1

"ネットワークコンソール" - ブラウザの開発者ツールの意味ですか?これはPerlからサーバーに行われているので、ブラウザーは関与していないので、ブラウザーがそれを知る必要はありません。 – Quentin

+0

ありがとう、良い点:p –

答えて

1

ダンサーと一緒に作業している、または既存のアプリケーションに何かを追加しようとしています。その目的は、POSTリクエストをAPIの背後にある別のサービスに隠すことです。

あなたのカールの例では、コンテンツタイプはapplication/jsonですが、あなたのPerlコードではフォームを送信しています。それはおそらくContent-Type application/x-www-form-urlencodedになるでしょう。サーバーが望むものではないかもしれません。

さらに、配列参照としてフォームデータを渡していたので、POSTはヘッダーとみなされました。それはあなたが望むものではありません。

カールと同じことをするには、もう少しステップが必要です。

  • データをJSONに変換する必要があります。幸いにもダンサーはそれを簡単に行うa nice DSL keyword to_jsonをもたらします。
  • 適切なContent-Typeヘッダーを使用するようにLWP :: UserAgentに指示する必要があります。それはapplication/jsonであり、リクエストレベルで設定することも、ユーザーエージェントオブジェクトのデフォルトとして設定することもできます。私は前者をやる。
  • さらに、ダンサーアプリにキーワードをインポートするためにHTTP :: Request :: Commonを使用しないことをお勧めします。 GETPOSTなどは大文字でダンサーDSLは小文字のgetpostですが、まだ混乱しています。代わりにHTTP::Requestを明示的に使用してください。

ここに最終的なことがあります。

use LWP::UserAgent; 
use HTTP::Request; 

get '/gethealthadduser/:id' => sub { 
    my $ua = LWP::UserAgent->new; 
    my $req = HTTP::Request->new(
     POST => 'https://platform.gethealth.io/v1/health/account/user', 
     [ 'Content-Type' => 'application/json' ],         # headers 
     to_json { user => param("id"), access_token => config->{gethealthtoken} }, # content 
    ); 

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

    # log the call with log level debug 
    debug sprintf('Posted to gethealth.io with user %s and got a %s back.', 
     param('id'), 
     $res->status_line 
    ); 

    # do things with $res 
}; 
+1

@simbabqueに感謝します。リクエストは送信されていますが、私は301レスポンスを取得しています。カールポストがパラメータを '{" user ":" 13453 "}、" access_token ":" 3428D3194353750548196BA3FD83E58474E26B8B9 "}' –

+1

として渡すので、それが考えられます。 '\' ... \ ''を使用して、コメントのコード。 '' '文字はバックティックと呼ばれ、USキーボードの' 1'キーの左側にあります。あなたがそれを投稿した方法は分かりません。引用や物事はここで重要です。私が何を話しているのかわからない場合は、マークダウンのヘルプを参照してください。 ;) – simbabque

+0

@Axあなたはリダイレクトを受け取りますか?それはおそらく良いです。新しいユーザーオブジェクトのURLにリダイレクトされる可能性があります。 CurlはJSON文字列をリクエスト本体に入れます。とにかく3xx応答コードはエラーではありません。 – simbabque

1

HTTP :: Tiny(CPANに搭載されています)を試してみてください。 IMHO、LWP :: UserAgentよりはるかにクリーンなモジュールですが、後者ははるかに一般的です。

use HTTP::Tiny 0.064; # use a recent version or better 

my $url = 'https://api.somewhere.com/api/users'; 
my $data = { 
    first_name => "joe", 
    last_name => "blow" 
    }; 
my $method = 'POST'; 


my $default_headers = { 
    'Authorization' => "Bearer ".$token, # if needed 
    'Accept' => 'application/json' 
    }; 

my $tiny = HTTP::Tiny->new(
    agent => 'mywebsite.com', 
    default_headers => $default_headers, 
    timeout => 30 
); 

my $response; 
if (($method eq 'POST') || ($method eq 'PUT')) { 
    $response = $tiny->request($method, $url, { 
    headers => { 
     'Content-Type' => 'application/json' 
     }, 
    content => &toJSON($data) 
    }); 
    } 
else { 
    if ($data) { 
    die "data cannot be included with method $method"; } 
    $response = $tiny->request($method, $url); 
    } 

die unless $response->{'success'}; 

幸運プロジェクトで:

ここで、箱から出して動作する必要のあるいくつかのコードです!ここで

0

が投稿されたパラメータの正しい形式と構造を持つソリューションです:

get '/api/gethealthadduser/:id' => sub { 
    my %user = (
     uid => param("id") 
    ); 
    # my $user = { 
    #  uid => param("id") 
    # }; 

    my $ua = LWP::UserAgent->new; 
    my $req = HTTP::Request->new(
     POST => 'https://platform.gethealth.io/v1/health/account/user/', 
     [ 'Content-Type' => 'application/json' ],         # headers 
     JSON::to_json({ user => \%user, access_token => config->{gethealthtoken} }) # content 
    ); 
    my $res = $ua->request($req); 
    print STDERR Dumper($res); 
    $res; 
}; 
+0

@simbabqueあなたの解決策の上にいくつかのマイナーな修正があります: 'to_json {' => 'JSON :: to_json({'、 'my%user'のparam構造体と'/'で終わる'あなたの答え、もう一度ありがとう –

関連する問題