Ответ CURL отличается от ответа на запрос, отправленный из браузера

Попытка отправить форму с помощью CURL, как через PHP, так и в командной строке. Ответ с сервера состоит из нулевого содержимого (заголовки, размещенные ниже).

Когда один и тот же URL-адрес отправляется через браузер, ответ состоит из соответствующего web-файла.

Попробовали передать параметры запроса CURL через POST и GET через каждый из следующих флагов зависания командной строки «-d» «-F» и «-G».

Если параметры строки запроса отправляются с флагом «-d», итоговый заголовок:

HTTP / 1.1 302 временно перемещен
Дата: Чт, 02 Июн. 2011 21:41:54 GMT
Сервер: Apache
Set-Cookie: JSESSIONID = DC5F435A96A353289F58593D54B89570; Path = / XXXXXXX
P3P: CP = "CAO PSA OUR"
Местоположение: http://www.XXXXXXXX.com/
Контент-длина: 0
Подключение: закрыть
Content-Type: text / html; charset = UTF-8
Set-Cookie: XXXXXXXXXXXXXXXX = 1318103232.20480.0000; Путь = /


Если параметры строки запроса отправляются с флагом «-F», итоговый заголовок:

HTTP / 1.1 100 Продолжить

Внутренняя ошибка сервера HTTP / 1.1 500
Дата: Чт, 02 Июн. 2011 21:52:54 GMT
Сервер: Apache
Контент-длина: 1677
Подключение: закрыть
Content-Type: text / html; charset = utf-8
Set-Cookie: XXXXXXXXXXXXXX = 1318103232.20480.0000; Путь = /
Vary: Accept-Encoding

<html><head><title>Apache Tomcat/5.5.26 - Error report</title><style><!--H1 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:22px;} H2 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:16px;} H3 {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;font-size:14px;} BODY {font-family:Tahoma,Arial,sans-serif;color:black;background-color:white;} B {font-family:Tahoma,Arial,sans-serif;color:white;background-color:#525D76;} P {font-family:Tahoma,Arial,sans-serif;background:white;color:black;font-size:12px;}A {color : black;}A.name {color : black;}HR {color : #525D76;}--></style> </head><body><h1>HTTP Status 500 - </h1><HR size="1" noshade="noshade"><p><b>type</b> Exception report</p><p><b>message</b> <u></u></p><p><b>description</b> <u>The server encountered an internal error () that prevented it from fulfilling this request.</u></p><p><b>exception</b> <pre>javax.servlet.ServletException: Servlet execution threw an exception<br> </pre></p><p><b>root cause</b> <pre>java.lang.NoClassDefFoundError: com/oreilly/servlet/multipart/MultipartParser<br> com.corsis.tuesday.servlet.mp.MPRequest.<init>(MPRequest.java:27)<br> com.corsis.tuesday.servlet.mp.MPRequest.<init>(MPRequest.java:21)<br> com.corsis.tuesday.servlet.TuesdayServlet.doPost(TuesdayServlet.java:494)<br> javax.servlet.http.HttpServlet.service(HttpServlet.java:710)<br> javax.servlet.http.HttpServlet.service(HttpServlet.java:803)<br> </pre></p><p><b>note</b> <u>The full stack trace of the root cause is available in the Apache Tomcat/5.5.26 logs.</u></p><HR size="1" noshade="noshade"><h3>Apache Tomcat/5.5.26</h3></body></html> 

Вопросов:

  1. Что может заставить сервер реагировать на разные в зависимости от характера запроса CURL.

  2. Как успешно отправить запрос через CURL?

HTTP/1.1 100 Continue

Раньше у меня были проблемы, связанные с этим заголовком. Некоторые серверы просто не понимают этого. Попробуйте эту опцию, чтобы переопределить заголовок Expect.

curl_setopt( $curl_handle, CURLOPT_HTTPHEADER, array( 'Expect:' ) );

Чтобы добавить к тому, что сказал Ричард, я видел случаи, когда серверы проверяют строку User-Agent и ведут себя по-другому в зависимости от его значения.

У меня только что был опыт, и что это удивительно. В моей ситуации я заходил на сервер, поэтому я мог загрузить файл, работать с ним на сервере, а затем загрузить новый файл. Сначала я сделал это в Chrome и использовал инструменты dev для захвата более 100 HTTP-запросов в этой простой транзакции. Большинство из них просто захватывают ресурсы, которые мне не нужны, если я пытаюсь сделать все это из командной строки, поэтому я отфильтровал только те, которые, как я знал, как минимум мне нужно.

Первоначально это сводилось к GET, чтобы установить cookie и войти в систему с именем пользователя и паролем, POST для загрузки файла, POST для выполнения работы над файлом и GET для извлечения нового файла. Однако я не мог получить первый POST. Ответ от этого POST должен представлять собой информацию, содержащую идентификатор загрузки, время загрузки и т. Д., Но вместо этого я получал пустые списки JSON, хотя статус был 200 OK.

Я использовал CURL, чтобы точно отмахиваться от запросов из браузера (копирование User-Agent, переопределение Expect и т. Д.) И до сих пор ничего не получалось. Затем я начал произвольно добавлять некоторые из запросов, которые я захватил из Chrome, между первым GET и POST, а низкий и созерцать после добавления в GET-запрос истории JSON до POST, POST фактически вернул то, что предполагалось.

TL; DR Некоторые веб-сайты требуют больше запросов после первоначального входа в систему, прежде чем вы сможете использовать POST. Я попытался бы захватить успешный обмен между сервером и браузером и посмотреть все запросы. Некоторые запросы могут быть не такими лишними, как кажется.