关于将数据以json方式Post给API接口的写法的问题

cyh732 2018-11-26 12:12:48
各位老师,我没有接触过关于发送POST请求的方法,在这里想请问一下要怎么写才可以将数据完整的以POST的方式发送给对方的API接口呢?

---------------------------------------------------------------------------------------------------------------------------------

加密口令:saadfasdf
牌照:湘A00001
公司名称:湖南汽车厂
识别码:xa00001
里程:321.3
故障现象:启动不了

更换零件:
名称:点火钥匙 数量:2 单号:pj0001
名称:电闸开关 数量:1 单号:pj0002


对方的调试参数信息如下:

Content-Type: application/json; encoding=utf-8

{info:{"access_token":"saadfasdf"}basicInfo:{"vehicleplatenumber":"湘A00001","companyname":"湖南汽车厂","vin":"xa00001","repairmileage":"321.3","faultdescription":"启动不了"},vehiclepartslist:[{"partsname":"点火钥匙","partsquantity":"2","partscode":"pj0001"},{"partsname":"电闸开关","partsquantity":"1","partscode":"pj0002"}]}


----------------------以下是我自己写的一个方法,但是系统总是提示参数不全,求指点--------------
 protected string re_gdadd(string url)
{
string re_str = "";
try
{
//格式化参数
#region
string postData = "给我的感觉主要是这里写不对,仿写了不少的例子都是提示参数不足,求指点!~~~";

HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
req.Method = "POST";
req.Timeout = 800;//设置请求超时时间,单位为毫秒
req.ContentType = "application/json";

byte[] data = Encoding.UTF8.GetBytes(postData);

req.ContentLength = data.Length;

using (Stream reqStream = req.GetRequestStream())
{
reqStream.Write(data, 0, data.Length);

reqStream.Close();
}

HttpWebResponse resp = (HttpWebResponse)req.GetResponse();

Stream stream = resp.GetResponseStream();

//获取响应内容
using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
{
re_str = reader.ReadToEnd();
}

#endregion
}
catch (InvalidCastException e)
{
re_str = e.Message;
}
return re_str;

}

...全文
949 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
cyh732 2018-11-28
  • 打赏
  • 举报
回复
最后发现是对方写文档时写错了,不能直接传JSON,要打包成NameValuePair来传,让楼上两位老师操心了。
cyh732 2018-11-26
  • 打赏
  • 举报
回复
谢谢楼上老师哈,好像是key写错了,我再试试
  • 打赏
  • 举报
回复
引用 12 楼 cyh732 的回复:
用"{\"key\":\"value",\"key2\":\"value2"}"可以提交 用"{info:{\"key\":\"value",\"key2\":\"value2"}}"就提示参数为空
人家需要什么参数就传什么参数。人家对象需要 key 参数,你给一个 info 参数,当然不行。
  • 打赏
  • 举报
回复
对方返回“参数为空”,说明对方解析了指令,跟这里的编程就没有直接关系了。是你的 json 指令中缺少必要的参数。
cyh732 2018-11-26
  • 打赏
  • 举报
回复
引用 11 楼 娃都会打酱油了 的回复:
var postData = @"{info:{""access_token"":""saadfasdf""}basicInfo:{""vehicleplatenumber"":""湘A00001"",""companyname"":""湖南汽车厂"",""vin"":""xa00001"",""repairmileage"":""321.3"",""faultdescription"":""启动不了""},vehiclepartslist:[{""partsname"":""点火钥匙"",""partsquantity"":""2"",""partscode"":""pj0001""},{""partsname"":""电闸开关"",""partsquantity"":""1"",""partscode"":""pj0002""}]}";

你这样传进去就应该对了


谢谢版主,返回还是说“参数为空”。。。。

我用这个传不进去

string postData = "{\"companycode\":\"user01\",\"companypassword\":\"123456\"}";
string url_str = "https://****************";
var resultBytes = new WebClient().UploadData(url_str, Encoding.UTF8.GetBytes(postData));
var resultString = Encoding.UTF8.GetString(resultBytes);
TextBox1.Text = resultString;


我试着用了个百度到的写法,试着先提交一组参数获取加密口令可以成功,但是就是提交有几组参数时,老是提示参数为空,直接转义好像没用

用"{\"key\":\"value",\"key2\":\"value2"}"可以提交
用"{info:{\"key\":\"value",\"key2\":\"value2"}}"就提示参数为空

//用下面的方法可以成功


string url_str = "https://****************";
var postData = "{\"companycode\":\"user01\",\"companypassword\":\"123456\"}";

HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
req.Method = "POST";
req.Timeout = 800;//设置请求超时时间,单位为毫秒
req.ContentType = "application/json";

byte[] data = Encoding.UTF8.GetBytes(postData);

req.ContentLength = data.Length;

using (Stream reqStream = req.GetRequestStream())
{
reqStream.Write(data, 0, data.Length);

reqStream.Close();
}

HttpWebResponse resp = (HttpWebResponse)req.GetResponse();

Stream stream = resp.GetResponseStream();

//获取响应内容
using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
{
TextBox1.Text = reader.ReadToEnd();
}
  • 打赏
  • 举报
