c# - 如何使用多部分/表单数据编码和使用 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 输出。请帮忙。
解决方案
这取决于 API 的编写方式,但您可能想尝试告诉它您接受什么。某些 API 不默认为 JSON,因此您必须通过提供另一个标头来向它们发出信号。
request.AddHeader("Accept", "application/json");
推荐阅读
- docker - 使用 Docker 容器创建/删除主机 iptable 规则
- javascript - ES6 类事件发射器
- javascript - 画布中的利萨如曲线
- r - R Purrr - coeftest
- android - Android Binders - 多个进程如何在读/写时同步?
- php - 无法使用 Eloquent 从数据库中获取 last_insert_id
- c++11 - AES的CBC操作模式的实现
- node.js - 如何从分隔符为“&”甚至正则表达式包含“&”的查询参数输入中获取正则表达式?
- c++ - 用 C++ 计算 TXT 中的列?
- javascript - 在 puppeteer 中使用 xpath 选择下拉菜单