【问题标题】:Parsing Request, PHP/Laravel解析请求,PHP/Laravel
【发布时间】:2020-12-29 20:46:51
【问题描述】:

该接口用于门禁设备上报人员通行记录,经我(第三方平台)调用该接口给人脸识别终端或人脸识别门禁终端。

调用方向:

人脸识别终端或人脸识别门禁终端向第三方平台调用API。

请求描述:

请求方式:POST 请求网址:/LAPI/V1.0/System/Event/Notification/PersonVerification 内容类型:text/plain

请求示例:

{
    "Reference": "204.2.1.20:5118/LAPI/V1.0/System/Event/Subscription/0",
"Seq": 5, 
"DeviceCode": "210235C3R13202000093",
    "Timestamp": 1564735558, 
    "NotificationType": 1, 
    "FaceInfoNum": 1, 
    "FaceInfoList": [
        {
            "ID": 5, 
            "Timestamp": 1564707615, 
            "CapSrc": 1, 
            "FeatureNum": 0, 
            "FeatureList": [
                {
                    "FeatureVersion": "", 
                    "Feature": ""
                }, 
                {
                    "FeatureVersion": "", 
                    "Feature": ""
                }
            ], 
            “Temperature”: 36.5,
            “MaskFlag”: 1,
            "PanoImage": {
                "Name": "1564707615_1_86.jpg", 
                "Size": 101780, 
                "Data": "…"
            }, 
            "FaceImage": {
                "Name": "1564707615_2_86.jpg", 
                "Size": 35528, 
                "Data": "…"
            }, 
            "FaceArea": {
                "LeftTopX": 4981, 
                "LeftTopY": 3744, 
                "RightBottomX": 8250, 
                "RightBottomY": 5583
            }
        }
    ], 
    "CardInfoNum": 0, 
    "CardInfoList": [ ], 
    "GateInfoNum": 0, 
    "GateInfoList": [ ], 
    "LibMatInfoNum": 1, 
    "LibMatInfoList": [
        {
            "ID": 5, 
            "LibID": 3, 
            "LibType": 4, 
            "MatchStatus": 2, 
            "MatchPersonID": 0, 
            "MatchFaceID": 0, 
            "MatchPersonInfo": {
                "PersonName": "", 
                "Gender": 0, 
                "CardID": "", 
                "IdentityNo": ""
            }
        }
    ]
}

我正在使用 Laravel,尝试 $request->all() 时得到 [],下面是 dump( $request->getContent() ); dump

似乎我需要从请求的开头和结尾删除 "" 以便 json_decode(),但无论我使用什么字符串函数 - preg_replace、子字符串等 - 当我尝试 $content[0 时,没有任何改变] 我得到了{ 而不是",$content[-1] 我得到了\n,$content[-2] 我得到了}

谁能指出我错在哪里?

【问题讨论】:

  • Welcome to SO ... 如果这应该是 JSON,为什么它以文本/纯文本的内容类型发送?
  • “当我尝试 $content[0] 我得到 { 而不是 ", $content[-1] 我得到 \n, $content[-2] 我得到 }” i> - 听起来你的内容 实际上只是 JSON,而那些双引号实际上并不是它的一部分。
  • “我在尝试 $request->all() 时得到了 []” - 这是因为请求内容类型是 text/plain。字面意思是,这是没有任何定义的结构或固有含义的任意字符数据 - 因此 尝试 自动将其解析为任何内容,一开始没有多大意义。
  • 我无法控制它是如何从第三方设备发送的,但我需要解析它
  • @rif 你可以在你的请求中使用 Content-Type: application/json 而不是 Content-Type: text/plain 吗?另外,这可能会有所帮助laravel.com/docs/7.x/http-client

标签: php json laravel string-parsing


【解决方案1】:

看起来这是Content-Type 标头问题。但这应该是一个适当的解决方案:

  $find = ['/"""/', '/\\\n/', '/“/', '/”/'];
  $replace = ['', '', '"', '"'];

  $output = preg_replace($find, $replace, $your_input);

  // now the $output is ready to be decoded
  $decoded = json_decode($output);
  $v = var_dump($decoded); 

查看此 Repl 以了解实际实现:Json Parse

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-18
    • 1970-01-01
    • 2012-01-13
    • 1970-01-01
    • 1970-01-01
    • 2019-08-18
    • 2019-05-03
    相关资源
    最近更新 更多