powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Не отправляется post-запрос на сервер
5 сообщений из 5, страница 1 из 1
Не отправляется post-запрос на сервер
    #40061025
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нужно выполнить POST-запрос и передать параметр и файл.
Делаю так:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
	final private function http($url, $data=null, $method='POST', $type=null, $headers=null)
	{
		curl_setopt($this->curl, CURLOPT_FOLLOWLOCATION, true);
		curl_setopt($this->curl, CURLOPT_RETURNTRANSFER, true);
		$hdr = [];
		switch ($type)
		{
			case "application/json":
				$hdr[] = "Content-Type: {$type}; charset=utf-8";
				if (isset($data) && is_array($data)) $data = json_encode($data, JSON_NUMERIC_CHECK | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES );
				break;
			case "application/x-www-form-urlencoded":
				$hdr[] = "Content-Type: {$type}";
				if (isset($data) && is_array($data)) $data = http_build_query($data);
				break;
			case "multipart/form-data":
				$bound = "---bound-" . str_shuffle('ABCDEFGHIJKLMNOPQRSTUVWXYZ') . "-end";
				$hdr[] = "Content-Type: {$type}; charset=utf-8; boundary={$bound}";
				if (isset($data) && is_array($data))
				{
					$tmp = "";
					foreach ($data as $item=>$value)
					{
						$tmp .= "--{$bound}\r\n";
						$tmp .= "Content-Disposition: form-data; name=\"{$item}\"\r\n\r\n";
						$tmp .= "{$value}\r\n";
					}
					$data = $tmp;
					unset($tmp);
				}
				break;
			case "text/plain":
				$hdr[] = "Content-Type: {$type}; charset=utf-8";
				break;
			case "text/xml":
				$hdr[] = "Content-Type: {$type}; charset=utf-8";
				break;
		}
		if (isset($headers) && is_array($headers) && !empty($headers)) foreach ($headers as $h=>$a) $hdr[] = (is_int($h) ? $a : "$h: $a");
		if (!empty($hdr)) curl_setopt($this->curl, CURLOPT_HTTPHEADER, $hdr);
		switch ($method)
		{
			case "GET":
				curl_setopt($this->curl, CURLOPT_HTTPGET, true);
				if (isset($data)) $url .= '?'.$data;
				break;
			case "POST":
				curl_setopt($this->curl, CURLOPT_POST, true);
				if (isset($data)) curl_setopt($this->curl, CURLOPT_POSTFIELDS, $data);
				break;
		}
		curl_setopt($this->curl, CURLOPT_URL, $url);
print_r(['url'=>$url, 'hdr'=>$hdr, 'method'=>$method, 'data'=>$data]);
		$res = curl_exec($this->curl);
		$ret = curl_getinfo($this->curl);
print_r(['res'=>$res, 'ret'=>$ret]);
		if (empty($res) || ($res===false)) return false;
		if (is_array($ret)) list($code,$mime) = array($ret['http_code'],$ret['content_type']);
		if ($code >= 500) return "#error $code";
		if (!empty($mime)) $mime = trim(explode(';',$mime)[0]);
		switch ($mime)
		{
			case "application/json":
				$data = json_decode($res, true);
				if (json_last_error() != JSON_ERROR_NONE) $data = false;
				break;
			case "text/xml":
				libxml_use_internal_errors(true);
				$data = @simplexml_load_string($res);
				libxml_use_internal_errors(false);
				if (libxml_get_errors()) $data = false;
				break;
			default:
				$data = $res;
			break;
		}
		return $data;
	}


Но запрос не отправляется, точнее висит и затем выдает таймаут (ошибка 504).
Отладочный вывод такой:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
Array
(
     =>  https://api.telegram.org/bot***/setWebhook 
    [hdr] => Array
        (
            [0] => Content-Type: multipart/form-data; charset=utf-8; boundary=---bound-IXFTRGEZNCUYJDPHOBKLVQWAMS-end
        )

    [method] => POST
    [data] => -----bound-IXFTRGEZNCUYJDPHOBKLVQWAMS-end
Content-Disposition: form-data; name="url"

 https://*** 
-----bound-IXFTRGEZNCUYJDPHOBKLVQWAMS-end
Content-Disposition: form-data; name="certificate"

-----BEGIN CERTIFICATE-----
MIIEeDCCA2CgAwIBAgIIFaY4otyIJSswDQYJKoZIhvcNAQELBQAwga8xCzAJBgNV
...
s7LHpJ+AfvA7LnEUYos+lslk9O0T6KSGfwixQC7uRAkQTu4ogvHGtIvUfI8=
-----END CERTIFICATE-----


)
Array
(
    [res] => {"ok":false,"error_code":504,"description":"Gateway Timeout"}
    [ret] => Array
        (
             =>  https://api.telegram.org/bot***/setWebhook 
            [content_type] => application/json
            [http_code] => 504
            [header_size] => 381
            [request_size] => 260
            [filetime] => -1
            [ssl_verify_result] => 0
            [redirect_count] => 0
            [total_time] => 120.14796
            [namelookup_time] => 3.7E-5
            [connect_time] => 3.7E-5
            [pretransfer_time] => 0.000113
            [size_upload] => 1873
            [size_download] => 61
            [speed_download] => 0
            [speed_upload] => 15
            [download_content_length] => 61
            [upload_content_length] => 1873
            [starttransfer_time] => 0.073819
            [redirect_time] => 0
            [certinfo] => Array
                (
                )

            [primary_ip] => ***
            [primary_port] => 443
            [local_ip] => ***
            [local_port] => 34128
            [redirect_url] => 
        )

)

На первый взгляд запрос вполне корректный, но видимо что-то не так.
Не подскажите, что?
...
Рейтинг: 0 / 0
Не отправляется post-запрос на сервер
    #40061069
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Разобрался.
Надо было в самом конце добавить $tmp .= "--{$bound}--\r\n";
...
Рейтинг: 0 / 0
Не отправляется post-запрос на сервер
    #40061144
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.,

Зашибись! Название темы и поставленная проблема "Не отправляется..." совершенно не соответствует описанию ситуации.
Вы не только успешно отправляете POST-запрос, но и успешно принимаете ответ удаленного сервера с кодом 504. Об этом гласит приведенный Вами же отладочный вывод print_r.
Есть предложение перечитывать пост перед отправкой, чтобы он не имел таких ляпов, внутренних противоречий.

PS: А уж почему сервер ответил 504 Gateway Timeout, а не как-то более вразумительно - это проблема исключительно удаленной стороны.
...
Рейтинг: 0 / 0
Не отправляется post-запрос на сервер
    #40061184
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Под "не отправляется" я имел ввиду, что запрос висит около двух минут, после чего возвращает 504 ошибку.
Подозреваю, что незавершенное тело запроса (в котором не хватало boundary с финальным --) веб-сервер воспринял как незавершенный запрос и ожидал остатка.
...
Рейтинг: 0 / 0
Не отправляется post-запрос на сервер
    #40061213
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.
я имел ввиду
Ааааа.... А то смотрю - отправка есть, ответ есть. И вот то ли лыжи не едут, то ли я чего не понимаю - то ли проблема не та, то ли отладочный вывод левый...
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Не отправляется post-запрос на сервер
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]