powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / API - метод "POST"
13 сообщений из 13, страница 1 из 1
API - метод "POST"
    #39612971
Фотография Riska
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Платежная система.
Нужно отправить на сервер параметры банковской карты.
Сделать это нужно методом POST, а не GET.
Этот код выдает ошибку (причем запрос не доходит до сервера).
Если поменять "POST" на "GET" (или просто запустить линк в браузере), то все работает хорошо, но метод "GET" не годится.
Где грабли?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
OleObject loo_xmlhttp
string ls_post_url, ls_post = '', ls_status_text, ls_response_text
long	ll_status_code

//ls_post_url = sle_1.Text
ls_post_url = 'https://secure5.tranzila.com/cgi-bin/tranzila71u.cgi?supplier=testd621&tranmode=A&ccno=12312312&expdate=0917&sum=3¤cy=1&cred_type=1&myid=123456789&mycvv=123'
loo_xmlhttp = CREATE oleobject
loo_xmlhttp.ConnectToNewObject("Msxml2.XMLHTTP.6.0")

loo_xmlhttp.Open ("POST",ls_post_url, FALSE)
loo_xmlhttp.Send(ls_post)
ls_status_text = loo_xmlhttp.StatusText
ll_status_code =  loo_xmlhttp.Status
ls_response_text = loo_xmlhttp.ResponseText
//loo_xmlhttp.DisconnectObject(loo_xmlhttp)
MessageBox(ls_status_text, ls_response_text)
...
Рейтинг: 0 / 0
API - метод "POST"
    #39612990
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Riska,

1) Обычно данные (то что в ls_post) методом POST отправляются в формате "application/x-www-form-urlencoded" или "multipart/form-data" - это два разных формата. Первый используется для передачи просто куска данных без структуры, второй для передачи данных формы с именованными полями.
У вас в коде не задается никакой формат (через .setRequestHeader), и помимо прочего непонятно в каком виде отформатированы данные. Попробуйте для начала с этим определиться.

2) У вас в URL есть такой символ "¤". Это юникодный 2-х байтовый символ, который может в теории тоже ломать процесс.
...
Рейтинг: 0 / 0
API - метод "POST"
    #39612991
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky"application/x-www-form-urlencoded" или "multipart/form-data" - это два разных формата. Первый используется для передачи просто куска данных без структуры, второй для передачи данных формы с именованными полями
Сорри, наоборот. "application/x-www-form-urlencoded" для форм, "multipart/form-data" - для куска данных без структуры
...
Рейтинг: 0 / 0
API - метод "POST"
    #39613000
Фотография Riska
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky,
Добавил SetRequestHeader (должно быть 'application/x-www-form-urlencoded').
Код: sql
1.
loo_xmlhttp.SetRequestHeader('Content-type', 'application/x-www-form-urlencoded')


Вместо "¤" поставил "&" - результат остался преждним: "GET" работает, "POST" - нет
...
Рейтинг: 0 / 0
API - метод "POST"
    #39613045
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Riska,

Вообще по идее при POST URL должен быть без параметров " https://secure5.tranzila.com/cgi-bin/tranzila71u.cgi", а параметры передаются в теле запроса (ls_post) в том же виде как если бы они были в URL (без ?)
Что у вас передается в ls_post?
...
Рейтинг: 0 / 0
API - метод "POST"
    #39613187
Фотография Riska
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky,
Сделал, как велено.
Славы не добавило :(
Ничего не изменилось.
Код: sql
1.
2.
ls_post_url = 'https://secure5.tranzila.com/cgi-bin/tranzila71u.cgi'
ls_post = 'supplier=testd621&tranmode=A&ccno=12312312&expdate=0917&sum=3&currency=1&cred_type=1&myid=123456789&mycvv=123'
...
Рейтинг: 0 / 0
API - метод "POST"
    #39613430
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Riska,

Ну тогда сдаюсь ))
...
Рейтинг: 0 / 0
API - метод "POST"
    #39613640
Фотография spas2001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, тут явно ошибка в формате параметров
Вы их как для GET-строки передаете только через POST.
У них другой формат.
...
Рейтинг: 0 / 0
API - метод "POST"
    #39613643
