2

PHP で REST を使用してセルフホステッド WCF サービスにリクエストを送信しようとしています。オブジェクトを JSON オブジェクトとして WCF サービスに送信したいと考えています。まだ実行していません。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);

ただし、このコードはオブジェクトを送信しません。Debugging-Mode では、オブジェクトは「null」です。メソッドに入ることがわかりました。

4

4 に答える 4

3

私は自分の問題の解決策を見つけました:

$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); 
于 2012-05-23T12:17:12.147 に答える
0

WCF Rest サービスで 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 本文に追加します。

リクエスト/レスポンスをインターセプトして検査できるFiddlerWireSharkなどのツールを使用します。生のリクエストを作成することで、WCF Rest サービスをテストするためにも使用できます。

役立つリンクをいくつか見つけてください。

  1. REST サービスを呼び出す php クライアントを作成する

  2. PHP残りAPI呼び出し

于 2012-05-22T15:20:37.573 に答える
0

以下のように $path の横にパラメーターを追加することで、「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 の代わりに

$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");
于 2012-09-13T18:00:50.667 に答える