2016-06-02 11 views
0

私はAngularの$ httpを使ってHTTP GET呼び出しをしようとしています。私は、私はこのようなURLを作成したい、

function doGETRequest(url, params) { 
     return $http({ 
     method: 'GET', 
     url: baseURL + url, 
     headers: { 
      'Authorization': 'Bearer ' + access_token 
     }, 
     params: params 
     }); 
    } 

をこのような一般的な機能を書か https://content.googleapis.com/drive/v2/about?fields=quotaBytesTotal%2CquotaBytesUsed%2CrootFolderId%2Cuserが、私は私の人生のためのクエリのparam一部を把握することはできませんしました。これまでのところ、私は次のことを試してみました:

doGETRequest('/about', {fields:'user,quotaBytesTotal,quotaBytesUsed,rootFolderId'}) 


doGETRequest('/about', {fields:['user','quotaBytesTotal','quotaBytesUsed','rootFolderId']}) 


doGETRequest('/about', {fields:encodeURIComponent('user,quotaBytesTotal,quotaBytesUsed,rootFolderId')}) 

それは、1秒間の作業を行いますが、それはhttps://content.googleapis.com/drive/v2/about?fields=user&fields=quotaBytesTotal&fields=quotaBytesUsed&fields=rootFolderIdとしてそれを解析して、Googleはちょうど(予想通り)最初のクエリの応答を送信し、残りを無視します。

クエリのパラメータにカンマ区切りの値を渡すにはどうすればよいですか? URLでエンコードされた値を手動で記述する必要がありますか?これはparamsフィールドを持つ目的を打ち消しませんか?

+0

2番目のWebサービスで処理する必要があります – kiro112

+0

問題のWebサービスハンドラはGoogleですので、他のアイデアはありますか? – PsyGik

+0

申し訳ありませんが、あなたの予想URLは何ですか? – kiro112

答えて

0

私が行ったのと同じ問題に遭遇した人にとって、私はこれを解決する2つの方法を見つけました。

最初のは、@ kiro112がコメントで示唆したように、URLに直接パラメータを書きます。 $ httpはURLをエンコードしないので動作します。だから、コードは

doGETRequest('/about?fields='+encodeURIComponent("user,quotaBytesTotal,quotaBytesUsed,rootFolderId")) 

のようなものだろうと、私たちはdoGetRequest()方法でparams一部を取り除く必要があります。個人的には、$ httpのparams部分を持つ目的に打撃を与えるので、私はこれを気に入っていません。

第2のメソッドは、デフォルトの$httpParamSerializerをオーバーライドし、独自のものを提供しています。これを行うには、doGetRequest()方法は

。ここで何が起こる
function doGETRequest(url, params) { 
     return $http({ 
     method: 'GET', 
     url: baseURL + url, 
     headers: { 
      'Authorization': 'Bearer ' +access_token 
     }, 
     params: params, 
     paramSerializer: function (value){ 
      return Object.keys(value)+'='+encodeURIComponent(Object.values(value)); 
     } 
     }); 
    } 

、我々は角度エンコードのparamsせてはいけない、そうのように修正しなければなりません。理由を教えてください。 docs here通り、角度のみfoo=2015-04-01T09%3A50%3A49.262Z(DateオブジェクトのtoISOString()符号化表現)foo=bar&foo=baz(繰り返しキーで

  • {'foo': ['bar', 'baz']}結果を得るためにfoo=bar
  • {'foo': Date.now()}結果に

    • {'foo': 'bar'}結果、そうようなコードありません各配列要素)
    • {'foo': {'bar':'baz'}}結果はfoo=%7B%22bar%22%3A%22baz%22%7D"(オブジェクトの文字列化されエンコードされた表現)

    {'foo':['bar', 'baz']}の行に何かが必要なのに対し、foo=bar%2Cbazという結果になります。そこで、paramSerializerをオーバーライドして、独自のシリアライザを作成します。

    一般的な方法を使用する限り、第2のアプローチは私にとってははるかにクリーンです。しかし、私はまだもっと良い選択肢を探しています。

  • +0

    をご覧ください。github.com/pinoyyid/ngDrive – pinoyyid

    関連する問題