2016-05-18 33 views
0

私はaiohttp(とasyncio)を使ってPOSTリクエストをPHPアプリケーションに送信しています。 Pythonでjsonのヘッダを設定すると、PHPアプリケーションは$ _POSTデータを受け取りません(PHPにはContent-Type: application/jsonヘッダーが設定されています)。投稿とJWSでJSONデータを送信

PHP側コードはjson_encode($_POST)を返します。

#!/usr/bin/env python3 
import asyncio 
import simplejson as json 
from aiohttp import ClientSession 
from aiohttp import Timeout 

h = {'Content-Type': 'application/json'} 
url = "https://url.php" 
d = {'some': 'data'} 
d = json.dumps(d) 
# send JWS cookie 
cookies = dict(sessionID='my-valid-jws') 


async def send_post(): 
    with Timeout(5): 
     async with ClientSession(cookies=cookies, headers=h) as session: 
      async with session.post(url, data=d) as response: 
       if (response.status == 200): 
        response = await response.json() 
        print(response) 


loop = asyncio.get_event_loop() 
loop.run_until_complete(send_post()) 

これを実行している私が得た:[]

ヘッダのparamとjson.dump(d)を取り除く私が取得:{"some:"data"}

答えて

0

PHPはデフォルトでapplication/jsonを理解することはありません、あなたは一般的に、それを自分で実装する必要があります

if (isset($_SERVER["HTTP_CONTENT_TYPE"]) && 
    strncmp($_SERVER["HTTP_CONTENT_TYPE"], "application/json", strlen("application/json")) === 0) 
{ 
    $_POST = json_decode(file_get_contents("php://input"), TRUE); 
    if ($_POST === NULL) /* By default PHP never gives NULL in $_POST */ 
     $_POST = []; /* So let's not change old habits. */ 
} 

PHPの「一般的な読み込みパス」ではコード。

+0

ヘッダーを設定しています。コードはhttps://github.com/edoz90/SimpleRest/blob/master/lib/Rest.inc.phpにあります。 私はどのようにお勧めしますか試してみます。 – edoz90

+0

はい、私のスニペットが正常に動作するためには 'Content-Type'ヘッダとして' application/json'を設定することが必須です: "jsonの場合、解読してください" –

+0

strncmpは、 if stnncmp(....)== 0 – edoz90

関連する問題