2014-11-13 3 views
0

при инициализации HTTP DELETE запроса с содержанием типа заголовком и телом, эти два элемента является:HTTP-заголовок и тела не передаются, когда посылаются из PhantomJS

  • Ну получено, когда запрос инициируются изнутри Chrome,
  • Не получено, когда запрос инициирован из PhantomJS.

Какое из двух ведет себя по стандарту?

Следует отметить, что в обоих случаях клиент и сервер одинаковы.

Ниже приведены журналы запроса на уровне сервера.

Журнал запроса посылается из PhantomJS

SERVER: ------------------------------------------------------- 
SERVER: - R E Q U E S T          - 
SERVER: ------------------------------------------------------- 
SERVER: req.url  /test/del 
SERVER: req.method OPTIONS 
SERVER: req.headers { 'access-control-request-method': 'DELETE', 
    origin: 'http://localhost:9876', 
    'user-agent': 'Mozilla/5.0 (Unknown; Linux x86_64) AppleWebKit/534.34 (KHTML, like Gecko) PhantomJS/1.9.7 Safari/534.34', 
    referer: 'http://localhost:9876/context.html', 
    'access-control-request-headers': 'Content-Type, Accept', 
    accept: '*/*', 
    connection: 'Keep-Alive', 
    'accept-encoding': 'gzip', 
    'accept-language': 'fr-FR,en,*', 
    host: 'localhost:9009' } 
SERVER: req.query {} 
SERVER: req.body  {} 
SERVER: ------------------------------------------------------- 
SERVER: ------------------------------------------------------- 
SERVER: - R E S P O N S E          - 
SERVER: ------------------------------------------------------- 
SERVER: res.headers { 'Access-Control-Allow-Headers': 'Origin, X-Requested-With, Content-Type, Accept', 
    'Access-Control-Allow-Methods': 'PUT, DELETE', 
    'Access-Control-Allow-Origin': '*' } 
SERVER: ------------------------------------------------------- 
127.0.0.1 - - [Thu, 13 Nov 2014 16:07:08 GMT] "OPTIONS /test/del HTTP/1.1" 200 - "http://localhost:9876/context.html" "Mozilla/5.0 (Unknown; Linux x86_64) AppleWebKit/534.34 (KHTML, like Gecko) PhantomJS/1.9.7 Safari/534.34" 
SERVER: ------------------------------------------------------- 
SERVER: - R E Q U E S T          - 
SERVER: ------------------------------------------------------- 
SERVER: req.url  /test/del 
SERVER: req.method DELETE 
SERVER: req.headers { origin: 'http://localhost:9876', 
    'user-agent': 'Mozilla/5.0 (Unknown; Linux x86_64) AppleWebKit/534.34 (KHTML, like Gecko) PhantomJS/1.9.7 Safari/534.34', 
    accept: 'application/json, application/json;q=0.8, text/plain;q=0.5, */*;q=0.2', 
    referer: 'http://localhost:9876/context.html', 
    connection: 'Keep-Alive', 
    'accept-encoding': 'gzip', 
    'accept-language': 'fr-FR,en,*', 
    host: 'localhost:9009' } 
SERVER: req.query {} 
SERVER: req.body  {} 
SERVER: ------------------------------------------------------- 
SERVER: ------------------------------------------------------- 
SERVER: - R E Q U E S T          - 
SERVER: ------------------------------------------------------- 
SERVER: req.url  /del 
SERVER: req.method DELETE 
SERVER: req.headers { origin: 'http://localhost:9876', 
    'user-agent': 'Mozilla/5.0 (Unknown; Linux x86_64) AppleWebKit/534.34 (KHTML, like Gecko) PhantomJS/1.9.7 Safari/534.34', 
    accept: 'application/json, application/json;q=0.8, text/plain;q=0.5, */*;q=0.2', 
    referer: 'http://localhost:9876/context.html', 
    connection: 'Keep-Alive', 
    'accept-encoding': 'gzip', 
    'accept-language': 'fr-FR,en,*', 
    host: 'localhost:9009' } 
SERVER: req.query {} 
SERVER: req.body  {} 
SERVER: ------------------------------------------------------- 
SERVER: ------------------------------------------------------- 
SERVER: - R E S P O N S E          - 
SERVER: ------------------------------------------------------- 
SERVER: res.headers { 'Content-type': 'application/json', 
    'Access-Control-Allow-Origin': '*' } 
SERVER: res.body  { code: 'Declined', 
    reason: 'UNEXPECTED CONTENT', 
    message: 'The content-type "undefined" is unexpected. Please use "application/json".' } 
SERVER: ------------------------------------------------------- 

Логарифм запрос, отправленный из в Chrome

SERVER: ------------------------------------------------------- 
SERVER: - R E Q U E S T          - 
SERVER: ------------------------------------------------------- 
SERVER: req.url  /test/del 
SERVER: req.method OPTIONS 
SERVER: req.headers { host: 'localhost:9009', 
    connection: 'keep-alive', 
    'access-control-request-method': 'DELETE', 
    origin: 'http://localhost:9876', 
    'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.116 Safari/537.36', 
    'access-control-request-headers': 'accept, content-type', 
    accept: '*/*', 
    referer: 'http://localhost:9876/context.html', 
    'accept-encoding': 'gzip,deflate,sdch', 
    'accept-language': 'en-US,en;q=0.8' } 
