简体   繁体   English

将HTTP GET请求中的JSON数据传递给REST服务

[英]Pass JSON data in a http GET request to a REST service

Using the following command: 使用以下命令:

curl -v -X GET -H "Content-Type: application/json" -d {'"mode":"0"'} http://host.domain.abc.com:23423/api/start-trial-api/

I am able to send the JSON data to web request and get the response back. 我能够将JSON数据发送到Web请求并获得响应。 How can I do the same in C#? 如何在C#中执行相同的操作?

I am able to POST data to the other service and get the response but don't understand how to send the data to GET request. 我能够将数据发布到其他服务并获得响应,但不了解如何将数据发送到GET请求。 I tried searching on google and stackoverflow for the same in C#, but did not find anything. 我尝试在C#中在google和stackoverflow上搜索相同内容,但未找到任何内容。

Sample code - Make sure the request method is set to "GET" 示例代码-确保请求方法设置为“ GET”

        string url = "";
        var request = (HttpWebRequest)WebRequest.Create(url);
        request.Method = "GET";
        request.ContentType = "application/json";

        var webResponse = request.GetResponse();

        using (var s = webResponse.GetResponseStream())
        {
            using (TextReader textReader = new StreamReader(s, true))
            {
               string jsonString = textReader.ReadToEnd();
            }
        }

Plenty of abstractions here, but hopefully will give a rough guide on how to connect to a service in C# 这里有很多abstractions ,但希望会为如何使用C#连接服务提供一个粗略的指导。

The Interface 介面

public interface IShopifyAPIGateway
{
   HttpResponseMessage Get(string path);
} 

Shopify API Gateway , which instatiates HTTPClient() Shopify API网关 ,这instatiates HTTPClient()

public sealed class ShopifyAPIGateway : IShopifyAPIGateway
        {
            /// <summary>
            /// 
            /// </summary>
            private Identity _identity;
            /// <summary>
            /// 
            /// </summary>
            private HttpClient _httpClient;
            /// <summary>
            /// 
            /// </summary>
            public ShopifyAPIGateway(Identity
                identity)
            {
                _identity = identity;
                _httpClient = new HttpClient(ClientHandler());
            }
            /// <summary>
            /// 
            /// </summary>
            /// <returns></returns>
            public HttpResponseMessage Get(string path)
            {
                try
                {
                    var response =  Connect().GetAsync(path).Result;
                    return response;
                }
                catch (CustomHttpResponseException ex)
                {
                    new Email().SendEmail(_identity.ClientName, "Http Response Error - Shopify API Module",
                     "Http Response Error - Shopify API Module: " + ex.Message,
                     "error@retain.me");

                    throw new CustomHttpResponseException(ex.Message);
                }

            }
            /// <summary>
            /// 
            /// </summary>
            /// <returns></returns>
            private HttpClient Connect()
            {
                try
                {
                    _httpClient.BaseAddress = new Uri(_identity.APIURL);
                    return _httpClient;
                }
                catch (CustomHttpRequestException ex)
                {
                    throw new CustomHttpRequestException(ex.Message);
                }

            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="userKey"></param>
            /// <returns></returns>
            private HttpClientHandler ClientHandler()
            {
                try
                {
                    return new HttpClientHandler()
                    {
                        Credentials = new NetworkCredential(_identity.APIKey,
                                                            _identity.Password),
                        PreAuthenticate = true
                    };
                }
                catch (CustomClientHandlerException ex)
                {    
                    throw new CustomClientHandlerException(ex.Message);   
                }
            }
        }

Generic repo to return any object(s) where the response object matches T 通用存储库 ,返回响应对象与T匹配的任何object(s)

public sealed class EntityRepository<T> : IEntityRepository<T>
    {
        private IShopifyAPIGateway _gateWay;
        public T Find(string path)
        {
            try
            {
                _gateWay = new ShopifyAPIGateway(_identity);
                var json = _gateWay.Get(path).Content.ReadAsStringAsync();
                T results = JsonConvert.DeserializeObject<T>(json.Result);

                return results;
            }
            catch (System.Exception ex)
            {
                throw new ApplicationException(ex.Message);
            }

        }

    }

Usage return type must match the Type your passing and also the Type that's being returned in response. 用法返回类型必须匹配Type的传球和也是在响应返回的类型。

private IEnumerable<Order> Orders()
{
   var entityRepo = new EntityRepository<Order>();
   return entityRepo.Find("somedomain/api/orders?mode=0", _identity);
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM