如何使用WinRT将json发布到网站?

时间:2012-11-12 22:06:57

标签: c# json microsoft-metro windows-runtime

我正在尝试将此JSON数据字符串发布到我的php站点:

{
    "tag":"login"
    "email":"email@email.com"
    "password":"P@ssw0rd"
}

这是我的C#代码:

        HttpClient client = new HttpClient();
        client.BaseAddress = new Uri("http://localhost/login/");
        string link = "http://localhost/login/";

        UserCredentials cred = new UserCredentials(email.Text, pass.Password.ToString());
        var data = new Dictionary<string, List<UserCredentials>>();
        string json = JsonConvert.SerializeObject(data, Formatting.Indented);


        HttpResponseMessage re = await client.PostAsync(link, new StringContent(json));

用户凭据类:

public class UserCredentials
{
    public UserCredentials(string user, string pass)
    {
        User = user;
        Pass = pass;
        Tag = "login";
    }

    internal string User;
    internal string Pass;
    internal string Tag;
}

在我的php脚本中:

<?php

if (isset($_POST['tag']) && $_POST['tag'] != '') {
  echo "got tags";
else 
  echo "didn't get anything";
?>

有谁知道我应该如何通过postasync方法发送标签?我得到'没有得到任何东西'..请帮助

3 个答案:

答案 0 :(得分:1)

首先,修复UserCredentials类。让你的成员公开,而不是内部。

public class UserCredentials
{
    public UserCredentials(string user, string pass)
    {
        User = user;
        Pass = pass;
        Tag = "login";
    }

    public string User;
    public string Pass;
    public string Tag;
}

其次,仅序列化您的凭据。

UserCredentials cred = new UserCredentials(email.Text, pass.Password.ToString());
string json = JsonConvert.SerializeObject(cred, Formatting.Indented);
System.Diagnostics.Debug.WriteLine(json);

您将在“输出”窗口中看到如下内容:

{
  "User": "me@hotmail.com",
  "Pass": "ILoveToEatGrapes",
  "Tag": "login"
}

第三,将StringContent替换为FormUrlEncodedContent

如果您使用的是PHP $_POST,则必须在HTTP请求中发送key1=value1&key2=value2之类的内容。这称为x-www-form-urlencoded,HttpClient包含正确的类:FormUrlEncodedContent

FormUrlEncodedContent会收到键/值对字典。

// Create the list of keys and values.
var data = new Dictionary<string, string>();
data["tag"] = json;

// Send my keys and values.
HttpClient client = new HttpClient();
string link = "http://localhost/login/";
HttpResponseMessage re = await client.PostAsync(link, new FormUrlEncodedContent(data));

这将通过连接发送:

POST /login/ HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Host: localhost
Content-Length: 142
Expect: 100-continue
Connection: Keep-Alive

tag=%7B%0D%0A++%22User%22%3A+%22me%40hotmail.com%22%2C%0D%0A++%22Pass%22%3A+%22I
LoveToEatGrapes%22%2C%0D%0A++%22Tag%22%3A+%22login%22%0D%0A%7D

第四,在PHP中使用您的数据

如上所述,数据采用大量百分号进行编码。 PHP会自动为您解码数据,因此您无需担心这一点。

要将凭据从json转换为数组,您可以使用json_decode

$cred = json_decode($_POST['tag']);

答案 1 :(得分:0)

创建信用卡但未添加到data可能会导致空集

UserCredentials cred = new UserCredentials(email.Text, pass.Password.ToString());
var data = new Dictionary<string, List<UserCredentials>>();
data["key"] = new List<UserCredentials>{cred};
string json = JsonConvert.SerializeObject(data, Formatting.Indented);

答案 2 :(得分:0)

您使用字典的任何原因(好吧,您实际创建它但不填写它)而不是该对象立即使用?

    UserCredentials cred = new UserCredentials(email.Text, pass.Password.ToString());
    string json = JsonConvert.SerializeObject(cred, Formatting.Indented);