2016-06-07 73 views
-1

因此,我有一個應用程序創建一個JSON文件與用戶的一些數據。這些數據應該通過位於服務器上的PHP腳本解碼並存儲到數據庫中。我想發佈$ _POST變量文件名到php腳本來使用它來檢索JSON文件。這是我當前的PHP腳本:C#如何通過HTTP發佈數據到PHP並運行它

<?php 
$host='myip'; 
$user='username'; 
$pass='userpass'; 
$db='database'; 

$link= mysqli_connect($host, $user, $pass, $db) or die(msqli_error($link)); 

$filename = $_POST['filename'] . '.json'; 

$json = file_get_contents($filename); 
$obj = json_decode($json,true); 

foreach ($obj as $data) 
{ 
$query_opslaan = "INSERT INTO skMain (BedrijfsName, ContPers, TelNum, email, Land, Plaats, PostCode) VALUES ('". $data['bedrijfsNaam'] ."' , '". $data['ContPers'] ."', '". $data['TelNum'] ."', '". $data['email'] ."', '". $data['Land'] ."', '". $data['Plaats'] ."', '". $data['PostCode'] ."')"; 
} 
?> 

這是我的JSON文件

{ 
"bedrijfsNaam":"JohnDoeMedia", 
"ContPers":"John Doe", 
"TelNum":"1234567890", 
"email":"[email protected]", 
"Land":"Nederland", 
"Plaats":"somewhere", 
"PostCode":"1234 AB" 
} 

我目前只在C#上傳腳本,但我不知道如何使用它來運行這個PHP腳本和存儲數據到PHP變量$ _ POST [「名」]這裏是商店腳本:

 WebRequest hwr = WebRequest.Create(serverPath); 
     hwr.Method = WebRequestMethods.Ftp.UploadFile; 
     hwr.Credentials = new NetworkCredential(ftpUser, ftpPass); 

     if (reqCat == "bvg") 
     { 
      json = "{\"bedrijfsNaam\":\"" + bedrijfsNaam + "\"," + 
          "\"ContPers\":\"" + ContPers + "\"," + 
          "\"TelNum\":\"" + TelNum + "\"," + 
          "\"email\":\"" + email + "\"," + 
          "\"Land\":\"" + Land + "\"," + 
          "\"Plaats\":\"" + Plaats + "\"," + 
          "\"PostCode\":\"" + PostCode + "\"}"; 
      using (var sw = new StreamWriter(hwr.GetRequestStream())) 
      { 
       sw.Write(json); 
       sw.Flush(); 
       sw.Close(); 
      } 
     } 

有人可以教我做這項工作的方法是什麼?

+0

即JSON是無效的,它應該是一個對象,而不是陣列。 –

+0

但它保存得很好 –

+0

此外,您的插入查詢似乎缺少每條數據周圍的單引號。我建議尋找具有綁定參數的PDO來清理它。 – jszobody

回答

1

因爲我認爲你可能會感到困惑,所以我會採取刺探措施。你提到你正試圖發佈數據,但你的代碼顯示你正試圖直接向服務器FTP。

我已經包含了我用來FTP到服務器的代碼。如果你真的想通過網絡服務調用發佈,這不會做到這一點。

 FtpWebRequest lRequest = (FtpWebRequest)WebRequest.Create(serverPath);   
     lRequest.Method = WebRequestMethods.Ftp.UploadFile; 
     lRequest.Credentials = new NetworkCredential(ftpUser, ftpPass); 
     StreamReader lReader = new StreamReader(json); 

     //convert steam to utf8 
     byte[] lContents = Encoding.UTF8.GetBytes(lReader.ReadToEnd()); 
     lReader.Close(); 

     //Get length of data to post 
     lRequest.ContentLength = lContents.Length; 

     //Get your request stream 
     Stream lRequestStream = lRequest.GetRequestStream(); 

     //Write to the stream 
     lRequestStream.Write(lContents, 0, lContents.Length); 

     //Close the stream 
     lRequestStream.Close(); 

     //Get the response from the server 
     FtpWebResponse lResponse = (FtpWebResponse)lRequest.GetResponse(); 

     //What is the actual status. 
     MessageBox.Show(String.Format("Upload File Complete, status {0}", lResponse.StatusDescription)); 

請注意,您必須使用和不喜歡你,但我已經使用該代碼來ftp到服務器。我稍微修改它以嘗試使用您的變量名稱。

由於請求是使用HTTP發送一個文件名我已經添加到我的答案。在下面的代碼中,大部分是uri。我假設你可以創建你的URI作爲運行php的web服務。它看起來像... ...其中SERVERPATH是你的服務器與script.php並假設您的PHP腳本正在尋找的參數稱爲文件名。該代碼還包括處理來自服務器的響應,但您可能不需要這樣做,具體取決於您希望服務器執行的操作。

另請注意,接受和內容類型可能不相關,除非您期望從服務器返回。你最關心的兩行是WebRequest.Create(xUri)和lRequest.GetResponse()來實際執行你的web請求。

HTTP:// SERVERPATH/PHP_SCRIPT文件名= FILENAME

private void CallWebApi(String xUri) 
    { 
     String lResults; 
     using(WebClient lClient = new WebClient()) { 
      try { 
       HttpWebRequest lRequest = (HttpWebRequest)WebRequest.Create(xUri); 
       lRequest.Accept = "application/json"; 
       lRequest.ContentType = "application/json"; 
       HttpWebResponse lResponse = (HttpWebResponse)lRequest.GetResponse(); 
       using(StreamReader lJsonReader = new StreamReader(lResponse.GetResponseStream())) { 
        lResults = lJsonReader.ReadToEnd(); 
       } 

       lRequest = (HttpWebRequest)WebRequest.Create(xUri); 
       lRequest.Accept = "application/xml"; 
       lRequest.ContentType = "application/xml"; 
       lResponse = (HttpWebResponse)lRequest.GetResponse(); 
       using(StreamReader lXMLReader = new StreamReader(lResponse.GetResponseStream())) { 
        lResults = lXMLReader.ReadToEnd(); 
       } 

      } 
      catch(Exception lException) { 
       MessageBox.Show(lException.Message); 
      } 
     } 
    } 
+0

對不起。我的意思是HTTP。我用FTP來存儲文件。 –

+0

因此,這些文件已經在服務器上,並且您想使用帶有文件名的POST來告訴PHP服務器在文章中對文件做些什麼? –

+0

是的。 PHP會從$ _POST ['filename']變量中獲取文件名,如您在代碼中所見。我需要通過我的C#腳本進行設置 –

相關問題