Aleman
Aleman

Reputation: 101

How to consume my webservice with PHP

I have a question .. My app gives me the following information:

HTTP + JSON
The following are sample HTTP requests and responses. The placeholders shown need to be replaced with actual values.

POST /json/reply/Zona
HTTP/1.1
Host: equatepro.azurewebsites.net
Content-Type: application/json
Content-Length: length

{"zonaId":0,"nombre":"String","creadoPor":"String","creadoFecha":"/Date(-62135596800000-0000)/","modificadoPor":"String","modificadoFecha":"/Date(-62135596800000-0000)/","estado":"String","nota":"String","borrar":false}

AND then

The following routes are available for this service:
POST /api/zonas
PUT /api/zonas/{zonaId}

enter image description here enter image description here

I'm trying to communicate with my webservice using PUT method

My code

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



?>

Give me the following error

Warning: file_put_contents(http: //miapp .com/api/zonas/8): failed to open >stream: HTTP wrapper does not support writeable connections in C:\xampp\htdocs\Codigo2.0\models\zonas.model.php on line 34

and nothing happens.

Upvotes: 1

Views: 100

Answers (3)

Aleman
Aleman

Reputation: 101

I finally solved the problem (thank you Kyle O'Brien)

Code

<?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;
      }

?>

Upvotes: 0

Kyle O&#39;Brien
Kyle O&#39;Brien

Reputation: 952

HTTP wrapper does not support writeable connections - basically, PHP is telling you "Hey, you can't use this function to write to a file that lives on the internet. How do you expect me to write a file @ http: //miapp .com/api/zonas/8? Not gonna happen".

I assume what you're trying to do is to send a PUT request @ that location to update a zonas resource with ID 8.

Solution

Consider using a proper HTTP client that can send actual HTTP request methods and conform to the HTTP spec.

My personal favourite inside PHP is Guzzle - http://docs.guzzlephp.org/en/stable/. Guzzle is a standalone package and can be downloaded from their site. You can use it in any PHP project - without or without a framework.

With Guzzle, you'd do something like the following:

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

Upvotes: 1

I would rather connect using 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;
  }

Upvotes: 1

Related Questions