我有一个问题.. 我的应用程序向我提供了以下信息:
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;
给我以下错误
警告:file_put_contents(http:// miapp .com / api / zonas / 8):无法打开&gt;流:HTTP包装器不支持C:\ xampp \ htdocs \ Codigo2.0 \ models \中的可写连接第34行的zonas.model.php
没有任何反应。
答案 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)
代码
<?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;