与Web客户端发布返回400错误请求

时间:2016-10-07 13:52:33

标签: c# webclient

EDIT。建议提琴手的人很棒。原来我发布的API吓坏了,因为c#应用程序没有用户代理。所以在标题中添加一个修复它

我正在尝试使用c#web客户端发布到api但似乎正在碰壁。我正在尝试使用此代码将json发布到api但是我得到的是400个错误的请求,我不确定发生了什么。

output = "{ \"id\": \"xxxxxx\", \"company\": \"test\", \"fname\": \"test\", \"lname\": \"test\", \"member_level\": \"Member\",\"status\": \"active\"}";

using (var client = new WebClient())
{
     client.Headers.Add("token", "validtoken");
     client.Headers.Add("Content-Type", "application/json");
     client.UploadString(new Uri("url"), "POST", output);
}

我能够使用powershell成功发布使用webrequest,所以我知道url和auth令牌是有效的。但无论出于何种原因,我无法让c#正确发布。这是工作的powershell命令

curl url -Method POST -H @{"token" = "token"} -ContentType "application/json" -Body '{ "id": "xxxxxx", "company": "test", "fname": "test", "lname": "test", "member_level": "test","status": "active"}'

2 个答案:

答案 0 :(得分:2)

而不是

client.UploadString(new Uri("url"), "POST", output);

使用

client.UploadData(url, "POST", Encoding.UTF8.GetBytes(output));

答案 1 :(得分:0)

只需使用C#的内置功能即可保持代码清洁。尽可能创建描述API通信合同的类。在不需要低级控制时使用HttpClient。 HttpClient可以将这些对象作为JSON发送,您通常不需要关心序列化问题。

此代码应在您更换url部分后进行POST。由于您没有发送TOKEN,因此应该引发401错误 - 您未获得授权。添加您的有效令牌,删除评论,此请求应该有效。

using System;
using System.Collections.Generic;
using System.Net.Http;

public class User
{
    public string Id { get; set; }
    public string Company { get; set; }
    public string FName { get; set; }
    public string LName { get; set; }
    public string MemberLevel { get; set; }
    public string Status { get; set; }
}

class Program
{
    static void CreateUser(User user)
    {
        using (var client = new HttpClient())
        {
            // posts to https://yourawesomewebsite.com/api/users
            client.BaseAddress = new Uri("https://yourawesomewebsite.com");             
            //client.Headers.Add("token", "validtoken");
            HttpResponseMessage response = client.PostAsJson("api/users", user);
            response.EnsureSuccessStatusCode();
        }
    }

    static void Main()
    {     
        // Create a new user
        User user = new User
        { 
            Id = "xxxxx",
            Company = "Test",
            FName = "Test",
            LName = "Test",
            MemberLevel = "Test",
            Status = "Active"
        };

        CreateUser(user);
    }
}

参考