Я могу публиковать сообщения в веб-сервисе, написанном на C # из PHP, с помощью CURL-запроса, но не могу правильно выполнить запрос. Независимо от того, что я делаю, единственный способ, которым я могу получить пост, — это если я json_encode
заголовки данных формы. Итак, мой PHP-код в итоге выглядит так:
$ user = array ('id' => 5, 'first_name' => 'First', 'last_name' => 'Last'); $ uch = curl_init (); curl_setopt ($ uch, CURLOPT_URL, "http: // localhost: 50115 / Service1.svc / postUser"); curl_setopt ($ uch, CURLOPT_POST, 1); curl_setopt ($ uch, CURLOPT_POSTFIELDS, json_encode ("user =". json_encode ($ user))); curl_setopt ($ uch, CURLOPT_HTTPHEADER, массив ( 'Content-Type: application / json' )); curl_setopt ($ uch, CURLOPT_RETURNTRANSFER, true); $ response = curl_exec ($ uch);
Когда я установил строку:
curl_setopt($uch, CURLOPT_POSTFIELDS, json_encode("user=" . json_encode($user)));
чтобы:
curl_setopt($uch, CURLOPT_POSTFIELDS, array("user" => json_encode($user)));
--OR--
curl_setopt($uch, CURLOPT_POSTFIELDS,
http_build_query(array("user" => json_encode($user))));
--OR--
curl_setopt($uch, CURLOPT_POSTFIELDS, json_encode($user));
в PHP нет ошибок, служба C # не возвращает ошибку (у меня есть настройка для возврата исключений, заданных в конфигурации), и точка останова функции никогда не срабатывает.
На стороне C # мой интерфейс и сервис настроены так:
//Интерфейс [OperationContract] [WebInvoke (метод = "POST", BodyStyle = WebMessageBodyStyle.Bare, // Любое другое значение, точка останова // не сработает RequestFormat = WebMessageFormat.Json, UriTemplate = "postUser")] void PostUser (строка user); //Обслуживание public void PostUser (пользователь строки) { var request = user; int i = 5; // Отладка установлена здесь }
Когда наступает переломный момент, я могу видеть, что user
имеет значение:
user={"id":5,"first_name":"First","last_name":"Last"}
То, что я хотел бы иметь для значения user
просто быть:
{"id":5,"first_name":"First","last_name":"Last"}
Можно ли получить мой ответ, как это? Если это так, что мне нужно изменить, чтобы достичь этого?
Попробовав несколько комбинаций в PHP и C #, я наконец-то заставил его работать. В PHP CURLOPT_POSTFIELDS
необходимо установить с помощью:
curl_setopt($uch, CURLOPT_POSTFIELDS, json_encode(array("user" => json_encode($user))));
Затем в C # мне нужно было изменить BodyStyle=WebMessageBodyStyle.Bare
в BodyStyle=WebMessageBodyStyle.Wrapped
;
Других решений пока нет …