Ошибка при создании Etsy API: oauth_problem = signature_invalid - PullRequest
0 голосов
/ 27 декабря 2018

У кого-нибудь был успех в создании приложения на C # и создании новых списков с помощью Etsy API.Я разработал приложение, которое отлично работает для получения данных (HTTP GET), с разрешениями или без них.Единственная часть, которую я не могу понять, это как написать правильный код для HTTP POST.

Вот полностью работающий пример HTTP GET для извлечения всех неактивных списков:

        public EtsyListings GetAllStoreListingsInactive(string storeProviderStoreId, string consumerKey, string consumerSecret, string oAuthToken, string oAuthTokenSecret)
    {
        string url = "shops/" + storeProviderStoreId + "/listings/inactive";
        var request = GenerateSecureRequest(url, RequestType.GET, consumerKey, consumerSecret, oAuthToken, oAuthTokenSecret);

        var response = _restClient.Execute<EtsyListings>(request);

        if (response.ResponseStatus != ResponseStatus.Completed)
            throw new Exception("Retrieving AllStoreListingsInactive Failed");

        return response.Data;
    }

        private RestRequest GenerateSecureRequest(string url, RequestType requestType, string consumerKey, string consumerSecret, string oAuthToken, string oAuthTokenSecret)
    {
        OAuthBase oAuth = new OAuthBase();

        string nonce = oAuth.GenerateNonce();
        string timeStamp = oAuth.GenerateTimeStamp();
        string normalizedUrl;
        string normalizedRequestParameters;

        string relativeUri = url;
        string sig = oAuth.GenerateSignature(new Uri(BASE_URL.ToString() + relativeUri), consumerKey, consumerSecret, oAuthToken, oAuthTokenSecret, requestType.ToString(), timeStamp, nonce, out normalizedUrl, out normalizedRequestParameters);

        var request = new RestRequest(relativeUri);
        request.Resource = string.Format(relativeUri);
        request.Method = Method.GET;
        request.AddParameter("oauth_consumer_key", consumerKey);
        request.AddParameter("oauth_token", oAuthToken);
        request.AddParameter("oauth_nonce", nonce);
        request.AddParameter("oauth_timestamp", timeStamp);
        request.AddParameter("oauth_signature_method", "HMAC-SHA1");
        request.AddParameter("oauth_version", "1.0");
        request.AddParameter("oauth_signature", sig);

        return request;
    }

А вот код, который я написал для создания нового списка, он не работает:

        public EtsyListings CreateListing(string storeProviderStoreId, string consumerKey, string consumerSecret, string oAuthToken, string oAuthTokenSecret)
    {
        string url = "listings";
        var request = GenerateSecureRequestTestingCreatingListing(url, RequestType.POST, consumerKey, consumerSecret, oAuthToken, oAuthTokenSecret);

        var response = _restClient.Execute<EtsyListings>(request);

        if (response.ResponseStatus != ResponseStatus.Completed)
            throw new Exception("Retrieving Creating Listing Failed");

        return response.Data;
    }

        private RestRequest GenerateSecureRequestTestingCreatingListing(string url, RequestType requestType, string consumerKey, string consumerSecret, string oAuthToken, string oAuthTokenSecret)
    {
        OAuthBase oAuth = new OAuthBase();

        string nonce = oAuth.GenerateNonce();
        string timeStamp = oAuth.GenerateTimeStamp();
        string normalizedUrl;
        string normalizedRequestParameters;

        string relativeUri = url;
        string sig = oAuth.GenerateSignature(new Uri(BASE_URL.ToString() + relativeUri), consumerKey, consumerSecret, oAuthToken, oAuthTokenSecret, requestType.ToString(), timeStamp, nonce, out normalizedUrl, out normalizedRequestParameters);

        var request = new RestRequest(relativeUri);
        request.Resource = string.Format(relativeUri);
        request.Method = Method.POST;
        request.AddParameter("oauth_consumer_key", consumerKey);
        request.AddParameter("oauth_token", oAuthToken);
        request.AddParameter("oauth_nonce", nonce);
        request.AddParameter("oauth_timestamp", timeStamp);
        request.AddParameter("oauth_signature_method", "HMAC-SHA1");
        request.AddParameter("oauth_version", "1.0");
        request.AddParameter("oauth_signature", sig);

        request.AddParameter("title", "Test Title");
        request.AddParameter("description", "Test Description");
        request.AddParameter("quantity", "1");
        request.AddParameter("price", "1");
        request.AddParameter("is_supply", "false");
        request.AddParameter("state", "draft");
        request.AddParameter("when_made", "2010_2017");
        request.AddParameter("who_made", "i_did");
        request.AddParameter("shipping_template_id", "43862539760");

        var response = _restClient.Execute(request);

        return request;
    }

