使用HttpWebRequest的C#Ebay API Post-Order check_eligibility

时间:2017-04-26 21:52:36

标签: c# api post httpwebrequest ebay

我正在尝试在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();
        }

无论我尝试哪种方式都返回相同的消息,“远程服务器返回错误:(400)错误请求。”如果有人能指出我正确的方向,我会非常感激。谢谢。

2 个答案:

答案 0 :(得分:2)

我的第二个代码示例最终成为解决问题的正确方法。我意识到我的json略有偏差。我最后错过了额外的}。下面更新的json语法修复了我的第二个例子中的代码问题。

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

答案 1 :(得分:0)

请尝试以下代码:

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;
}