2016-11-27 23 views
2

私はjQueryのアヤックス()関数を経由してAPIを呼び出すには、以下のURLを作成する必要があります。私はちょうど自分自身で文字列を一緒に置くことによって、これを形成する方法を知っているが、それはのように思えるjQueryの.ajax()メソッドを使用して、GETリクエストにスラッシュを含むパラメータを送信するにはどうすればよいですか?

https://www.airnowapi.org/aq/forecast/zipCode/?format=application/json&zipCode=02144&date=2016-11-26&distance=25&API_KEY=API_KEY

不要な回避策を使用して.ajax()を使用することはできません。私はこの機能が私のためにやるべきことをたくさん手作業で行う必要があります。

この問題はformat=application/jsonです。これを設定オブジェクトのパラメータとして渡すと.ajax()に渡されるため、スラッシュは%2Fにエスケープされ、APIは要求を受け入れないためです。私はformatパラメータを省略してみましたが、500サーバエラーが発生します。私のウェブブラウザに入力すれば要求は完全に動作しますが、このパラメータがないか、スラッシュ(エスケープできません)が含まれていない場合は要求されません。 .ajax()がスラッシュをこのようにエンコードするのを防ぐか、APIサーバーに到達する前に何らかの形でデコードする必要があります。

私は既にGoogleとStackOverflowを検索して回答していますが、運がありません。私はエスケープ文字のエンコードとデコード方法を理解していますが、私が書かなかったjQuery関数の中でそれを傍受することはできません。 jQueryのソースコードに基づいて、その関数を書き直そうとしない限り、単純な問題の大きな回避策のように見えます。参考のために、ここに私のコードの関連部分は次のとおりです。

function getData(query, callback) { 
    var settings = { 
     url: state.apis.airNow.BASE_URL, 
     dataType: 'json', 
     type: 'GET', 
     success: callback, 
     data: { 
      format: "application/json", 
      zipCode: query, 
      distance: 25, 
      API_KEY: state.apis.airNow.API_KEY 
     } 
    }; 
    $.ajax(settings); 
} 

は、どのように私はAPIが期待する正確な形式でformat=application/jsonを提出する.ajax()を得るか、または私が代わりに使用されなければならない他の同様の機能はありますか?

ありがとうございました!

+0

です。問題は、 '$ .ajax() 'data'オブジェクトをurlに追加するクエリ文字列に変換します。どちらがうまくいくのか... URLエンコーディングがそのAPIで飛んでいないという点を除いて設定オブジェクトの 'url'パラメータを変更して、クエリのフォーマット部分を含めることができますか? 'url:state.apis.airNow.BASE_URL + '?format = application/json'のようなもの? – SimianAngel

+0

@SimianAngel、私はそれについて考えましたが、 '$ .ajax()'が残りの設定をエンコードしなければならない場合は、別の '?'最初のパラメータの後にしかし、私はそれを以下の@Brianの答えによって解決することができるはずです。私はそれを試してすぐにupvoteに応答し、それが動作することを確認します! – Rosensweig

答えて

0

processData:falseを使用し、手動でクエリ文字列を作成します。私のmakeQS関数は、現在の状態のネストしたオブジェクトや配列を処理しないことに注意してください。あなたがあなたの代わりに、URLにそれらを渡したい場合は

function makeQS(obj){ 
    var params = []; 
    for(var key in obj){ 
     params.push(key + '=' + obj[key]); 
    } 
    return params.join('&'); 
} 


function getData(query, callback) { 
    var settings = { 
     url: state.apis.airNow.BASE_URL, 
     dataType: 'json', 
     type: 'GET', 
     success: callback, 
     processData: false, 
     data: makeQS({ 
      format: "application/json", 
      zipCode: query, 
      distance: 25, 
      API_KEY: state.apis.airNow.API_KEY 
     }) 
    }; 
    $.ajax(settings); 
} 

:このほかに唯一のオプションは、URL上のparamsを渡すか、AJAX要求をインターセプトし、URLに

PROCESSDATAソリューションを変更することですまた、おそらく全くエンコーディングがどの内&と=のような文字のパラメータに行われないようことは注目に値します

settings.url = state.apis.airNow.BASE_URL + '?' + makeQS({ 
      format: "application/json", 
      zipCode: query, 
      distance: 25, 
      API_KEY: state.apis.airNow.API_KEY 
     }) 

:だけのようなものにsettings.urlを変えることができますAPIエンドポイントから予期しない動作が発生する可能性があります。このようなエンドポイントで一般にURIエンコードされたGETパラメータを使用する理由の1つは

+0

ありがとう、@ブライアン。私のサイトは現在、適切なクエリ文字列とURLを送信しています。 APIは依然としてリクエストを受け付けていません - 興味深いことに、投稿されたURLをカットアンドペーストしてブラウザに貼り付けると、期待されるJSONオブジェクトが返されます.JavaScriptを通過するときではありませんが、私がここで尋ねたものからの問題です。だから、もう一度ここに誰かを気にさせる前に、ちょっとハックしてしまいます。 – Rosensweig

+0

Chromesのネットワークタブを使用して、2つのリクエストを比較して、ブラウザで問題を解決できない場合は、別のツール/言語を使用してリクエストを生成してみてください(curl、wgetまたはmaybeノードまたはPHPスクリプトがこのトリックを行う可能性があります)。唯一の他の考え方は、API仕様に含まれていてもしなくてもよい他のヘッダーやフィールドの概要か、エラーがトラブルシューティングに役立つ情報を提供しているかどうかです。 – Brian

+0

FYI、私は前の投稿以来この2番目の問題を解決しました。最初のものとは関係ありませんでしたが、明らかにAPIはCORS(ドキュメントのどこにも指定されていません)をサポートしていないため、バックエンドプロキシから要求を送信しなければなりませんでした。それはすべて今働いている。あなたの助けに感謝、ブライアン! – Rosensweig

関連する問題