首页 > 解决方案 > 如何使用多部分/表单数据编码和使用 POST 方法使用带有用户名和密码的 REST API

问题描述

我正在尝试使用此 API:https ://clbeta.ecomexpress.in/apiv2/pincodes/ 。我能够从邮递员工具中获取输出。但无法从我创建的 C# 应用程序中获得结果。我对这些概念不熟悉,请帮助我。

我也尝试过使用基本身份验证方法,但无法取得结果。

using System;
using System.IO;
using System.Net;
using RestSharp;
using Newtonsoft.Json;
namespace Ecomapisample
{

    public enum Httpverb
    {
        GET,
        POST,
        PUT,
        DELETE
    }

    public enum AuthenticationType
    {
        Basic,
        NTLM
    }
    class Ecomapi
    {
        public string EndPoint { get; set; }
        public Httpverb HttpMethod { get; set; }
        public AutheticationTechnique AuthTech { get; set; }
        public AuthenticationType AuthType { get; set; }
        public string UserName { get; set; }
        public string UserPassword { get; set; }

        public Ecomapi()
        {
            EndPoint = string.Empty;
            HttpMethod = Httpverb.POST;
        }




        public string MakeRequest()
        {
            string strResponseValue = string.Empty;
            HttpWebRequest request =(HttpWebRequest)WebRequest.Create(EndPoint);

            request.Method = HttpMethod.ToString();

            request.ContentType = "application/json";

            request.CookieContainer = new CookieContainer();

            string AuthHeader =  System.Convert.ToBase64String(System.Text.ASCIIEncoding.ASCII.GetBytes(UserName + ":" + UserPassword));
            request.Headers.Add(HttpRequestHeader.Authorization,AuthType.ToString() + AuthHeader);
            HttpWebResponse response = null;
            try
            {
                response = (HttpWebResponse)request.GetResponse();
                if (response.StatusCode != HttpStatusCode.OK)
                {
                    throw new ApplicationException("Error code in response recieved: " + response.StatusCode.ToString());
                }

                else
                {

                    using (Stream responseStream = response.GetResponseStream())
                    {
                        if (responseStream != null)
                        {
                            using (StreamReader reader = new StreamReader(responseStream))
                            {
                                strResponseValue = reader.ReadToEnd();
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                strResponseValue = "{\"errorMessages\":[\"" + ex.Message.ToString() + "\"],\"errors\":{}}";
            }
            finally
            {
                if (response != null)
                {
                    ((IDisposable)response).Dispose();
                }
            }
            return strResponseValue;
        }
    }
}

//邮递员工具的代码如下所示。

var client = new 
RestClient("https://clbeta.ecomexpress.in/apiv2/pincodes/");
var request = new RestRequest(Method.POST);
request.AddHeader("Postman-Token", "xxxxxxxxxxxxxxxx");
request.AddHeader("cache-control", "no-cache");
request.AddHeader("Content-Type", "application/x-www-form-urlencoded");
request.AddHeader("content-type", "multipart/form-data; boundary=---- 
WebKitFormBoundary7MA4YWxkTrZu0gW");
request.AddParameter("multipart/form-data; boundary=---- 
WebKitFormBoundary7MA4YWxkTrZu0gW", "------ 
WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; 
name=\"username\"\r\n\r\xxxxxxxxxxxxxxxxxx\r\n------ 
WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; 
name=\"password\"\r\n\r\xxxxxxxxxxxxxxxxxxx\r\n------ 
WebKitFormBoundary7MA4YWxkTrZu0gW--", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);

我需要的输出是 JSON 输出。请帮忙。

标签: c#restful-authentication

解决方案


这取决于 API 的编写方式,但您可能想尝试告诉它您接受什么。某些 API 不默认为 JSON,因此您必须通过提供另一个标头来向它们发出信号。

request.AddHeader("Accept", "application/json");

推荐阅读