回复
var postData = @"{info:{""access_token"":""saadfasdf""}basicInfo:{""vehicleplatenumber"":""湘A00001"",""companyname"":""湖南汽车厂"",""vin"":""xa00001"",""repairmileage"":""321.3"",""faultdescription"":""启动不了""},vehiclepartslist:[{""partsname"":""点火钥匙"",""partsquantity"":""2"",""partscode"":""pj0001""},{""partsname"":""电闸开关"",""partsquantity"":""1"",""partscode"":""pj0002""}]}";
你这样传进去就应该对了
cyh732 2018-11-26
  • 打赏
  • 举报
回复
引用 7 楼 以专业开发人员为伍 的回复:
对于你的 postData 来说,假设是你贴出的已经是 json 字符串,把内容里边的双引号转义为 \" 就行了;假设要发送的是一个对象,那么使用一个 json 序列化类库(例如Newtonsoft.Json)序列化为字符串。



老师,我还是没试出来,我用我理解中的你的做法,弄了个简单的获取加密口令都是返回“信息为空”。。。。

string postData = "{\"companycode\":\"user01\",\"companypassword\":\"123456\"}";
string url_str = "https://****************";
var resultBytes = new WebClient().UploadData(url_str, Encoding.UTF8.GetBytes(postData));
var resultString = Encoding.UTF8.GetString(resultBytes);
TextBox1.Text = resultString;
cyh732 2018-11-26
  • 打赏
  • 举报
回复
好像听懂一些了, 下午去单位试试,谢谢楼上的老师了哈。
cyh732 2018-11-26
  • 打赏
  • 举报
回复
请问是不是就是把下面这段看成是一个字符串那样发送,一次性就把所有参数发完,对方就能接收到了? {info:{"access_token":"saadfasdf"}basicInfo:{"vehicleplatenumber":"湘A00001","companyname":"湖南汽车厂","vin":"xa00001","repairmileage":"321.3","faultdescription":"启动不了"},vehiclepartslist:[{"partsname":"点火钥匙","partsquantity":"2","partscode":"pj0001"},{"partsname":"电闸开关","partsquantity":"1","partscode":"pj0002"}]}
  • 打赏
  • 举报
回复
对于你的 postData 来说,假设是你贴出的已经是 json 字符串,把内容里边的双引号转义为 \" 就行了;假设要发送的是一个对象,那么使用一个 json 序列化类库(例如Newtonsoft.Json)序列化为字符串。
  • 打赏
  • 举报
回复
cmd 就是你要 post 的数据啊。
cyh732 2018-11-26
  • 打赏
  • 举报
回复
引用 2 楼 以专业开发人员为伍 的回复:
客户端就是写个 new WebClient().UploadData(...., .....) 函数就行了,不要搞那么复杂。 服务器端(不论是 asp.net 还是桌面/服务器)也比较简单,接收数据也是一句话的事儿。.net 里边有现成的直截了当的代码,把代码写那么复杂是为了啥?
写得复杂是因为自已菜,又仿写在网上的例子,请问一下 var resultBytes = new WebClient().UploadData(url, Encoding.UTF8.GetBytes(cmd)); 这里面的cmd要怎么写才能按要求把我的数据发给对方的接口呢?
cyh732 2018-11-26
  • 打赏
  • 举报
回复


public string SendMessag(string url, string cmd)//请问这里的cmd是指我要发送的那些数据吗?请问模式是什么样的呢?
{
    var resultBytes = new WebClient().UploadData(url, Encoding.UTF8.GetBytes(cmd));
    var resultString = Encoding.UTF8.GetString(resultBytes);
    return resultString;
}
cyh732 2018-11-26
  • 打赏
  • 举报
回复
首先,谢谢楼上这位老师,本人比较菜,有一些没看懂的地方。
  • 打赏
  • 举报
回复
客户端就是写个 new WebClient().UploadData(...., .....) 函数就行了,不要搞那么复杂。 服务器端(不论是 asp.net 还是桌面/服务器)也比较简单,接收数据也是一句话的事儿。.net 里边有现成的直截了当的代码,把代码写那么复杂是为了啥?
  • 打赏
  • 举报
回复
举个例子。比如说使用 asp.net (因为你是在 asp.net 论坛问的,对于 windows service 则需要使用 HttpListenerContext 而不是 HttpContext),创建 ashx
using System.IO;
using System.Text;
using System.Web;

namespace WebApplication3
{
    /// <summary>
    /// Handler1 的摘要说明
    /// </summary>
    public class Handler1 : IHttpHandler
    {

        public void ProcessRequest(HttpContext context)
        {
            using (var sr = new StreamReader(context.Request.InputStream, Encoding.UTF8))
            {
                var cmd = sr.ReadToEnd();
                //......
            }
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}
客户端可以这样发送消息
public string SendMessag(string url, string cmd)
{
    var resultBytes = new WebClient().UploadData(url, Encoding.UTF8.GetBytes(cmd));
    var resultString = Encoding.UTF8.GetString(resultBytes);
    return resultString;
}

62,041

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