Фотография spas2001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может это поможет
...
Рейтинг: 0 / 0
API - метод "POST"
    #39613648
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если что-то не получается, прочти документацию ( С )

Описание API должно быть, там и должно быть указано, в каком виде нужно формировать данные
...
Рейтинг: 0 / 0
API - метод "POST"
    #39614008
Фотография Riska
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev,
Может быть проблема с http s ?
Помню, что была какая-то проблема с https Но не помню, связано ли это было с "POST"

Вот пример работающего кода на C#
Код: sql
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.
79.
80.
81.
using System;
using System.Net;
using System.IO;
using System.Text;
using System.Web;
using System.Collections.Generic;

namespace TranzilaSocketTest
{
	class Program
	{
		static void Main(string[] args)
		{
			string tranzila_api_url = "https://secure5.tranzila.com/cgi-bin/tranzila71u.cgi";
			//Preparing proper encoding object
			Encoding enc = Encoding.GetEncoding("utf-8");
			//Creating the data string while converting data into proper format
			//Initialization
			string post_data = "supplier=" + "terminal_name";
			// 'terminal_name' should be replaced by actual terminal name
			post_data += ("&currency=1"); // ILS
			post_data += ("&ccno=" + "12312312"); // Test card number
			post_data += ("&expdate=" + "0820"); // Card expiry date: mmyy
			post_data += ("&sum=" + "10");
			// All the textual parameters should go through encoding conversion
			post_data += ("&first_name=" + HttpUtility.UrlEncode("ישראל", enc));
			post_data += ("&last_name=" + HttpUtility.UrlEncode("ישראל'", enc));
			post_data += ("&company=" + HttpUtility.UrlEncode("יוסי סלטים", enc));
			//Translating final data string into byte array format
			byte[] data = Encoding.ASCII.GetBytes(post_data);
			// Preparing web request
			HttpWebRequest http_request =
				(HttpWebRequest)WebRequest.Create(tranzila_api_url);
			http_request.Method = "POST";
			http_request.ContentType = "application/x-www-form-urlencoded";
			http_request.ContentLength = data.Length;
			Stream new_stream = http_request.GetRequestStream();
			// Sending the data 
			new_stream.Write(data, 0, data.Length);
			//Reading of responce and taking care of the result should be placed here.
			HttpWebResponse http_response = (HttpWebResponse)http_request.GetResponse();
			StreamReader response_stream = new StreamReader(http_response.GetResponseStream(), enc);

			string result = response_stream.ReadToEnd();

			response_stream.Close();
			http_response.Close();
			//Finalizing the sending process
			new_stream.Close();
			// Prepare list with response data
			string[] response_array = result.Split('&');
			Dictionary<string, string> response_dict = new Dictionary<string, string> ();
			if (response_array.Length > 1) {
				for (int i = 0; i < response_array.Length; ++i) {
					string[] tmp = response_array [i].Split ('=');
					if (tmp.Length > 1) {
						response_dict [tmp [0]] = tmp [1];
					}
				}
			}
			//Analyze the result string
			if (!response_dict.ContainsKey ("Response")) {
				Console.WriteLine (result);
				/**
				 * When there is no 'Response' parameter it either means
				 * that some pre-transaction error happened (like authentication
				 * problems), in which case the result string will be in HTML format,
				 * explaining the error, or the request was made for generate token only
				 * (in this case the response string will contain only 'TranzilaTK'
				 * parameter)
				 */
			} else if (response_dict["Response"] != "000") {
				Console.WriteLine (response_dict ["Response"]);
				// Any other than '000' code means transaction failure
				// (bad card, expiry, etc..)
			} else {
				Console.WriteLine ("Success");
			}
		}
	}
}


Как это изобразить в РВ 12.5?
...
Рейтинг: 0 / 0
API - метод "POST"
    #39614049
Фотография Riska
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проблема была в параметрах.
В линке, что мне дали для примера отсутствовали некоторые данные.
Прошу прощение за беспокойство.
Спасибо за помощь.
...
Рейтинг: 0 / 0
API - метод "POST"
    #39614147
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
spas2001Нет, тут явно ошибка в формате параметров
Вы их как для GET-строки передаете только через POST.
У них другой формат.
Их два формата - один из них (application/x-www-form-urlencoded) такой же как в GET
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / API - метод "POST"
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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