PHP无法正确处理来自C#webclient的数据
因此,我使用webclient将一些数据从我的C#应用程序发送到我的PHP脚本,该脚本位于远程服务器上。我遇到的问题是,我用来存储数据的NameValueCollection在工作,但每当我的PHP脚本点击对象开关时,它就会说类型无效,这基本上意味着开关转到默认语句 这是我的C#应用程序中的代码:PHP无法正确处理来自C#webclient的数据,c#,php,C#,Php,因此,我使用webclient将一些数据从我的C#应用程序发送到我的PHP脚本,该脚本位于远程服务器上。我遇到的问题是,我用来存储数据的NameValueCollection在工作,但每当我的PHP脚本点击对象开关时,它就会说类型无效,这基本上意味着开关转到默认语句 这是我的C#应用程序中的代码: private static void send_it(string jobj) { // this is where I enc
private static void send_it(string jobj)
{
// this is where I encode my JSON object to base_64
var b64bytes = System.Text.Encoding.UTF8.GetBytes(json);
b64encode = System.Convert.ToBase64String(b64bytes);
var data = new NameValueCollection();
// this is where I add the data
data["b64string"] = b64encode;
data["filename"] = dt.bedrijfsNaam;
using (WebClient client = new WebClient())
{
var sendB64 = client.UploadValues("http://theurl/script.php", "POST", data);
}
}
(很抱歉我的代码布局不好,当我与github同步时,这有点混乱)
这就是我的jobj参数的样子:
json = "{\"type\":\"" + cat + "\"," +
"\"bedrijfsNaam\":\"" + dt.bedrijfsNaam + "\"," +
"\"omzet\":\"" + dt.Omzet + "\"," +
"\"nieuweklanten1\":\"" + dt.NieuweKlanten + "\"," +
"\"propsects\":\"" + dt.skProspects + "\"," +
"\"hotprospects\":\"" + dt.skHotProspects + "\"," +
"\"afsprakenmaken\":\"" + dt.afsMak + "\"," +
"\"afspraken\":\"" + dt.afs + "\"," +
"\"offertesmaken\":\"" + dt.offMak + "\"," +
"\"gescoordeoffertes\":\"" + dt.gescOff + "\"," +
"\"nieuweklanten2\":\"" + dt.newKlant + "\"}";
这是我的PHP脚本的一部分:
if($link ->connect_errno) {
echo 'ERROR: no connection!';
} else {
if(isset($_POST)) {
$obj = json_decode(base64_decode($_POST['b64string']));
$cat = $obj->type;
switch($obj->type) {
case 'main':
$database = 'SalesKicker';
$pre = 'INSERT INTO ' . $database['main'] . ' VALUES ';
store_main_data($pre);
break;
case 'second':
$database = 'SalesKicker';
$pre = 'INSERT INTO ' . $database['second'] . ' VALUES ';
store_sec_data($pre);
break;
default:
echo 'ERROR: Invalid Category'
break;
}
print_r($obj);
} else {
echo 'ERROR: no data! <br>
The object returns: <br>';
vardump($obj);
}
}
function store_sec_data($pre) {
$query_save = $pre . "('" . $obj->bedrijfsNaam ."' , '". $obj->omzet ."' , '". $obj->nieuweklanten1 ."' , '". $obj->prospects ."' , '". $obj->hotprospects ."' , '". $obj->afsprakenmaken ."' , '". $obj->afspraken ."' , '". $obj->offertesmaken ."' , '". $obj->gescoordeoffertes ."' , '". $obj->nieuweklanten2 ."')";
save($query_save);
}
function save($query) {
mysqli_query($link, $query) or die(mysqli_error($query));
}
向请求添加
内容类型
标题的内容是什么
默认值(在.NET中-您的库可能不同)是application/x-www-form-urlencoded
,它是为常规表单/简单数据设计的
使用base64数据应该没问题,但是您可以尝试将标题设置为多部分/表单数据
,因为这样可以处理更复杂(更长)的数据元素
如果您使用的是另一个
内容类型
标题,则数据将位于邮件正文中,而不是$u POST中。看看$contents=file\u get\u contents('php://input');
查看它是否在那里,并从$contents处理您自己。如果您确定检索数据的PHP代码存在问题,那么您可以使用以下选项修复该问题
if($link ->connect_errno) {
echo 'ERROR: no connection!';
} else {
echo "<pre>";
var_dump($_POST); // then check for var_dump($_REQUEST);
die("debugging request");
if(isset($_POST['b64string'])) {
$cat = $obj->type;
switch($cat) {
//Do existing PHP operation
另外,在mysql查询中,在数据库查询中插入数据时,使用``来编码字段值,而不是'。我知道了 问题是,我的应用程序发送到API的数据是有效的,除了sql查询之外,一切都正常 我不得不用这个:
function save($query) {
mysqli_query($link, $query) or die(mysqli_error($query));
}
而不是这个:
这解决了我的问题
提示:
永远不要使用Client.DownloadString();用于调试API。这会让你感到困惑,就像我一样。你试过webclient.UploadString()吗?运行Fiddler执行代码会准确显示发送的内容。@Jacobr365我知道你的意思,但我认为这只适用于JSON,正如你所看到的,我正在用base_64加密JSON对象。@AlexK。很抱歉回答得太晚,但小提琴手说它正确发送了b64字符串和文件名。因此,我的PHP脚本一定有问题。这个问题的范围如何随着每次评论和后续编辑而变化,这并不好。同时,已经证明WebClient和PHP都没有问题,POST工作得很好,但事实上问题出在代码中。目前的问题是“开关不工作”。我可以向您保证PHP的
switch()
也没有损坏。如果var\u dump($obj)
确实显示了输出中显示的[type]=>main
,则开关将完全按照预期工作。请阅读并重新开始这个问题,恐怕目前无法回答。每当我尝试将请求头更改为其他内容时,它会抛出一个异常,并显示以下消息:“System.dll中发生类型为'System.Net.WebException'的未处理异常。其他信息:无法更改此请求的内容类型标头的默认值。”。“查看我添加到问题中的图像,这可能会澄清一些问题。查看我添加到问题中的图像,这可能会澄清一些问题。此外,在数据库查询中插入数据时,您需要注意mysql查询中使用``来编码字段值,而不是''。在这样测试API端点时,另一件事是分离测试,因为您正试图测试发送(从应用程序)和接收(使用PHP)同时,。您最好使用或测试独立于发送代码的接收代码,这样您就可以更有效地隔离问题所在。是的,我也有这个问题,但现在已经解决了,谢谢@B.Hulshof
if($link ->connect_errno) {
echo 'ERROR: no connection!';
} else {
if(isset($_REQUEST['b64string'])) {
$cat = $obj->type;
switch($cat) {
//Do existing PHP operation
if($link ->connect_errno) {
echo 'ERROR: no connection!';
} else {
content = file_get_contents('php://input');
if(isset($content)) {
$cat = $obj->type;
switch($cat) {
//Do existing PHP operation
function save($query) {
global $link;
mysqli_query($link, $query) or die(mysqli_error($query));
}
function save($query) {
mysqli_query($link, $query) or die(mysqli_error($query));
}