文件

§處理和提供 XML 請求

§處理 XML 請求

XML 要求是使用有效 XML 酬載作為要求主體的 HTTP 要求。它必須在其 Content-Type 標頭中指定 application/xmltext/xml MIME 類型。

預設情況下,Action 使用任何內容主體剖析器,它讓您能以 XML(實際上是 NodeSeq)檢索主體

def sayHello = Action { request =>
  request.body.asXml
    .map { xml =>
      (xml \\ "name" headOption)
      .map(_.text)
      .map { name => Ok("Hello " + name) }
      .getOrElse {
        BadRequest("Missing parameter [name]")
      }
    }
    .getOrElse {
      BadRequest("Expecting Xml data")
    }
}

指定我們自己的 BodyParser 以要求 Play 直接將內容主體剖析為 XML 會更好(也更簡單)

def sayHello = Action(parse.xml) { request =>
  (request.body \\ "name" headOption)
  .map(_.text)
  .map { name => Ok("Hello " + name) }
  .getOrElse {
    BadRequest("Missing parameter [name]")
  }
}

注意:使用 XML 主體剖析器時,request.body 值直接是有效的 NodeSeq

您可以從命令列使用 cURL 測試它

curl 
  --header "Content-type: application/xml" 
  --request POST 
  --data '<name>Guillaume</name>' 
  https://127.0.0.1:9000/sayHello

它會回覆

HTTP/1.1 200 OK
Content-Type: text/plain; charset=utf-8
Content-Length: 15

Hello Guillaume

§提供 XML 回應

在我們之前的範例中,我們處理 XML 要求,但我們回覆 text/plain 回應。讓我們改變它,以傳回有效的 XML HTTP 回應

def sayHello = Action(parse.xml) { request =>
  (request.body \\ "name" headOption)
  .map(_.text)
  .map { name =>
    Ok(<message status="OK">Hello
        {name}
      </message>)
  }
  .getOrElse {
    BadRequest(<message status="KO">Missing parameter [name]</message>)
  }
}

現在它會回覆

HTTP/1.1 200 OK
Content-Type: application/xml; charset=utf-8
Content-Length: 46

<message status="OK">Hello Guillaume</message>

接下來:處理檔案上傳


在這個文件中發現錯誤了嗎?此頁面的原始碼可以在 這裡 找到。在閱讀 文件指南 後,請隨時提出拉取請求。有問題或建議要分享嗎?前往 我們的社群論壇 與社群展開對話。