使用 C# 使用 Drupal Rest Api
Consuming Drupal RestApi with c#
我正在使用 C# 使用 Drupal Rest Api。我正在使用 drupal 7.5 并在各种资源之后利用它的其余部分 services/api。
我已经成功地使用 google 的 postman 来 post 内容,但是当我尝试使用 c# 代码复制它时,我收到禁止错误提示:匿名用户访问被拒绝。
我正在使用 rest-sharp 来消耗这个 API。我已经研究了很多但还没有找到解决方案,也没有注意到有人在 c# 中做这项工作。
以下是我根据 postman
编写的代码片段
var client = new RestClient("drupasitename/rest/node");
var request = new RestRequest(Method.POST);
request.AddHeader("cache-control", "no-cache");
request.AddHeader("authorization", authorisation);
request.AddHeader("x-csrf-token", token);
request.AddHeader("cookie", cookie);
request.AddHeader("content-type", "application/json");
request.AddHeader("Accept", "application/json");
request.AddParameter("application/json", "{\r\n \"type\":\"page\",\r\n \"title\":\"Page submitted via JSON REST\",\r\n \"body\":{\r\n \"und\":[\r\n {\r\n \"value\":\"This is the body of the page.\"\r\n }\r\n ]\r\n }\r\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
使用 c# 代码尝试登录成功后获取 cookie 和令牌。
如果有人能提供解决此问题的指导,那就太好了。
此致
您只需将 UserAgent 添加到 http 请求中即可 header
我得到了包含 cookie 和令牌的用户信息。
private login_user LoginAsync(string username,string password)
{
try
{
RestClient client = new RestClient(base_url);
var request = new RestRequest("login", Method.GET);
request.AddHeader("Content-Type", "Application/JSON");
client.Authenticator = new HttpBasicAuthenticator(username, password);
var restResponse = client.Execute(request);
var content = restResponse.Content;
string context_modifytoken = content.ToString().Replace("X-CSRF-Token", "X_CSRF_Token");
var current_login_user = JsonConvert.DeserializeObject<login_user>(context_modifytoken);
current_login_user.data.session_name = restResponse.Cookies[0].Name;
current_login_user.data.session_id = restResponse.Cookies[0].Value;
return current_login_user;
}
catch (HttpRequestException ex) { throw ex; }
}
以及 Post 部分:
RestClient client = new RestClient(base_url);
var request = new RestRequest("v1.0/barcodes", Method.POST);
request.AddHeader("cache-control", "no-cache");
request.AddHeader("X-CSRF-Token", current_user.data.X_CSRF_Token);
request.AddHeader("content-type", "application/json");
request.AddHeader("Accept", "application/json");
request.AddHeader("cookie", current_user.data.session_name+"="+ current_user.data.session_id);
request.AddHeader("User-Agent", ver);
var queryresult = client.Execute(request);
有错误:queryresult = "StatusCode: Forbidden, Content-Type: application/problem+json; charset=utf-8, Content-Length: -1)"
和 Drupal 日志:
restful 2016-09-21 16:32 您无权创建新的示例条码...匿名(未验证)
我使用以下方式登录 drupal
var client = new RestClient("drupalsitename/user/login");
var request = new RestRequest(Method.POST);
request.AddHeader("cache-control", "no-cache");
request.AddHeader("content-type", "application/json");
request.AddHeader("user-agent", "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0");
request.AddParameter("application/json", "{\"name\":\"username\",\n\"pass\":\"password\"}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
这将为您提供必要的会话和令牌信息,然后基本上您可以使用这些信息来制作 post,类似于我在问题
中所写的内容
我正在使用 C# 使用 Drupal Rest Api。我正在使用 drupal 7.5 并在各种资源之后利用它的其余部分 services/api。
我已经成功地使用 google 的 postman 来 post 内容,但是当我尝试使用 c# 代码复制它时,我收到禁止错误提示:匿名用户访问被拒绝。 我正在使用 rest-sharp 来消耗这个 API。我已经研究了很多但还没有找到解决方案,也没有注意到有人在 c# 中做这项工作。 以下是我根据 postman
编写的代码片段 var client = new RestClient("drupasitename/rest/node");
var request = new RestRequest(Method.POST);
request.AddHeader("cache-control", "no-cache");
request.AddHeader("authorization", authorisation);
request.AddHeader("x-csrf-token", token);
request.AddHeader("cookie", cookie);
request.AddHeader("content-type", "application/json");
request.AddHeader("Accept", "application/json");
request.AddParameter("application/json", "{\r\n \"type\":\"page\",\r\n \"title\":\"Page submitted via JSON REST\",\r\n \"body\":{\r\n \"und\":[\r\n {\r\n \"value\":\"This is the body of the page.\"\r\n }\r\n ]\r\n }\r\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
使用 c# 代码尝试登录成功后获取 cookie 和令牌。
如果有人能提供解决此问题的指导,那就太好了。 此致
您只需将 UserAgent 添加到 http 请求中即可 header
我得到了包含 cookie 和令牌的用户信息。
private login_user LoginAsync(string username,string password)
{
try
{
RestClient client = new RestClient(base_url);
var request = new RestRequest("login", Method.GET);
request.AddHeader("Content-Type", "Application/JSON");
client.Authenticator = new HttpBasicAuthenticator(username, password);
var restResponse = client.Execute(request);
var content = restResponse.Content;
string context_modifytoken = content.ToString().Replace("X-CSRF-Token", "X_CSRF_Token");
var current_login_user = JsonConvert.DeserializeObject<login_user>(context_modifytoken);
current_login_user.data.session_name = restResponse.Cookies[0].Name;
current_login_user.data.session_id = restResponse.Cookies[0].Value;
return current_login_user;
}
catch (HttpRequestException ex) { throw ex; }
}
以及 Post 部分:
RestClient client = new RestClient(base_url);
var request = new RestRequest("v1.0/barcodes", Method.POST);
request.AddHeader("cache-control", "no-cache");
request.AddHeader("X-CSRF-Token", current_user.data.X_CSRF_Token);
request.AddHeader("content-type", "application/json");
request.AddHeader("Accept", "application/json");
request.AddHeader("cookie", current_user.data.session_name+"="+ current_user.data.session_id);
request.AddHeader("User-Agent", ver);
var queryresult = client.Execute(request);
有错误:queryresult = "StatusCode: Forbidden, Content-Type: application/problem+json; charset=utf-8, Content-Length: -1)"
和 Drupal 日志: restful 2016-09-21 16:32 您无权创建新的示例条码...匿名(未验证)
我使用以下方式登录 drupal
var client = new RestClient("drupalsitename/user/login");
var request = new RestRequest(Method.POST);
request.AddHeader("cache-control", "no-cache");
request.AddHeader("content-type", "application/json");
request.AddHeader("user-agent", "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0");
request.AddParameter("application/json", "{\"name\":\"username\",\n\"pass\":\"password\"}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
这将为您提供必要的会话和令牌信息,然后基本上您可以使用这些信息来制作 post,类似于我在问题
中所写的内容