이 상황에서는 항상 인터페이스를 먼저 생각한 다음 지원하기 위해 PHP 코드를 작성하십시오.
- REST API이므로 의미있는 HTTP 상태 코드는 필수입니다.
- 클라이언트와 일관되고 유연한 데이터 구조를 보내고 싶습니다.
잘못 될 수있는 모든 것과 HTTP 상태 코드를 생각해 봅시다 :
- 서버에서 오류가 발생 함 (500)
- 인증 실패 (401)
- 요청한 자원을 찾을 수 없습니다 (404).
- 수정 한 데이터가로드 된 후 변경되었습니다 (409)
- 데이터 저장시 유효성 검사 오류 (422)
- 클라이언트가 요청 비율을 초과했습니다 (429)
- 지원되지 않는 파일 형식 (415)
나중에 조사 할 수있는 다른 것들도 있습니다.
대부분의 실패 조건에 대해 하나의 오류 메시지 만 리턴됩니다. 422 Unprocessable Entity
나는 "유효성 검사 오류"를 사용했습니다 반응은 하나 이상의 오류 --- 양식 필드 당 하나 이상의 오류를 반환 할 수 있습니다.
오류 응답을위한 유연한 데이터 구조가 필요합니다.
예를 들어 가지고는 500 Internal Server Error
:
HTTP/1.1 500 Internal Server Error
Content-Type: text/json
Date: Fri, 16 Jan 2015 17:44:25 GMT
... other headers omitted ...
{
"errors": {
"general": [
"Something went catastrophically wrong on the server! BWOOP! BWOOP! BWOOP!"
]
}
}
서버에 무언가를 게시하려고 할 때 간단한 유효성 검사 오류와 대조하십시오.
HTTP/1.1 422 Unprocessable Entity
Content-Type: text/json
Date: Fri, 16 Jan 2015 17:44:25 GMT
... other headers omitted ...
{
"errors": {
"first_name": [
"is required"
],
"telephone": [
"should not exceed 12 characters",
"is not in the correct format"
]
}
}
여기서 핵심은 컨텐츠 유형 text/json
입니다. 이를 통해 클라이언트 애플리케이션은 JSON 디코더로 응답 본문을 디코딩 할 수 있습니다. 예를 들어 내부 서버 오류가 발생하지 않고 일반 "문제가 발생했습니다"웹 페이지가 대신 전달되는 경우 text/html; charset=utf-8
클라이언트 응용 프로그램이 응답 본문을 JSON으로 디코딩하지 않도록 콘텐츠 유형이되어야합니다 .
이것은 JSONP 응답 을 지원해야 할 때까지 모두 찾고 멋지게 보입니다 . 200 OK
실패하더라도 응답을 반환해야합니다 . 이 경우 클라이언트가 JSONP 응답을 요청하고 있음을 감지하고 (보통이라는 URL 요청 매개 변수를 감지하여 callback
) 데이터 구조를 약간 변경해야합니다.
(GET / posts / 123? callback = displayBlogPost)
<script type="text/javascript" src="/posts/123?callback=displayBlogPost"></script>
HTTP/1.1 200 OK
Content-Type: text/javascript
Date: Fri, 16 Jan 2015 17:44:25 GMT
... other headers omitted ...
displayBlogPost({
"status": 500,
"data": {
"errors": {
"general": [
"Something went catastrophically wrong on the server! BWOOP! BWOOP! BWOOP!"
]
}
}
});
그런 다음 클라이언트의 웹 브라우저에서 응답 처리기 displayBlogPost
는 단일 인수를 허용하는 전역 JavaScript 함수를 가져야합니다 . 이 함수는 응답이 성공적인지 확인해야합니다.
function displayBlogPost(response) {
if (response.status == 500) {
alert(response.data.errors.general[0]);
}
}
그래서 우리는 고객을 돌 보았습니다. 이제 서버를 관리하겠습니다.
<?php
class ResponseError
{
const STATUS_INTERNAL_SERVER_ERROR = 500;
const STATUS_UNPROCESSABLE_ENTITY = 422;
private $status;
private $messages;
public function ResponseError($status, $message = null)
{
$this->status = $status;
if (isset($message)) {
$this->messages = array(
'general' => array($message)
);
} else {
$this->messages = array();
}
}
public function addMessage($key, $message)
{
if (!isset($message)) {
$message = $key;
$key = 'general';
}
if (!isset($this->messages[$key])) {
$this->messages[$key] = array();
}
$this->messages[$key][] = $message;
}
public function getMessages()
{
return $this->messages;
}
public function getStatus()
{
return $this->status;
}
}
그리고 서버 오류가 발생했을 때 이것을 사용하려면 :
try {
// some code that throws an exception
}
catch (Exception $ex) {
return new ResponseError(ResponseError::STATUS_INTERNAL_SERVER_ERROR, $ex->message);
}
또는 사용자 입력을 확인할 때 :
// Validate some input from the user, and it is invalid:
$response = new ResponseError(ResponseError::STATUS_UNPROCESSABLE_ENTITY);
$response->addMessage('first_name', 'is required');
$response->addMessage('telephone', 'should not exceed 12 characters');
$response->addMessage('telephone', 'is not in the correct format');
return $response;
그런 다음 반환 된 응답 객체를 가져 와서 JSON으로 변환하고 즐거운 방식으로 응답을 보내는 무언가가 필요합니다.