2017-04-07 9 views
1

대량 데이터 교환을 위해 Walmart Marketplace API에 대한 POST 요청에 문제가있어 도움이 필요합니다.Walmart API POST가 400 잘못된 요청 (인벤토리 피드)으로 실패 함 ARCA

배경 : 내가 서명 인증 루틴을 작성에 성공했고, 성공적으로 얻을 제품과 같은 명령을 GET 실행할 수 등이 인증 서명이 제대로 (대부분의 경우) 형식 및 헤더 것을 나에게 나타냅니다 맞습니다.

문제점 : 400 잘못된 요청 응답이 수신 중이며 요청 내용이 유효하지 않습니다. 월마트 API에 테스트 피드를 제출할 때 응답 나는이 문제가 일반적이라는 것을 읽었지만 실제 문제를 명확하게 설명하는 포럼 게시판이나 해결 방법을 아직 찾지 못했습니다. 여기 내 현재의 매개 변수는 다음과 같습니다

ARCA ARCA Rest Client For Chrome

URL :

https://marketplace.walmartapis.com/v2/feeds?feedType=inventory 

가 헤더 :

Accept: application/xml 
WM_SVC.NAME: Walmart Marketplace 
WM_CONSUMER.ID: <Consumer ID> 
WM_SEC.AUTH_SIGNATURE: <Good Auth Signature> 
WM_QOS.CORRELATION_ID: 15649814651 
WM_SEC.TIMESTAMP: <Timestamp> 
WM_CONSUMER.CHANNEL.TYPE: <Channel Type> 
Content-Type: multipart/form-data 

첨부 파일 (즉, 비록 원시하지 페이로드가 시도되고있다)

<?xml version="1.0" encoding="utf-8"?> 
<InventoryFeed xmlns="http://walmart.com/"> 
    <InventoryHeader> 
    <version>1.4</version> 
    </InventoryHeader> 
    <inventory> 
    <sku>KON04418</sku> 
    <quantity> 
     <unit>EACH</unit> 
     <amount>4</amount> 
    </quantity> 
    <fulfillmentLagTime>1</fulfillmentLagTime> 
    </inventory> 
</InventoryFeed> 

정확히 동일한 XML을 사용하고 Walmart API Explorer 에서 테스트하면 파일이 응답 코드 200 (OK)으로 허용됩니다.

XML이 Walmart에서 제공 한 XSD를 준수한다는 메모장 + XML 도구 플러그인으로 확인했습니다. 적용 할 필요가있는 경계에 관한 수많은 게시물을 보았습니다. 따라서 Content-Type을 변경하고 경계를 추가하려했지만 요청을 수락하는 데 실패했습니다.

이 요청이 응답 코드 200을 반환하는 데 도움이 될 경우 크게 감사드립니다.

마지막으로 ARCA에서이 요청의 유효성을 검사하면 C#으로 구현할 예정입니다. 이미 모든 코드가 작성되었지만 HttpWebRequest에 첨부 파일을 추가하는 방법과 원시 데이터 스트림을 제출하는 방법에 대한 약간의 모호함이 있습니다. 차이점에 대해 명확성이 제공 될 수 있다면 다시 한 번 감사 드리겠습니다.

답변

0

이 답변은 깨끗하고 우아하지 않으므로 무엇보다 해결 방법이 많습니다. 저는 월마트 엔지니어링 팀 내부에서 몇 명의 사람들과 이야기를 나누었으며 앞으로 몇 달 안에 C# SDK가 출시 될 것이라고 말했습니다.

내 모든 연구 끝에 월마트에 여러 부분으로 구성된 양식을 제출하는 방법에 대한 트릭이 있으며 시스템은 매우 융통성이없는 것으로 나타납니다. HTTP 요청 본문에 형식화 된 경계를 추가하는 방법에 대한 게시물을 보았지만 그러한 행운은 없었습니다. 본문을 파일로 또는 요청에 대한 데이터 스트림으로 연결할 수 없습니다.

