質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

91.05%

  • PHP

    17255questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • Swift

    5906questions

    Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

POST通信をした時にPHP側で値が空になる

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 209

tarofess

score 112

現在以下のようにパラメーターと共にPOST通信を行なっています。

        let parameters: [String:Any] = [
            "Diary": [
                "ID": diary.id,
                "Title": diary.title,
                "Content": diary.content,
                "XTime": diary.xtime,
                "IsShared": diary.isShare
            ]]

        var request = URLRequest(url: url!)
        request.httpMethod = "POST"
        request.timeoutInterval = 10
        request.httpBody = try! JSONSerialization.data(withJSONObject: parameters, options: .prettyPrinted)
        let task = URLSession.shared.dataTask(with: request) { data, response, error in


そしてPHP側は以下のようになっています。

  $json = file_get_contents('php://input');
  $data = json_decode($json, true);
  var_dump($json);


しかし実際にブラウザには以下のように表示されてしまっています。

string(0) "" 

なぜPHP側で値が受け取れていないのでしょうか。
どなたか分かる方がいれば教えていただきたいです。よろしくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • asahina1979

    2018/01/03 14:44

    json_decode じゃなく json_encode をつかってるのになにかいみがあるんだろうか

    キャンセル

  • tarofess

    2018/01/03 14:49

    いえ、特に意味はありませんでした。しかし試しにjson_decodeでやってみると、エラーメッセージは消えたのですが、echoでは""と出力されました。

    キャンセル

  • kei344

    2018/01/03 16:57

    回答が付いた質問の編集は慎重に行ってください。質問文のコードについて回答にて指摘があった場合は「追記」し、元のコードを編集する場合も「直したこと」がわかるようにしてください。

    キャンセル

回答 2

+1

<?php
ini_set('display_errors', true);
error_reporting(E_ALL);

$post = filter_input_array(INPUT_POST);
$json = json_encode($post);

header('Content-type: application/json');
echo $json;

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/03 14:41

    ご回答ありがとうございます。
    PHPをご提示のコードに変更したのですが、ブラウザにはnullと表示されました。
    Swift側のコードが間違っているのでしょうか?

    キャンセル

  • 2018/01/03 14:42

    そう言うことでしょうな

    キャンセル

checkベストアンサー

0

クライアントのSwift側の問題かと思いますが、情報が足りないので、動くものを置いておきます。
Content-Typeの付与は必須ではありません。httpbin.orgJSONとして認識してもらうために付けています。

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        guard let urlString = URL(string: "https://httpbin.org/post") else {
            return
        }

        let parameters: [String:Any] = [
            "Diary": [
                "ID": 1,
                "Title": "hoge",
                "Content": "fuga",
                "XTime": "2018/01/03 12:34:56",
                "IsShared": "no"
            ]]

        var request = URLRequest(url: urlString)
        request.httpMethod = "POST"
        request.timeoutInterval = 10
        request.addValue("application/json", forHTTPHeaderField: "Content-Type")

        do {
            request.httpBody = try JSONSerialization.data(withJSONObject: parameters, options: .prettyPrinted)
        } catch {
            print(error)
        }

        let task = URLSession.shared.dataTask(with: request, completionHandler: {data, response, error in

            if let data = data, let response = response {
                print(String(data: data, encoding: .utf8))
//                print(response)
                do {
                    let json = try JSONSerialization.jsonObject(with: data, options: .allowFragments)
                    print(json)
                } catch {
                    print(error)
                }
            } else {
                print(error ?? "error")
            }
        })
        task.resume()

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}

httpbin.orgからのレスポンス

{
    args =     {
    };
    data = "{\n  \"Diary\" : {\n    \"ID\" : 1,\n    \"Title\" : \"hoge\",\n    \"Content\" : \"fuga\",\n    \"IsShared\" : \"no\",\n    \"XTime\" : \"2018\\/01\\/03 12:34:56\"\n  }\n}";
    files =     {
    };
    form =     {
    };
    headers =     {
        Accept = "*/*";
        "Accept-Encoding" = "br, gzip, deflate";
        "Accept-Language" = "en-us";
        Connection = close;
        "Content-Length" = 142;
        "Content-Type" = "application/json";
        Host = "httpbin.org";
        "User-Agent" = "Size/1 CFNetwork/893.14 Darwin/16.7.0";
    };
    json =     {
        Diary =         {
            Content = fuga;
            ID = 1;
            IsShared = no;
            Title = hoge;
            XTime = "2018/01/03 12:34:56";
        };
    };
    origin = "123.456.789.012";
    url = "https://httpbin.org/post";
}

AWS Cloud9でのテスト
POSTされたものをそのまま打ち返します。

<?php
ini_set('display_errors', true);
error_reporting(E_ALL);

$json = file_get_contents('php://input');
header('Content-Type: application/json');
echo $json;

レスポンス

{
    Diary =     {
        Content = fuga;
        ID = 1;
        IsShared = no;
        Title = hoge;
        XTime = "2018/01/03 12:34:56";
    };
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/03 21:32

    ご回答ありがとうございます。httpbin.orgにpost通信を行なってみるときちんと値が返ってきていました。ブラウザにはエラーが表示されていたのに、実際は値を受け取ることができていたようです。あまりスッキリしないのですが、一応期待していた動作を行うことはできました。ありがとうございました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 91.05%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • PHP

    17255questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • Swift

    5906questions

    Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています