PHP无法正确处理来自C#webclient的数据

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

因此,我使用webclient将一些数据从我的C#应用程序发送到我的PHP脚本,该脚本位于远程服务器上。我遇到的问题是,我用来存储数据的NameValueCollection在工作,但每当我的PHP脚本点击对象开关时,它就会说类型无效,这基本上意味着开关转到默认语句

这是我的C#应用程序中的代码:

        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代码存在问题,那么您可以使用以下选项修复该问题

  • 在$\u POST数据检索之前,您可以通过以下代码调试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
    
  • 使用此代码检索数据文件\u获取\u内容('php://input")


  • 另外,在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));
    }