C# Ebay API Post-Order check_eligibility 使用 HttpWebRequest

C# Ebay API Post-Order check_eligibility using HttpWebRequest

我试图在 C# 中使用来自 eBay Post-Order API 的 check_eligibility 调用,但非常失败。每次我得到不好的回应。这是我尝试过的一种方法:

string url = "https://api.ebay.com/post-order/v2/cancellation/check_eligibility";
        HttpWebRequest cancelOrderRequest = (HttpWebRequest)WebRequest.Create(url);

        cancelOrderRequest.Headers.Add("Authorization", "TOKEN " + AuthToken);
        cancelOrderRequest.ContentType = "application/json"; 
        cancelOrderRequest.Accept = "application/json"; 
        cancelOrderRequest.Headers.Add("X-EBAY-C-MARKETPLACE-ID", "EBAY_US"); 

        cancelOrderRequest.Headers.Add("legacyOrderId", ebayFullOrderId);

        cancelOrderRequest.Method = "POST";


        HttpWebResponse response = (HttpWebResponse)cancelOrderRequest.GetResponse();

这是我尝试过的另一种方法:

string url = "https://api.ebay.com/post-order/v2/cancellation/check_eligibility";
        var httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
        httpWebRequest.ContentType = "application/json";
        httpWebRequest.Method = "POST";
        httpWebRequest.Headers.Add("Authorization", "TOKEN " + AuthToken);
        httpWebRequest.Headers.Add("X-EBAY-C-MARKETPLACE-ID", "EBAY_US");
        httpWebRequest.Accept = "application/json"; 

        using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
        {
            string json = "{\"legacyOrderId\":\"###-###\"";

            streamWriter.Write(json);
            streamWriter.Flush();
            streamWriter.Close();
        }

        var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
        using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
        {
            var result = streamReader.ReadToEnd();
        }

无论我尝试哪种方式都返回相同的消息,"The remote server returned an error: (400) Bad Request." 如果有人能指出正确的方向,我将不胜感激。谢谢。

请试试这个代码:

private void MakeRequests()
{
    HttpWebResponse response;

    if (RequestEbay(out response))
    {
        response.Close();
    }
}

private bool RequestEbay(out HttpWebResponse response)
{
    response = null;

    try
    {
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://api.ebay.com/ws/api.dll");

        request.Headers.Add("X-EBAY-API-SITEID", @"0");
        request.Headers.Add("X-EBAY-API-COMPATIBILITY-LEVEL", @"967");
        request.Headers.Add("X-EBAY-API-CALL-NAME", @"GetOrders");

        request.Method = "POST";
        request.ServicePoint.Expect100Continue = false;

        string body = @"<?xml version=""1.0"" encoding=""utf-8""?>
        <GetOrdersRequest xmlns=""urn:ebay:apis:eBLBaseComponents"">
          <RequesterCredentials>
            <eBayAuthToken>!!!!!!!!!!!!!!!!YOUR EBAY TOKEN!!!!!!!!!!!!!!!!1</eBayAuthToken>
          </RequesterCredentials>
         <ErrorLanguage>en_US</ErrorLanguage>
         <WarningLevel>High</WarningLevel>
          <CreateTimeFrom>2016-12-01T19:09:02.768Z</CreateTimeFrom>
          <CreateTimeTo>2017-12-15T19:09:02.768Z</CreateTimeTo>
          <OrderRole>Seller</OrderRole>
        </GetOrdersRequest>";
                byte[] postBytes = System.Text.Encoding.UTF8.GetBytes(body);
                request.ContentLength = postBytes.Length;
                Stream stream = request.GetRequestStream();
                stream.Write(postBytes, 0, postBytes.Length);
                stream.Close();

                response = (HttpWebResponse)request.GetResponse();
    }
    catch (WebException e)
    {
        if (e.Status == WebExceptionStatus.ProtocolError) response = (HttpWebResponse)e.Response;
        else return false;
    }
    catch (Exception)
    {
        if(response != null) response.Close();
        return false;
    }

    return true;
}      

我的第二个代码示例最终成为解决我问题的正确方法。我意识到我的 json 有点不对劲。最后我错过了额外的 } 。下面更新的 json 语法解决了我使用第二个示例中的代码时遇到的问题。

var json = "{\"legacyOrderId\":\"" + ebayFullOrderId + "\"}";