Гость
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Не отправляется post-запрос на сервер / 5 сообщений из 5, страница 1 из 1
09.04.2021, 14:30
    #40061025
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не отправляется post-запрос на сервер
Нужно выполнить 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
09.04.2021, 15:36
    #40061069
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не отправляется post-запрос на сервер
Разобрался.
Надо было в самом конце добавить $tmp .= "--{$bound}--\r\n";
...
Рейтинг: 0 / 0
09.04.2021, 18:34
    #40061144
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не отправляется post-запрос на сервер
Alibek B.,

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

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


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