php webservice實現客戶端提交資料庫資料到伺服器並返回另一份資料庫資料
由於公司需求,需使用webservice來開發公司erp的伺服器和客戶端的兩邊資料庫交換。
即每次把客戶端更新的資料上傳到生產用的伺服器端並把伺服器端剛更新的資料返回回來。(伺服器端有指令碼在執行更新資料)
由於使用的是php語言,當前網路上大部分解決上傳問題的都是java和C。小白的我在學習過程中吃了很多苦頭,
包括也去嘗試使用socket來進行上傳檔案。還有利用fsockpen GET/POST提交表單及其上傳檔案。
這兩種對於只會php的我來說都是具有可行性的,不過老大要我儘量用webservice,因此最後決定迴歸webservice,並使用soap的傳輸特性來完成這個小專案。
對於webservice,我們一開始都會給伺服器增加身份驗證功能,即客戶端要與伺服器連通,必須要提前配置好對應的賬號密碼,不然伺服器拒絕客戶端使用它的東西。
身份驗證:
關於身份驗證就不多說,我之前的部落格有說過,網上也很多相關文章。
因此,客戶端在這過程中提交了賬號,密碼到伺服器。並根據驗證結果返回值。
那我就可以通過這個,來把客戶端獲取到的資料,在傳輸賬號密碼的時候順帶傳過去。
這裡使用soapvar把所需傳輸給伺服器的資料封到裡面。具體可以查查相關資料。
因為我試了下伺服器只接收字串,因此我這裡採用的是把陣列先轉換為字串,到伺服器的時候再轉換回陣列來。
其實我也不知道soapvar定義資料型別的時候能否定義陣列形式,下次優化的時候回過頭來再試試。
上程式碼,server伺服器端的 soapservice_local.php
<?php
/*
* 定義一個SOAP伺服器
*/
header("Content-type: text/html; charset=utf-8");
ini_set("soap.wsdl_cache_enabled", "0");
//建立一個類
class mysoapclass
{
private $Authenticated =FALSE;
private $posted =FALSE;
//定義一個判斷的函式,來識別客戶端是否為非法入侵。
public function authenticate($value)
{
//$name =$value->item[0]->value;
//$pwd =$value->item[1]->value;
if($value->username == 'admin'&& $value ->password=='123456')
{
$this->Authenticated = true;
}
else
{
$this->Authenticated = FALSE;
}
if ($this->Authenticated)
{
$aaa=$value->clientsoap;
$array_client = explode('##',$aaa);
for($index=0;$index<count($array_client);$index++)
{
echo $array_client[$index];echo "</br>";
}
[email protected]_connect("localhost","weberp","erp.shai3c.com");
if (!$mysql)
{
die('Could not connect: ' . mysql_error());
}
//$get_now=$array_client[17];
$mysql_database="weberp";
$aa=mysql_query("set names utf8;");
$mysql_database=mysql_select_db($mysql_database);
$sql="update prices set startdate='".$array_client[12]."',
enddate='".$array_client[14]."',
updatedate='".$array_client[16]."',
operator='".$array_client[18]."',
storelink='".$array_client[22]."',
competitorid='".$array_client[24]."',
price='".$array_client[26]."',
sales='".$array_client[28]."',
store_sales='".$array_client[30]."',
state='".$array_client[32]."',
store_state='".$array_client[34]."',
getpricedate='".$array_client[36]."',
storedate='".$array_client[38]."'
where stockid='".$array_client[0]."'
and typeabbrev='".$array_client[2]."'";
$result = mysql_query($sql,$mysql);
//判斷伺服器是否接收到資料,並返回值
if ($array_client[16]=='2017-08-05')
{
$this->posted = TRUE;
}
else
{
$this->posted = FALSE;
}
}
}
//驗證登入資訊是否正確
function feline()
{
if($this->Authenticated)
{
[email protected]_connect("localhost","root","");
if (!$mysql)
{
die('Could not connect: ' . mysql_error());
}
$get_now=date('2017-05-09');
$mysql_database="weberp";
$aa=mysql_query("set names utf8;");
$mysql_database=mysql_select_db($mysql_database);
$sql="select * from prices where updatedate='".$get_now."' limit 5";
//獲取有競爭者id的記錄。
$result = mysql_query($sql,$mysql);
//遍歷資料庫 並把資料做成陣列形式
while($row = mysql_fetch_array($result))
{
//var_dump($row);
$array[]=$row;
}
//var_dump($array[0]['getpricedate']);
return $array;
}
else
{
return '驗證錯誤,請檢查';
}
}
function postval()
{
if ($this->posted)
{
return "已獲取資料";
}
elseif($this->posted='FALSE'){ return "獲取資料失敗";}
}
//連線資料庫,獲取資料並轉換為陣列
}
$options = array('uri'=>'XXXXXXXXX/');
$server = new SoapServer(NULL,$options);
try {
//$server->setClass('MySoapServer');
$server->setClass('mysoapclass');
//$server->addFunction("add_number");
$server->handle();
} catch(SoapFault $fault) {
echo 'SoapFault:'.$fault->faultstring;
}
//var_dump($server);
?>
以上程式碼作用是伺服器端接收到客戶端提交的資料後,先驗證賬號密碼是否為admin,123456,然後再執行對字串資料的解析。
然後更新到伺服器的資料庫中。
下面那一段是從伺服器資料庫獲取一些資料,傳回給客戶端client。並返回提交資料成功的值即”已獲取資料”。
當然,如果賬號密碼錯誤。會返回失敗值。
接下來為客戶端。soapClient_local.php
<?php
/*
* 定義一個SOAP客戶端
*/
header("Content-type: text/html;charset=utf-8");
ini_set("soap.wsdl_cache_enabled", "0");
//下面這裡就是簡單的定義,和身份驗證一樣。
class authentication_header
{
var $username;
var $password;
var $clientsoap;
public function __construct($username, $password,$clientsoap)
{
$this->username = $username;
$this->password = $password;
$this->clientsoap = $clientsoap;
}
}
$options = array(
'location'=>'XXXXXXXXX/soapService_local.php',
'uri'=>'XXXXXXXXX/
'
);
$client = new SoapClient(NULL,$options);
try {
//獲取人工修改過新增的資料,和賬號密碼一併封裝,傳送給service端。
[email protected]_connect("localhost","root","");
if (!$mysql)
{
die('Could not connect: ' . mysql_error());
}
$mysql_database="weberp";
$aa=mysql_query("set names utf8;");
$mysql_database=mysql_select_db($mysql_database);
$post_sql="select * from prices where updatedate='2017-08-05' limit 1";
$post_result=mysql_query($post_sql,$mysql);
while($post_row=mysql_fetch_array($post_result))
{
$array[]=$post_row;
}
//var_dump($array[0]);
//從資料庫獲取到的資料為陣列形式,將其轉化為字串形式。
$clientsoap=implode("##",$array[0]);
//var_dump($clientsoap);
//把賬號密碼和所需傳輸的字串資料封到一起。
$auth = new authentication_header('admin', '123456',$clientsoap);
$authvalues = new SoapVar($auth, SOAP_ENC_OBJECT, 'authenticate','XXXXXXXXX/
');
$header = new SoapHeader('XXXXXXXXX/', 'authenticate', $authvalues,true);
$re=$client->__setSoapHeaders(array($header));
//$message = $client->get_message();
$result =$client->__soapCall('feline',array());
$postval =$client->__soapCall('postval',array());
var_dump($postval);
var_dump($result);
}
catch(SoapFault $fault) {
var_dump($fault);
}
?>
以上客戶端的功能就是把資料庫內獲取到得陣列形式的資料,和賬號密碼一起打包,然後傳送到伺服器。
對此,有一個基礎的框架,剩下的在這上面再完善下,對於安全性來說應該有很大的問題,不過對於小公司用的erp來說,暫且可以使用著。
謝謝
相關推薦
php webservice實現客戶端提交資料庫資料到伺服器並返回另一份資料庫資料
由於公司需求,需使用webservice來開發公司erp的伺服器和客戶端的兩邊資料庫交換。 即每次把客戶端更新的資料上傳到生產用的伺服器端並把伺服器端剛更新的資料返回回來。(伺服器端有指令碼在執行更新資料) 由於使用的是php語言,當前網路上大部分解決上傳問題的都是jav
AJAX+Servlet實現客戶端無重新整理請求伺服器實踐
最近需要做一個在網頁中要不斷檢測伺服器端資料程式,當然最簡單的方法是在html頁面頭部加以下標籤 <META http-equiv=V="REFRESH" content="5;URL=本頁面url"> 實現將網頁設成每隔5秒鐘將自身頁面重新整理一次
專案總結:每隔5分鐘從資料庫拉取資料轉為Json格式通過WebService從客戶端傳送至服務端
第一次接手需求寫的小專案,過程也有點坎坷,以此記錄總結編碼過程中遇到的問題。 專案背景:本次寫的是一個小模組,主要為客戶端,作用是每隔5分鐘從資料庫拉取資料傳送至服務端。本次專案採用的是spring3+Quartz+JdbcTemplate+J
python : 通過socket的Tcp/ip協議實現客戶端與服務端的資料互動
#服務端 繫結socket 繫結目的ip和埠 建立監聽 建立連線 資料互動 import socket ''' #建立socket :通過server接收 #繫結目的ip和埠號 #設定監聽 #建立連線Socket,Address接收資訊 #資料互
大資料教程(8.6)yarn客戶端提交job的流程梳理和總結&自定義partition程式設計
上一篇部落格博主分享了mapreduce的並行原理,本篇部落格將繼續分享yarn客戶端提交job的流程和自定義partition程式設計。 一、
java利用socket實現客戶端與伺服器的連線與資料傳遞
網路上的兩個程式通過一個雙向的通訊連線實現資料的交換,這個雙向鏈路的一端稱為一個 socket。socket 也就是套接字,可以用來實現不同虛擬機器或者不同計算機之間的通訊。在 Java 語言中,socket 可以分為兩種型別:面向連線的 socket 通訊協議(TCP)和麵向無連線的 socket
客戶端提交資料給伺服器端,如果資料中帶有中文的話,有可能會出現亂碼情況
request: 如果是GET方式 程式碼轉碼 String username = request.getParameter("username"); String password = request.getParameter("password"); String use
利用Axis2開發WebService(3)---用Java實現呼叫WebService的客戶端程式
WebService是為程式服務的,只在瀏覽器中訪問WebService是沒有意義的。因此,在本節使用Java實現了一個控制檯程式來呼叫上一節釋出的WebService。呼叫WebService的客戶端程式碼如下: package client; impor
使用TCP協議實現客戶端和伺服器資料傳輸
/*客戶端和服務端互訪,傳輸位元組流*/ import java.net.*; import java.io.*; class TCPClient2 { public static void main(String[] args) throws Exception
http協議從客戶端提交資料給伺服器並返回資料
老羅視訊學習。 本例從客戶端提交資料給伺服器,伺服器接收到資料之後,看是否匹配,匹配返回字串“login is success!”,失敗返回“login is error!” 一.客戶端。 初始化url地址 private static String path = "h
socket用執行緒實現客戶端和伺服器端連續傳送資料
總共涉及到四個類。 其中包括,一個客戶端client,一個服務端server, 然後伺服器端和客戶端都有傳送和接收的功能,所以還有一個傳送類sendThread實現runnable介面,還有個接收類receiveThread實現runnable介面。 在客戶端client和
使用Javascript實現客戶端資料驗證
</pre><p>1.獲取表單中輸入的資料</p><p>2.驗證表單中輸入的資料</p><pre name="code" class="html"><!DOCTYPE html PUBLIC "-
使用WebService釋出soap介面,並實現客戶端的https驗證
什麼是https HTTPS其實是有兩部分組成:HTTP + SSL / TLS, 也就是在HTTP上又加了一層處理加密資訊的模組,並且會進行身份的驗證。 如何進行身份驗證? 首先我們要明白什麼是對稱加密,什麼是非堆成加密 對稱加密 對稱加密就是隻有一個金鑰,客戶端雙方按照約定的金鑰對自己的明文進行加密。 但
PHP 可以獲取客戶端哪些訪問信息
名稱 版本 charset ive rip set 並且 虛擬主機名 -1 php是一種弱類型的程序語言,但是最web的 在程序語言中有系統全局函數: $_SERVER <?php echo "".$_SERVER[‘PHP_SELF‘];#當前正在執行腳本
初涉掃碼登錄:edusoho實現客戶端掃碼登錄(簡版)
confirm 鍵值 版本號 error == form 通過 遮罩層 strrev 一、項目簡介及需求 edusoho是一套商業版的在線教育平臺,項目本身基於symfony2框架開發,現在有一款自己的APP,要求在不多修改edusoho自身代碼的基礎上,實現客戶端對P
springCloud(7):Ribbon實現客戶端側負載均衡-消費者整合Ribbon
spring cloud ribbon 消費者整合ribbon 一、簡介 Ribbon是Netfix發布的負載均衡器,它有助於控制HTTP和TCP客戶端的行為。為Ribbon配置服務提供者地址列表後,Ribbon就可基於某種負載均衡算法,自動地幫助服務消費者去請求。Ribbon默認為我們提供了很
springCloud(8):Ribbon實現客戶端側負載均衡-自定義Ribbon配置
spring cloud ribbon 自定義ribbon配置 一、簡介很多場景下,可能根據需要自定義的Ribbon的配置,例如修改Ribbon的負載均衡規則等。Spring cloud Camden允許使用Java代碼或屬性自定義Ribbon的配置。二、使用Java代碼自定義Ribbon配置在S
Socket編程實現客戶端與服務器一對一聊天
bug servers sys 編程 獲取 post edr class 一個 Socket(套接字) 使用Socket編程實現數據的交互需要經歷以下幾個步驟: 1、創建Socket: Socket socket = new Socket("host",p
Netty實現客戶端和服務端通信簡單例子
啟動服務 ali tty 過程 等等 服務器初始化 讀寫操作 extends ask Netty是建立在NIO基礎之上,Netty在NIO之上又提供了更高層次的抽象。 在Netty裏面,Accept連接可以使用單獨的線程池去處理,讀寫操作又是另外的線程池來處理。 Accep
簡單實現客戶端服務端互聯通信
fail AI put tin turn 服務端 sizeof tdi sock /*服務端程序*/#include <stdio.h>#include <stdlib.h>#include<sys/types.h>#include&l