2016-05-06 11 views
0

私はRestlerとnodejsでPOSTリクエストをやろうとしていると、この作品とは全くの問題を持っていない私のコードです:重複キーを含むディクショナリでnodejsでPOSTリクエストを送信するにはどうすればよいですか?

var post = function (uri, params, callback) { 
    var headers = {"User-Agent": user_agent,"Cookie": _sessionCookie} 
    rest.post(uri, { 
     data: params, 
     followRedirects: false, 
     headers: headers 
    }).on('complete', function (data, response) { 
     callback(data, response) 
    }) 
} 

私が何を見て、私のブラウザに提出しました私は以下の画像を渡すと仮定しています。しかし、私の問題は、私はmatchanswersキーの2つの値を渡す必要があります。
上記の私のコードでは、post関数の 'params'引数は辞書です。
私の質問は、どのように 'params'辞書に2つのキー(matchanswers)を追加するのですか?

matchanswers:[1,2] 

しかし、それは動作しません:
私は、彼らがような何かを言う他の記事を読みました。私はこのような辞書を投稿する際には、作業を行います。残念ながら

{ qid: '226', 
ac: 2, 
hash: null, 
subject: null, 
r1: null, 
is_public: 'on', 
submit: 1, 
answers: '1', 
matchanswers: [ 1 ], 
importance: '3' } 

enter image description here

+0

'rest.post()'はどのライブラリですか?私たちは、それが何をしているのか、それが何をサポートしているのかを見ることができる必要があります。 – jfriend00

+0

@ jfriend00 Restler https://github.com/danwrong/restler – altoids

答えて

0

を、あなたがすることはできません。ノードはオブジェクト内の一意でないキーをサポートしていません。 rest.postがオブジェクトではなく文字列を受け入れるかどうかを調べることができます。

+0

私はそれを考えていましたが、機能しません。JSON.stringifyを使用して辞書を文字列に変換し、それを 'params'の値として渡しましたが、うまくいかなかった。 – altoids

+0

あなたの辞書には一意のキーしか含めることができないので、それを文字列にすることは役に立ちません。 "key1 = value1&key2 = value2 ..."で構成される文字列を構築し、それをparamsとして渡すことができます。この文字列はurlencodeされ、application/x-www-form-urlencodedとしてサーバに送られます –

+0

私はそれを試みましたが、うまくいきませんでした。私は文字列に1つのmatchanswerを追加すると動作しますが、2つを追加してもそれはありません。 – altoids

0

restler.post()では、データをJavascriptオブジェクトまたは文字列として送信できます。 Javascriptオブジェクトの場合、restlerはそれをJSONに文字列化します。しかし、送信したいものはJavascriptオブジェクトでは指定できないため、オブジェクトを送信することはできません。代わりに、必要な重複キーを含む独自の文字列を作成する必要があります。

だから、あなたのpost()機能のために、あなたがあなたの質問に表示フォームデータを生成するのは、このタイプの構造をサポートしてみましょう:

{ 
    qid: '226', 
    ac: 2, 
    hash: null, 
    subject: null, 
    r1: null, 
    is_public: 'on', 
    submit: 1, 
    answers: '1', 
    matchanswers: [ 2, 3 ], 
    importance: '3' 
} 

この構造体のデータが配列である場合には、我々はDUPを作成します。キーはそれぞれ異なる値を持ちます。

私たちは、フォームデータ列にそれをエンコードするためのユーティリティ関数を作成します:

function makePostString(obj) { 
    var output = []; 
    var keys = Object.keys(obj); 
    keys.forEach(function(key) { 
     var base = encodeURIComponent(key) + "="; 
     var value = obj[key]; 
     if (Array.isArray(value)) { 
      value.forEach(function(item) { 
       output.push(base + encodeURIComponent(item)); 
      }); 
     } else { 
      if (value === null || value === undefined) { 
       value = ""; 
      } 
      output.push(base + encodeURIComponent(value)); 
     } 
    }); 
    return output.join("&"); 
} 

さて、あなたはこのようなあなたのpost()機能であることを使用することができます。

var post = function (uri, params, callback) { 
    var headers = {"User-Agent": user_agent,"Cookie": _sessionCookie} 
    rest.post(uri, { 
     data: makePostString(params), 
     followRedirects: false, 
     headers: headers 
    }).on('complete', function (data, response) { 
     callback(data, response) 
    }) 
} 

そして、あなたこのタイプのデータをパラメータとして渡します。

{ 
    qid: '226', 
    ac: 2, 
    hash: null, 
    subject: null, 
    r1: null, 
    is_public: 'on', 
    submit: 1, 
    answers: '1', 
    matchanswers: [ 2, 3 ], 
    importance: '3' 
} 

作業デモmakePostString()ここ:https://jsfiddle.net/jfriend00/Lurvxo2e/

+0

だから私は自分の言いたいことに自分のコードを変更して意味があります。しかし、それはまだ動作しません。 matchanswersがmatchanswer:[1,2]のときは動作しませんが、matchanswer:[1]はあなたのメソッドを使用します。 – altoids

+0

@altoids - 私はあなたのコードを実行する能力がないので、 'matchanswer:[1,2]'とpostDataは何であるべきかを示すpostDataを表示できますか?私のコードは 'matchanswer = 1&matchanswer = 2'(コード化された形式で表示)を送信することを意図していました。 – jfriend00

+0

これはmakePostStringを呼び出した後の出力例です:qid = 26841&ac = 2&hash =&件名=&r1 =&is_public = on&submit = 1&answers = 1&matchanswers = 3&matchanswers = 2&importance = 3 – altoids

関連する問題