해결 방법은 매우 간단하고 불행히도 추합니다. 약간의 설정이 필요하지만 Walmart Java SDK 주위에 .jar 래퍼를 만들어 .Net 프로그램에서 호출 할 수 있습니다.

그래서 ..과정의 단계 :

  • 적절한 .XSD 파일을 잡고 C# 클래스를 생성합니다.
  • 올바른 형식의 XML 인벤토리 파일을 작성하십시오. 네임 스페이스를 포함해야합니다! 적절한 ns2/ns3 네임 스페이스를 포함하지 않으면 Walmart가 특정 호출에 실패합니다.
  • Java 모듈을 호출하는 배치 파일을 동적으로 생성하십시오. 어떤 이유로 명령 줄 프로세스를 생성하면 문제가 발생하는 것처럼 보였으므로 대신 배치 파일을 선택했습니다.

    string path = @Directory.GetParent(Environment.CurrentDirectory).ToString(); 
    
        if (File.Exists(@"../inventory.bat")) 
        { 
         File.Delete(@"../inventory.bat"); 
        } 
    
        string batchCommand = @"cd " + path + Environment.NewLine + @"java -jar WalmartWrapper.jar SubmitInventoryFeed inventoryFeed.xml"; 
        File.WriteAllText(path + @"\\inventory.bat", batchCommand); 
    
        ProcessStartInfo info = new ProcessStartInfo(); 
        info.UseShellExecute = true; 
        info.FileName = @"inventory.bat"; 
        info.WorkingDirectory = path; 
        var p = Process.Start(info); 
        p.WaitForExit();` 
    
  • 여기에서 Java 모듈이 대신합니다. 그것은 샘플 프로그램과 같이 더 SDK를 추천하고 덜 작동하도록 주위 해킹의 비트를했다 .. 여기에 .. 사물이 작동 만들기위한 샘플 코드의 일부이다

  • 진입 점

    if ("SubmitInventoryFeed".equals(args[0].trim())) { 
        if (args.length < 2) 
        { 
         System.out.println("Need second argument for SubmitInventoryFeed"); 
         return; 
        } 
        String filename = args[1]; 
        Feed inventoryFeed = new Feed(); 
        try 
        { 
         inventoryFeed.submitInventoryFeed(filename); 
        } catch (Exception ex) { 
         System.out.println("submitInventoryFeed failed: " + ex.getMessage()); 
        } 
    } 
    
  • SDK 호출 (이것은 오류 검사없이 submitInventoryFeed의 골자이다)

    String path = Paths.get(".").toAbsolutePath().normalize().toString(); 
    File itemFile = FileHandler.getFile(filename.trim()); 
    String filePath = path + "\\" + "MarketplaceClientConfig.properties"; 
    WalmartMarketplace wm = Utils.getClient(filePath); 
    Response response = wm.submitFeed(MarketplaceFeedType.inventory, itemFile); 
    
  • 당신은 성공적으로 제출 테스트하기 위해 ResponseChecker.isResponse200(response, true)을 사용할 수 있습니다

  • 사용 FeedAcknowledgement ack = response.readEntity (FeedAcknowledgement.class); 오류

내가 월마트에서 보류 C#을 SDK와 함께 주위에이 일을 대체하기 위해 기다릴 수 없어 말을 먼저합니다을 확인하기 위해 실제 응답을 잡아하지만 당분간이 유일한 방법입니다하기 나는 복종 할 수 있었다. 월마트 코드를 깊이 살펴 봤지만 유감스럽게도 파일 첨부를 처리하는 자바 마법이 발생하여 C#의 정확한 절차와 리버스 엔지니어에 액세스 할 수있는 방법이 없습니다. Java를 안팎으로 잘 아는 사람이 알아낼 수 있다고 생각합니다. 그러나 추악한 해결책 일지라도 함께 실행할 수있는 충분한 자바 배경을 가지고 있습니다.