1

我有以下问题。我有通过 POST 发送 json 的方法:

public string request (string handler, string data) 
{
    WebRequest request = WebRequest.Create(baseUri + "/?h=" + handler);
    request.Method = "POST";
    request.ContentType = "text/json";

    string json = "json=" + data;
    byte[] bytes = Encoding.ASCII.GetBytes(json);
    request.ContentLength = bytes.Length;

    Stream str = request.GetRequestStream();
    str.Write(bytes, 0, bytes.Length);
    str.Close();

    WebResponse res = request.GetResponse();
    StreamReader sr = new StreamReader(res.GetResponseStream());
    lastResponse = sr.ReadToEnd();
    return lastResponse;
}

在服务器上使用该方法时,POST 中没有数据。好像这段代码没有执行。

Stream str = request.GetRequestStream();
str.Write(bytes, 0, bytes.Length);
str.Close();

在服务器上,我使用以下 php 脚本进行调试:

<?php print_r($_POST); ?>

还尝试如下写入流:

StreamWriter strw = new StreamWriter(request.GetRequestStream());
strw.Write(json);
strw.Close();

结果 - 零响应。作为响应,出现了一个空数组。

4

2 回答 2

1

问题是,PHP 不能“识别” text/json-content 类型。因此不解析 POST-request-data。您必须使用application/x-www-form-urlencoded内容类型,其次您必须正确编码 POST 数据:

// ...
request.ContentType = "application/x-www-form-urlencoded";

string json = "json=" + HttpUtility.UrlEncode(data);
// ...

如果您打算直接提供 JSON 数据,您可以将内容类型保留为text/json并将数据直接传递为json(没有“json =”部分):

string json = data;

但在这种情况下,您必须在 PHP 端更改脚本以直接读取发布数据:

// on your PHP side:
$post_body = file_get_contents('php://input');
$json = json_decode($post_body);
于 2012-07-31T05:43:18.860 回答
0

您是否考虑过使用 WebClient.UploadValues。使用以“json”为名称、以 JSON 数据字符串为值的 NameValueCollection?

这似乎是最简单的方法。不要忘记您始终可以向 WebClient 添加标头和凭据。

于 2012-07-31T05:43:59.967 回答