SERVER: req.query {} 
SERVER: req.body  {} 
SERVER: ------------------------------------------------------- 
SERVER: ------------------------------------------------------- 
SERVER: - R E S P O N S E          - 
SERVER: ------------------------------------------------------- 
SERVER: res.headers { 'Access-Control-Allow-Headers': 'Origin, X-Requested-With, Content-Type, Accept', 
    'Access-Control-Allow-Methods': 'PUT, DELETE', 
    'Access-Control-Allow-Origin': '*' } 
SERVER: ------------------------------------------------------- 
127.0.0.1 - - [Thu, 13 Nov 2014 16:15:04 GMT] "OPTIONS /test/del HTTP/1.1" 200 - "http://localhost:9876/context.html" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.116 Safari/537.36" 
SERVER: ------------------------------------------------------- 
SERVER: - R E Q U E S T          - 
SERVER: ------------------------------------------------------- 
SERVER: req.url  /test/del 
SERVER: req.method DELETE 
SERVER: req.headers { host: 'localhost:9009', 
    connection: 'keep-alive', 
    'content-length': '23', 
    accept: 'application/json, application/json;q=0.8, text/plain;q=0.5, */*;q=0.2', 
    origin: 'http://localhost:9876', 
    'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.116 Safari/537.36', 
    'content-type': 'application/json', 
    referer: 'http://localhost:9876/context.html', 
    'accept-encoding': 'gzip,deflate,sdch', 
    'accept-language': 'en-US,en;q=0.8' } 
SERVER: req.query {} 
SERVER: req.body  { field1: 1, field2: 2 } 
SERVER: ------------------------------------------------------- 
SERVER: ------------------------------------------------------- 
SERVER: - R E Q U E S T          - 
SERVER: ------------------------------------------------------- 
SERVER: req.url  /del 
SERVER: req.method DELETE 
SERVER: req.headers { host: 'localhost:9009', 
    connection: 'keep-alive', 
    'content-length': '23', 
    accept: 'application/json, application/json;q=0.8, text/plain;q=0.5, */*;q=0.2', 
    origin: 'http://localhost:9876', 
    'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.116 Safari/537.36', 
    'content-type': 'application/json', 
    referer: 'http://localhost:9876/context.html', 
    'accept-encoding': 'gzip,deflate,sdch', 
    'accept-language': 'en-US,en;q=0.8' } 
SERVER: req.query {} 
SERVER: req.body  { field1: 1, field2: 2 } 
SERVER: ------------------------------------------------------- 
SERVER: ------------------------------------------------------- 
SERVER: - R E S P O N S E          - 
SERVER: ------------------------------------------------------- 
SERVER: res.headers { 'Content-type': 'application/json', 
    'Access-Control-Allow-Origin': '*' } 
SERVER: res.body  { code: 'Accepted' } 
SERVER: ------------------------------------------------------- 
+0

Помог ли мой ответ? Есть ли проблемы? –

+0

Да, это так. Я разработал REST API, где клиенты могут отправлять тело вместе с запросами GET и DELETE. Я считаю, что отправка JSON в тело намного чище, отправляя все данные запроса в URL. Основываясь на вашем ответе, я решил в настоящее время рассмотреть дизайн API и поместить все данные запроса в URL для GET и DELETE. – Younes

ответ

0

The RFC 2616 for HTTP/1.1 определяет УДАЛИТЬ метод в главе 9.7. Он не указывает что-нибудь о заключенный объект (текст сообщения) в тексте описания, который он делает для POST и PUT.

Из ваших журналов видно, что PhantomJS даже не отправляет тело сообщения, поэтому не нужно включать тип содержимого, поскольку он предполагает, что он никогда не будет использоваться в любом случае, поскольку он не определен. Кажется, что Chrome отправляет тело сообщения независимо от него.

Существует draft for an update, который включает в себя следующий текст в главе 6.7:

Органы по DELETE запросов не имеют никакой определенной семантики. Обратите внимание, что отправка тела по запросу DELETE может привести к тому, что некоторые существующие реализации отклонят запрос.

Поскольку PhantomJS 1.x основан на более чем трехлетней версии WebKit (предварительная черновик), он ведет себя таким образом. Chrome, с другой стороны, возможно, внедрил предложенный проект и активно отправляет тело по запросам DELETE. См. this question для получения дополнительной информации.

Если ваша операция зависит от тела сообщения для метода DELETE, вы должны изменить реализацию так, чтобы ресурс, который вы удаляете , удаляет, полностью определяется URI.

+0

Я думаю, что исправление этой ошибки в phantomjs имеет больше смысла, чем ожидая, что все изменят свои API ... – shi

+0

@shi PhantomJS - с открытым исходным кодом. Вы можете разветвить его на GitHub, исправить код и создать запрос на перенос. –