#node.js #request #github-api
#node.js #запрос #github-api
Вопрос:
Я пытаюсь сделать запрос к API github. Вот мой запрос:
var url = 'https://api.github.com/' requestUrl '/' repo '/';
request(url, function(err, res, body) {
if (!err amp;amp; res.statusCode == 200) {
var link = "https://github.com/" repo;
opener(link);
process.exit();
} else {
console.log(res.body);
console.log(err);
console.log('This ' person ' does not exist');
process.exit();
}
});
Это то, что я получаю за свой ответ:
Request forbidden by administrative rules. Please make sure your request has a User-Agent header (http://developer.github.com/v3/#user-agent-required). Check https://developer.github.com for other possible causes.
Я использовал точно такой же код в прошлом, и он работал. Запрос не выдает ошибок. Теперь я не понимаю, почему я получаю 403 (запрещено)? Какие-либо решения?
Комментарии:
1. Добавьте заголовок пользовательского агента или просто используйте модули в npm для API github.
Ответ №1:
Как объясняется в URL, указанном в ответе, запросы к API GitHub теперь требуют User-Agent
заголовка:
Все запросы API ДОЛЖНЫ содержать допустимый
User-Agent
заголовок. Запросы безUser-Agent
заголовка будут отклонены. Мы просим вас использовать ваше имя пользователя на GitHub или имя вашего приложения вUser-Agent
качестве значения заголовка. Это позволяет нам связаться с вами, если возникнут проблемы.
В request
документации конкретно показано, как добавить User-Agent
заголовок к вашему запросу:
var request = require('request');
var options = {
url: 'https://api.github.com/repos/request/request',
headers: {
'User-Agent': 'request'
}
};
function callback(error, response, body) {
if (!error amp;amp; response.statusCode == 200) {
var info = JSON.parse(body);
console.log(info.stargazers_count " Stars");
console.log(info.forks_count " Forks");
}
}
request(options, callback);
Ответ №2:
HttpClient
Это можно сделать с помощью C # и с помощью (протестировано на последней версии .Net Core 2.1):
using (HttpClient client = new HttpClient())
{
client.DefaultRequestHeaders.Accept.Add( new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
client.DefaultRequestHeaders.UserAgent.TryParseAdd("request");//Set the User Agent to "request"
using (HttpResponseMessage response = client.GetAsync(endPoint).Result)
{
response.EnsureSuccessStatusCode();
responseBody = await response.Content.ReadAsByteArrayAsync();
}
}
Спасибо
Ответ №3:
Если Github API отвечает с кодом состояния: 403, это просто означает, что ваш предел выборки API был превышен, пожалуйста, подождите 1 минуту и снова выполните выборку, после чего вы получите свои данные,
Ответ №4:
ANGULAR
У меня была та же проблема, когда я превысил ограничение скорости 403. Я попытался настроить Authorization
заголовок, используя new HttpHeaders
из angular / common, но заголовок по-прежнему не удался. Код, который не удался, является:
getUser(username: string): Observable<any> {
this.headers.set('Authorization', `token ${this.ACCESS_TOKEN}`);
const endpoint = `https://api.github.com/users/${username}`;
return this.http.get(endpoint, {
headers: this.headers
}).pipe(response => {
return response
});
}
Код, который сработал:
getUser(username: string): Observable<any> {
const endpoint = `https://api.github.com/users/${username}`;
return this.http.get(endpoint, {
headers: {
Authorization: `token ${this.ACCESS_TOKEN}`,
}
}).pipe(response => {
return response
});
}
В этом случае я напрямую устанавливаю заголовок в сегменте заголовков запроса.
Ответ №5:
Это отвечает на вопрос и в качестве бонуса показывает вам, как проверить, есть ли новый выпуск
Вам нужно добавить a User-agent
в Request
request.UserAgent = "YourRepoName";
internal class Tag
{
[JsonProperty("tag_name")]
public string TagName { get; set; }
}
/// <summary>
/// Use the Github API to Check for Updates
/// </summary>
/// <returns></returns>
public static Task<string> CheckUpTodate()
{
try
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://api.github.com/repos/HypsyNZ/BinanceTrader.NET/releases");
request.UserAgent = new Random(new Random().Next()).ToString();
var response = request.GetResponse();
if (response != null)
{
StreamReader reader = new StreamReader(response.GetResponseStream());
string readerOutput = reader.ReadToEnd();
List<Tag>? deserializedString = JsonConvert.DeserializeObject<List<Tag>>(readerOutput);
if (deserializedString != null)
{
if (deserializedString.Count > 0)
{
Tag tagOnFirstRelease = deserializedString.FirstOrDefault();
if ("v" ObservableObject.Version == tagOnFirstRelease.TagName)
{
return Task.FromResult("Up To Date");
}
else
{
return Task.FromResult("Update Available: " tagOnFirstRelease.TagName);
}
}
}
}
}
catch (Exception ex)
{
// Error
}
return Task.FromResult("Unknown");
}