如何使用PHP来使用我的web服务

时间:2017-06-16 21:08:13

标签: php

我有一个问题.. 我的应用程序向我提供了以下信息:

HTTP + JSON
以下是HTTP请求和响应示例。显示的占位符需要替换为实际值。

  

POST / json / reply / Zona
  HTTP / 1.1
  主持人:equatepro.azurewebsites.net
  内容类型:application / json
  内容长度:长度

     

{" zonaId":0," NOMBRE":"字符串"" creadoPor":"字符串" " creadoFecha":" /日期(-62135596800000-0000)/"" modificadoPor":"字符串"" modificadoFecha":" /日期(-62135596800000-0000)/""埃斯塔":"字符串"" NOTA&#34 ;: "字符串"" borrar":假}

然后

以下路线可用于此项服务:
POST / api / zonas
PUT / api / zonas / {zonaId}

enter image description here enter image description here

我尝试使用PUT方法与我的网络服务进行通信

我的代码



<?php


$pantalla="zonas";
%id =8;
$url= "http: //miapp.com /api/zonas/8".$pantalla ;
$url = $url ."/" . $id;

// complete url http://miapp.com/api/zonas/8

//build json

 $ConstructorJson = array(
      'ZonaId' => $Datos['txt_codigo'],
      'Nombre' => $Datos['txt_Nombre'],
      'CreadoPor' => $Datos['txt_CreadoPor'],
      'CreadoFecha' => $Datos['txt_CreadoFecha'],
      'ModificadoPor' => $Datos['txt_ModificadoPor'],
      'ModificadoFecha' => $Datos['txt_ModificadoFecha'],
      'Estado' => $Datos['cbo_Estado'],
      'Nota' => $Datos['txt_Notas']
    );
    
 $json = json_encode($ConstructorJson);
 
 
   $opts = array(
    "http" => array(
      "method" => "PUT",
      "header" => "Accept: application/xml\r\n",
      "content" => $json
    )
  );

  $context = stream_context_create($opts);
  $response = file_put_contents($url,'8',false,$context);



?>
&#13;
&#13;
&#13;

给我以下错误

  

警告:file_put_contents(http:// miapp .com / api / zonas / 8):无法打开&gt;流:HTTP包装器不支持C:\ xampp \ htdocs \ Codigo2.0 \ models \中的可写连接第34行的zonas.model.php

没有任何反应。

3 个答案:

答案 0 :(得分:1)

HTTP wrapper does not support writeable connections - 基本上,PHP告诉你“嘿,你不能用这个函数写一个存在于互联网上的文件。你怎么期望我写一个文件@ http:// miapp .com / api / zonas / 8?不会发生“。

我假设你要做的是发送一个PUT请求@该位置来更新ID为8的zonas资源。

解决方案

考虑使用可以发送实际HTTP请求方法并符合HTTP规范的正确HTTP客户端。

我个人最喜欢的PHP内容是Guzzle -  http://docs.guzzlephp.org/en/stable/。 Guzzle是一个独立的软件包,可以从他们的网站下载。您可以在任何PHP项目中使用它 - 无论是否有框架。

使用Guzzle,您可以执行以下操作:

$client = new GuzzleHttp\Client();

$json = json_encode($ConstructorJson);

$headers = [
    "Accept" => "application/xml\r\n"
]

$request = new Request('PUT', $url, ['body' => $json, 'headers' => $headers]);

$client->send($request);

答案 1 :(得分:1)

我宁愿使用PHP curl连接。

$ConstructorJson = array(
      'ZonaId' => $Datos['txt_codigo'],
      'Nombre' => $Datos['txt_Nombre'],
      'CreadoPor' => $Datos['txt_CreadoPor'],
      'CreadoFecha' => $Datos['txt_CreadoFecha'],
      'ModificadoPor' => $Datos['txt_ModificadoPor'],
      'ModificadoFecha' => $Datos['txt_ModificadoFecha'],
      'Estado' => $Datos['cbo_Estado'],
      'Nota' => $Datos['txt_Notas']
    );

 $json = json_encode($ConstructorJson);



  $curl = curl_init();
  curl_setopt_array($curl, array(
      CURLOPT_URL => "http: //miapp.com/api/zonas/8/zonas",
      CURLOPT_RETURNTRANSFER => true,
      CURLOPT_ENCODING => "",
      CURLOPT_MAXREDIRS => 10,
      CURLOPT_TIMEOUT => 30,
      CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
      CURLOPT_CUSTOMREQUEST => "PUT",
      CURLOPT_POSTFIELDS => $json          
      CURLOPT_HTTPHEADER => array(
        "cache-control: no-cache",
        "Accept: application/xml\r\n",
      ),
  ));

  $response = curl_exec($curl);
  $err = curl_error($curl);

  curl_close($curl);

  if ($err) {
     echo "cURL Error #:" . $err;
  } else {
     echo $response;
  }

答案 2 :(得分:0)

我终于解决了这个问题(谢谢Kyle O&#39; Brien)

代码

&#13;
&#13;
<?php

// web service url + tabla + id
$url = "mywebservice.com/zonas/8";

$Datos = $_POST;

//create a array with dates
  $ConstructorJson = array(
      'Nombre' => $Datos['txt_Nombre'],
      'CreadoPor' => $Datos['txt_CreadoPor'],
      'CreadoFecha' => $Datos['txt_CreadoFecha'],
      'ModificadoPor' => $Datos['txt_ModificadoPor'],
      'ModificadoFecha' => $Datos['txt_ModificadoFecha'],
      'Estado' => $Datos['cbo_Estado'],
      'Nota' => $Datos['txt_Notas']
    );

//convert array to json
  $json = json_encode($ConstructorJson);
  
  
  
    $curl = curl_init();
      curl_setopt_array($curl, array(
          CURLOPT_URL => $url,
          CURLOPT_RETURNTRANSFER => true,
          CURLOPT_ENCODING => "",
          CURLOPT_MAXREDIRS => 10,
          CURLOPT_TIMEOUT => 30,
          CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
          CURLOPT_CUSTOMREQUEST => "PUT",
          CURLOPT_POSTFIELDS => $json,
          CURLOPT_HTTPHEADER => array(
            'Accept: application/json',
            'Content-Type: application/json',
          ),
      ));
      
      
      $response = curl_exec($curl);
      $err = curl_error($curl);

      curl_close($curl);

      if ($err) {
         echo "cURL Error #:" . $err;
      } else {
         echo $response;
      }

?>
&#13;
&#13;
&#13;