2017-09-17 7 views
1

私は要求とJSONを扱うことを学んでいるので、私は頻繁に使用するアプリのAPIを使用することに決めました。私は正常に認証コードとアクセストークンを受信するための要求を作ったので、私はこのような要求にコンテンツを取得することができます。Pythonのリクエストで単一のパラメータ値としてのJSON配列

requests.post('https://getpocket.com/v3/get', 
       data = {'consumer_key' : consumer_key, 
         'access_token' : access_token, 
         'detailType' : 'simple', 
           'count' : '50'}) 

しかし、私はエントリを変更したい場合、私はdoesnの同様の要求を構築します何らかの理由で」トンの仕事:

https://getpocket.com/v3/send?actions=[{"action":"archive","time":1348853312,"item_id":229279689}]&access_token=ACCESS_TOKEN&consumer_key=CONSUMER_KEY 

私はエラーを取得する「400 B:

requests.post('https://getpocket.com/v3/send', 
       data = {'consumer_key' : consumer_key, 
         'access_token' : access_token, 
          'actions' : [{'item_id':'1000000000','action':'archive'}]}) 

API guideは、次の有効な例を(私は、視認性のためにそれをデコード)示唆します広告リクエスト "と表示され、ヘッダーの1つが「無効なリクエストです。APIドキュメントを参照してください。

文法に間違いがありますか?

+0

どういうところですか? – Glycerine

+0

ああ、正しく、投稿を更新しました。 – Sam

+0

'data'引数はPython辞書をJSONエンコードしません。そのためには 'json'引数が必要です。 – chepner

答えて

1

私はあなたがrequestsライブラリを使用している参照してください。バージョン2.4.2以降では、パラメータとしてjsonを使用できます。それはdataよりも良いjsonエンコーディングを持つべきです。

requests.post('https://getpocket.com/v3/send', json={ 
    'consumer_key': consumer_key, 
    'access_token': access_token, 
    'actions': [{ 
     'item_id':'1000000000', 
     'action':'archive' 
    }] 
}) 

詳細についてはこちらをご覧ください:http://docs.python-requests.org/en/master/user/quickstart/#more-complicated-post-requests

EDIT:のみactionキーはJSON文字列でなければなりませんならば、あなたは次のことを試すことができます。

import simplejson as json 

requests.post('https://getpocket.com/v3/send', data={ 
     'consumer_key': consumer_key, 
     'access_token': access_token, 
     'actions': json.dumps([{ 
      'item_id':'1000000000', 
      'action':'archive' 
     }]) 
    }) 

私のようにsimplejsonjson以上のパッケージをお勧めしますより頻繁に更新されます。あなたの例から

+0

実際には3つのURLパラメータのうちの1つだけがJSON文字列であると思われます。 – chepner

+0

@chepnerはそれに気付かなかった。それを反映するようにコメントを編集します。 – BluePat

+0

それはちょうどうまくいった!私は単純に両方のスニペットをコピーして貼り付け、両方ともGETとPOSTの両方でうまくいきます。私は問題がjsonエンコーディングだと思っています。@chepnerが提案したように解決策に近づいていましたが、アクションリストの括弧が欠けていたことを逃しました。 – Sam

0

APIにはURLにパラメータが必要ですが、投稿本体に送信しているようです。

あなたはURL辞書エンコードする必要があります。

from urllib.parse import urlencode 

data = { 
     'consumer_key' : consumer_key, 
     'access_token' : access_token, 
     'actions' : [{'item_id':'1000000000','action':'archive' 
     } 
requests.post('https://getpocket.com/v3/send/?' + urlencode(data)) 
+0

ヒントをお寄せいただきありがとうございます。POSTのみの要件はAPI全体であることに留意しましたが、Auth全体のものでした。 – Sam

+0

'/ get /'エンドポイントは非常に異なる振る舞いをしているので、このAPIの仕組みはかなり奇妙です。 とにかく、それはあなたのために働いた? –

+0

POSTをGETに変更した後、APIキーが見つからないというエラーが表示されました。これはエンコーディングの問題を意味する可能性があります。最後に、エンコーディングを使用して、必要なURLを取得するように提案しました(私のIDEは使用されているURLをほぼ正確に示しています)。しかし、私はまだエラーが発生します。私はポケットの例と混同しています - それはキーとトークンが角括弧内にあることを示しています... – Sam

1

:我々は3 URLエンコードされたパラメータがある参照

https://getpocket.com/v3/send?\ 
    actions=[{"action":"archive","time":1348853312,"item_id":229279689}]&\ 
    access_token=ACCESS_TOKEN&\ 
    consumer_key=CONSUMER_KEY 

、唯一(actions)どののは、JSON値です。あなたは何かを使用する必要があります

actions = { 
    "action": "archive", 
    "time": "1348853312", 
    "item_id": "229279689" 
} 
requests.post("https://getpocket.com/v3/send", 
       data={ 
        "actions": json.dumps(actions), 
        "access_token": access_token, 
        "consumer_key": consumer_key 
       }) 
+0

あなたの提案に感謝、私は500の内部サーバーエラーを取得し、私はまた、アクションdictを作成した後にデータをurlencodeを実行しようとしましたが、成功しませんでした。 – Sam

+0

ドキュメントを見ると、 'item_id'と' time'の両方が数字ではなくJSON文字列である必要があります。 – chepner

+0

私は近くにいたので、@ BluePatソリューションをチェックしてください。 – Sam

関連する問題