Как вызвать RESTful WCF-Service из PHP

Я пытаюсь отправить запрос на Self-Hosted WCF-Service с REST в PHP. Я хочу отправить объект в службу WCF как объект JSON. Я еще не запустил его. Есть ли у кого-нибудь пример вызова службы из PHP?

Это Операционный договор (метод – метод POST):

[OperationContract] [WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Wrapped, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)] void Method1(AnObject object); 

Лучший рабочий код в PHP:

 $url = "http://localhost:8000/webservice/Method1?object=$object"; $url1 = parse_url($url); // extract host and path: $host = $url1['host']; $path = $url1['path']; $port = $url1['port']; // open a socket connection on port 80 - timeout: 30 sec $fp = fsockopen($host, $port, $errno, $errstr, 30); if($fp) { // send the request headers: fputs($fp, "POST $path HTTP/1.1\r\n"); fputs($fp, "Host: $host\r\n"); fputs($fp, "Content-type: application/json \r\n"); fputs($fp, "Content-length: ". strlen($object) ."\r\n"); fputs($fp, "Connection: close\r\n\r\n"); fputs($fp, $object); // // $result = ''; // while(!feof($fp)) { // // receive the results of the request // $result .= fgets($fp, 128); // } } else { return array( 'status' => 'err', 'error' => "$errstr ($errno)" ); } // close the socket connection: fclose($fp); 

Но этот код не отправляет объект. В режиме отладки объект имеет значение «null». Я просто вижу, что он входит в метод.

Я нашел решение для своей собственной проблемы:

 $url = "http://localhost:1234/service/PostMethod"; $jsonObject = json_encode($transmitObject); $options = array( CURLOPT_HTTPHEADER => array( "Content-Type:application/json; charset=utf-8", "Content-Length:".strlen($jsonObject))); $defaults = array( CURLOPT_POST => 1, CURLOPT_HEADER => 0, CURLOPT_URL => $url, CURLOPT_FRESH_CONNECT => 1, CURLOPT_RETURNTRANSFER => 1, CURLOPT_FORBID_REUSE => 1, CURLOPT_TIMEOUT => 4, CURLOPT_POSTFIELDS => $jsonObject ); $ch = curl_init(); curl_setopt_array($ch, ($options + $defaults)); curl_exec($ch); curl_close($ch); 

Когда вы выполняете POST в службе WCF Rest, необработанный запрос должен выглядеть следующим образом:

 POST http://localhost:8000/webservice/Method1 HTTP 1.1 Content-Type: application/json Host: localhost {"object":{"ObjectId":1,"ObjectValue":60} 

Предполагая, что ваш AnObject выглядит следующим образом:

 [DataContract] public class AnObject { [DataMember] public int ObjectId {get;set;} [DataMember] public int ObjectValue {get;set;} } 

Из вашего php-кода вы пытаетесь отправить объект как строку запроса, которая не будет работать. Скорее создайте свой код, чтобы добавить строку json в тело http.

Используйте некоторые инструменты, такие как Fiddler или WireShark, где вы можете перехватить запрос / ответ и проверить их. Вы можете использовать их даже для проверки службы WCF Rest, создавая необработанный запрос.

Найдите некоторые ссылки, которые могут быть полезны:

  1. Создайте клиент php для вызова службы REST

  2. php rest api call

Я получил решение «der_chirurg», добавив параметр рядом с $ path, как показано ниже.

оригинал:

 $url = "http://localhost:8000/webservice/Method1?object=$object"; fputs($fp, "POST $path HTTP/1.1\r\n"); 

изменился на:

 fputs($fp, "POST $path**?object=$object** HTTP/1.1\r\n"); 

и вместо $ url

 $url = "http://localhost:8000/webservice/Method1 

В заключение:

  url = "http://localhost:8000/webservice/Method1"; $url1 = parse_url($url); // extract host and path: $host = $url1['host']; $path = $url1['path']; $port = $url1['port']; // open a socket connection on port 80 - timeout: 30 sec $fp = fsockopen($host, $port, $errno, $errstr, 30); if($fp) { // send the request headers: fputs($fp, "POST $path?value=test HTTP/1.1\r\n"); fputs($fp, "Host: $host\r\n"); fputs($fp, "Content-type: application/json \r\n"); fputs($fp, "Content-length: ". strlen($param) ."\r\n"); fputs($fp, "Connection: close\r\n\r\n"); 
  $jsonData = json_encode($object, JSON_PRETTY_PRINT); $options = array( 'http'=>array( 'method' => "POST", 'ignore_errors' => true, 'content' => $jsonData, 'header' => "Content-Type: application/json\r\n" . "Content-length: ".strlen($jsonData)."\r\n". "Expect: 100-continue\r\n" . "Connection: close" ) ); $context = stream_context_create($options); $result = @file_get_contents($requestUrl, false, $context); 

Очень важен формат JSON.