Кто-нибудь видит что-то явно неправильное в приведенном выше коде CreateListing?

Код ошибки для объекта ответа, который я получаю, - это StatusCode из 'Forbidden' и 'Content' из 'oauth_problem = signature_invalid ... '

Я подтвердил, что у меня есть полные права, и подпись не была проблемой с примером HTTP GET, который я предоставил выше.

Дополнительная информация: публикация без' количества', я получаю сообщение об ошибке' BadRequest ', в котором указано, что' Ожидаемое значение параметра 'количество'. '

И переделываю код, поэтому я передам объект в теле:

        private RestRequest GenerateSecureRequestTestingCreatingListing(string url, RequestType requestType, string consumerKey, string consumerSecret, string oAuthToken, string oAuthTokenSecret)
    {
        OAuthBase oAuth = new OAuthBase();

        string nonce = oAuth.GenerateNonce();
        string timeStamp = oAuth.GenerateTimeStamp();
        string normalizedUrl;
        string normalizedRequestParameters;

        string relativeUri = url;
        string sig = oAuth.GenerateSignature(new Uri(BASE_URL.ToString() + relativeUri), consumerKey, consumerSecret, oAuthToken, oAuthTokenSecret, requestType.ToString(), timeStamp, nonce, out normalizedUrl, out normalizedRequestParameters);

        var request = new RestRequest(relativeUri);
        request.Resource = string.Format(relativeUri);
        request.Method = Method.POST;
        request.AddParameter("oauth_consumer_key", consumerKey);
        request.AddParameter("oauth_token", oAuthToken);
        request.AddParameter("oauth_nonce", nonce);
        request.AddParameter("oauth_timestamp", timeStamp);
        request.AddParameter("oauth_signature_method", "HMAC-SHA1");
        request.AddParameter("oauth_version", "1.0");
        request.AddParameter("oauth_signature", sig);


        request.AddParameter("quantity", "1");

        request.RequestFormat = DataFormat.Json;

        var dataObj = new
        {
            title = "This is a test1",
            description = "Test Description1",
            quantity = "1",
            price = "1",
            is_supply = "false",
            state = "draft",
            when_made = "2010_2017",
            who_made = "i_did",
            shipping_template_id = "43862539760"
        };

        string dataObjJson = JsonConvert.SerializeObject(dataObj, Formatting.Indented);

        request.AddBody(dataObjJson);



        //request.AddParameter("title", "Test Title");
        //request.AddParameter("description", "Test Description");
        //request.AddParameter("quantity", "1");
        //request.AddParameter("price", "1");
        //request.AddParameter("is_supply", "false");
        //request.AddParameter("state", "draft");
        //request.AddParameter("when_made", "2010_2017");
        //request.AddParameter("who_made", "i_did");
        //request.AddParameter("shipping_template_id", "43862539760");


        var response = _restClient.Execute(request);

        return request;
    }

получается с той же Запрещенной ошибкой

1 Ответ

0 голосов
/ 27 декабря 2018

Вам нужно передать POST-запрос внутри тела.Я полагаю, что вы отправляете некорректный почтовый запрос и, следовательно, получаете запрещенный ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...