如何从PHP调用REST风格的WCF服务(How to call RESTful WCF-Servi

2019-09-17 09:40发布

我想在PHP中发送一个请求到自托管的WCF服务与REST。 我要将对象发送到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);

但是这个代码不发送的对象。 在调试模式的对象是“空”。 我只看到,它进入的方法。

Answer 1:

我发现我自己的问题的解决方案:

$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); 


Answer 2:

当您执行上一个WCF休息服务POST的原始请求看起来应该如下:

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主体。

使用一些工具,如提琴手或者Wireshark的 ,你可以拦截请求/响应,并对其进行检查。 您可以使用它们甚至通过建立一个原始请求来测试WCF REST服务。

找到一些链接可能会有所帮助:

  1. 创建一个PHP客户端调用REST服务

  2. PHP REST API调用



Answer 3:

我通过如下添加下一个参数为$路径有工作“der_chirurg”解决方案

原版的:

$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 = "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");


Answer 4:

 $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格式。



文章来源: How to call RESTful WCF-Service from PHP
标签: php json wcf rest