2017-02-13 70 views
1

我正在尝试使用Windows服务向WorkWave API发送请求。该代码由workwave API例子提供下面给出:如何使用提供以下HTTP + JSON的窗口服务进行POST请求

POST /api/v1/territories/429defc8-5b05-4c3e-920d-0bb911a61345/orders HTTP/1.0 
Accept: application/json 
X-WorkWave-Key: YOUR API KEY 
Host: wwrm.workwave.com 
Content-Type: application/json 

{ 
    "orders": [ 
    { 
     "name": "Order 6 - API", 
     "eligibility": { 
     "type": "on", 
     "onDates": [ 
      "20151204" 
     ] 
     }, 
     "forceVehicleId": null, 
     "priority": 0, 
     "loads": { 
     "people": 2 
     }, 
     "delivery": { 
     "location": { 
      "address": "2001 2nd Ave, Jasper, AL 35501, USA" 
     }, 
     "timeWindows": [ 
      { 
      "startSec": 43200, 
      "endSec": 54000 
      } 
     ], 
     "notes": "Order added via API", 
     "serviceTimeSec": 1800, 
     "tagsIn": [], 
     "tagsOut": [], 
     "customFields": { 
      "my custom field": "custom field content", 
      "orderId": "abcd1234" 
     } 
     } 
    } 
    ] 
} 

这是当我使用GET/POST请求我的第一次。所以我不确定上面会发生什么,我怎么用c#代码来做到这一点。我需要遵循的步骤是什么,我该如何做到这一点。感谢您的时间和代码。

回答

0

您可以使用HttpWebRequest类似如下:

string PostJsonToGivenUrl(string url, object jsonObject) 
    { 
     string resultOfPost = string.Empty; 

     HttpWebRequest httpRequest = (HttpWebRequest)WebRequest.Create(url); 
     httpRequest.ContentType = "application/json"; 
     httpRequest.Method = "POST"; 

     using (StreamWriter writer = new StreamWriter(httpRequest.GetRequestStream())) 
     { 
      string json = new JavaScriptSerializer().Serialize(jsonObject); 

      writer.Write(json); 
     } 

     HttpWebResponse httpResponse = (HttpWebResponse)httpRequest.GetResponse(); 
     using (StreamReader streamReader = new StreamReader(httpResponse.GetResponseStream())) 
     { 
      resultOfPost = streamReader.ReadToEnd(); 
     } 

     return resultOfPost; 
    } 

如果你需要知道如何使用JavaScriptSerializer成JSON字符串检查此链接:https://msdn.microsoft.com/en-us/library/system.web.script.serialization.javascriptserializer(v=vs.110).aspx

如果您需要更多信息有关HttpWebRequest检查这链接:https://msdn.microsoft.com/en-us/library/system.net.httpwebrequest(v=vs.110).aspx

也查看该答案可能对您有帮助:How to post JSON to the server?

0

首先,您需要创建请求和响应对象。你可以使用类似json2charp.com的c#类创建器。

public class Eligibility 
{ 
    public string type { get; set; } 
    public List<string> onDates { get; set; } 
} 

public class Loads 
{ 
    public int people { get; set; } 
} 

public class Location 
{ 
    public string address { get; set; } 
} 

public class TimeWindow 
{ 
    public int startSec { get; set; } 
    public int endSec { get; set; } 
} 

public class CustomFields 
{ 

    public string myCustomField { get; set; } 
    public string orderId { get; set; } 
} 

public class Delivery 
{ 
    public Location location { get; set; } 
    public List<TimeWindow> timeWindows { get; set; } 
    public string notes { get; set; } 
    public int serviceTimeSec { get; set; } 
    public List<object> tagsIn { get; set; } 
    public List<object> tagsOut { get; set; } 
    //this field will be Dictionary... 
    public CustomFields customFields { get; set; } 
} 

public class Order 
{ 
    public string name { get; set; } 
    public Eligibility eligibility { get; set; } 
    public object forceVehicleId { get; set; } 
    public int priority { get; set; } 
    public Loads loads { get; set; } 
    public Delivery delivery { get; set; } 
} 

public class OrderRequest 
{ 
    public List<Order> orders { get; set; } 
} 
public class OrderResponse 
{ 
    public string requestId { get; set; } 
} 

,并创建API参考样本值的请求对象实例(C#)..

OrderRequest GetOrderRequestObject() 
    { 
     var rootObj = new OrderRequest 
     { 
      orders = new List<Order>() 
     }; 
     var order = new Order 
     { 
      name = "Order 6 - API", 
      eligibility = new Eligibility 
      { 
       type = "on", 
       onDates = new List<string>() { "20151204" } 
      }, 
      forceVehicleId = null, 
      priority = 2, 
      loads = new Loads 
      { 
       people = 2 
      }, 
      delivery = new Delivery 
      { 
       location = new Location 
       { 
        address = "2001 2nd Ave, Jasper, AL 35501, USA" 
       }, 
       timeWindows = new List<TimeWindow>(){ 
        new TimeWindow{ 
         startSec =43200, 
         endSec=54000 
        }}, 
       notes = "Order added via API", 
       serviceTimeSec = 1800, 
       tagsIn = new List<object>(), 
       tagsOut = new List<object>(), 
       customFields = new CustomFields 
       { 
        myCustomField = "custom field content", 
        orderId = "abcd1234" 
       } 

      }, 
     }; 
     rootObj.orders.Add(order); 
     return rootObj; 
    } 

创建一个通用的POST方法。(你需要添加HttpClient的参考 - 的NuGet)

 TRSULT HttpPostRequest<TREQ, TRSULT>(string requestUrl, TREQ requestObject) 
    { 
     using (var client = new HttpClient()) 
     { 
      // you should replace wiht your api key 
      client.DefaultRequestHeaders.Add("X-WorkWave-Key", "YOUR API KEY"); 
      client.BaseAddress = new Uri("wrm.workwave.com"); 
      using (var responseMessage = client.PostAsJsonAsync <TREQ>(requestUrl, requestObject).Result) 
      { 
       TRSULT result = responseMessage.Content.ReadAsAsync<TRSULT>().Result; 
       return result; 
      } 
     } 
    } 

现在,您可以提出要求..

var orderReqeuest = GetOrderRequestObject(); 
OrderResponse orderResponse = HttpPostRequest<OrderRequest, OrderResponse>("/api/v1/territories/429defc8-5b05-4c3e-920d-0bb911a61345/orders", orderReqeuest); 

更新:

索里,我们需要添加的Microsoft ASP.NET Web API 2.2客户端库的参考

enter image description here

+0

能否请您介绍这个功能'TRSULT HttpPostRequest (字符串requestUrl,TREQ requestObject)'。我复制并过去,但它给错误 –

+0

你有没有添加引用HttpClient – levent

+0

@leavent低于此内容'创建一个通用的post方法..(你需要添加HttpClient引用 - NuGet)' –