我已经设置了magento CE 2.1.2店面。我想使用Java通过Magento REST API将产品上传到我的商店。我已经成功使用Apache-commons-httpclient设置了2条腿的OAuth,产品上传实际上效果很好。当我尝试使用产品上传图像时,问题就来了。

the official catalogProductRepositoryV1 Magento docs开始,json语法为:(重要的部分是“ media_gallery_entries”位)

{
  "product": {
    "id": 0,
    "sku": "string",
    "name": "string",
    "attribute_set_id": 0,
    "price": 0,
    "status": 0,
    "visibility": 0,
    "type_id": "string",
    "created_at": "string",
    "updated_at": "string",
    "weight": 0,
    "extension_attributes": {
      "bundle_product_options": [
        {
          "option_id": 0,
          "title": "string",
          "required": true,
          "type": "string",
          "position": 0,
          "sku": "string",
          "product_links": [
            {
              "id": "string",
              "sku": "string",
              "option_id": 0,
              "qty": 0,
              "position": 0,
              "is_default": true,
              "price": 0,
              "price_type": 0,
              "can_change_quantity": 0,
              "extension_attributes": {}
            }
          ],
          "extension_attributes": {}
        }
      ],
      "downloadable_product_links": [
        {
          "id": 0,
          "title": "string",
          "sort_order": 0,
          "is_shareable": 0,
          "price": 0,
          "number_of_downloads": 0,
          "link_type": "string",
          "link_file": "string",
          "link_file_content": {
            "file_data": "string",
            "name": "string",
            "extension_attributes": {}
          },
          "link_url": "string",
          "sample_type": "string",
          "sample_file": "string",
          "sample_file_content": {
            "file_data": "string",
            "name": "string",
            "extension_attributes": {}
          },
          "sample_url": "string",
          "extension_attributes": {}
        }
      ],
      "downloadable_product_samples": [
        {
          "id": 0,
          "title": "string",
          "sort_order": 0,
          "sample_type": "string",
          "sample_file": "string",
          "sample_file_content": {
            "file_data": "string",
            "name": "string",
            "extension_attributes": {}
          },
          "sample_url": "string",
          "extension_attributes": {}
        }
      ],
      "stock_item": {
        "item_id": 0,
        "product_id": 0,
        "stock_id": 0,
        "qty": 0,
        "is_in_stock": true,
        "is_qty_decimal": true,
        "show_default_notification_message": true,
        "use_config_min_qty": true,
        "min_qty": 0,
        "use_config_min_sale_qty": 0,
        "min_sale_qty": 0,
        "use_config_max_sale_qty": true,
        "max_sale_qty": 0,
        "use_config_backorders": true,
        "backorders": 0,
        "use_config_notify_stock_qty": true,
        "notify_stock_qty": 0,
        "use_config_qty_increments": true,
        "qty_increments": 0,
        "use_config_enable_qty_inc": true,
        "enable_qty_increments": true,
        "use_config_manage_stock": true,
        "manage_stock": true,
        "low_stock_date": "string",
        "is_decimal_divided": true,
        "stock_status_changed_auto": 0,
        "extension_attributes": {}
      },
      "configurable_product_options": [
        {
          "id": 0,
          "attribute_id": "string",
          "label": "string",
          "position": 0,
          "is_use_default": true,
          "values": [
            {
              "value_index": 0,
              "extension_attributes": {}
            }
          ],
          "extension_attributes": {},
          "product_id": 0
        }
      ],
      "configurable_product_links": [
        0
      ]
    },
    "product_links": [
      {
        "sku": "string",
        "link_type": "string",
        "linked_product_sku": "string",
        "linked_product_type": "string",
        "position": 0,
        "extension_attributes": {
          "qty": 0
        }
      }
    ],
    "options": [
      {
        "product_sku": "string",
        "option_id": 0,
        "title": "string",
        "type": "string",
        "sort_order": 0,
        "is_require": true,
        "price": 0,
        "price_type": "string",
        "sku": "string",
        "file_extension": "string",
        "max_characters": 0,
        "image_size_x": 0,
        "image_size_y": 0,
        "values": [
          {
            "title": "string",
            "sort_order": 0,
            "price": 0,
            "price_type": "string",
            "sku": "string",
            "option_type_id": 0
          }
        ],
        "extension_attributes": {}
      }
    ],
    "media_gallery_entries": [
      {
        "id": 0,
        "media_type": "string",
        "label": "string",
        "position": 0,
        "disabled": true,
        "types": [
          "string"
        ],
        "file": "string",
        "content": {
          "base64_encoded_data": "string",
          "type": "string",
          "name": "string"
        },
        "extension_attributes": {
          "video_content": {
            "media_type": "string",
            "video_provider": "string",
            "video_url": "string",
            "video_title": "string",
            "video_description": "string",
            "video_metadata": "string"
          }
        }
      }
    ],
    "tier_prices": [
      {
        "customer_group_id": 0,
        "qty": 0,
        "value": 0,
        "extension_attributes": {}
      }
    ],
    "custom_attributes": [
      {
        "attribute_code": "string",
        "value": "string"
      }
    ]
  },
  "saveOptions": true
}


我正在运行的方法:

public void uploadItem(ItemType item) throws UploadException {
    try {
        HttpPost postRequest = new HttpPost("http://my.magento.storefront/index.php/rest/V1/products");
        postRequest.addHeader("Content-Type", "application/json");
        postRequest.addHeader("Authorization", String.format("Bearer %s", authToken));
        String jsonItem = itemToJson(item);
        System.out.println(jsonItem);
        postRequest.setEntity(new StringEntity(jsonItem));
        HttpResponse postResponse = httpClient.execute(postRequest);
        System.out.println();
        System.out.println(EntityUtils.toString(postResponse.getEntity()));
    } catch (ParseException | IOException | JSONException e) {
        e.printStackTrace();
        throw new UploadException(e);
    }
}


private String imagesToJson(ItemType item) throws IOException {
    String imageUrl = "http://my.image.jpeg"; //pulled from item in production
    String encodedImage = null;
    URL url = new URL(imageUrl);
    try(InputStream in = new BufferedInputStream(url.openStream());
            ByteArrayOutputStream out = new ByteArrayOutputStream()) {

            byte[] buf = new byte[512];
            for (int count = in.read(buf); count >= 0; count = in.read(buf)) {
                out.write(buf, 0, count);
            }
            byte[] response = out.toByteArray(); //sane, I tried saving to a file and checking
            encodedImage = Base64.getEncoder().encodeToString(response);
    }

    String picName = item.getItemID() + ".jpg";

    return new JSONArray().put(
            new JSONObject()
                .put("position", 0)
                .put("media_type", "image")
                .put("disabled", "false")
                .put("types", new JSONArray()
                        .put("image")
                        .put("small_image")
                        .put("thumbnail"))
                .put("label", picName)
                .put("content", new JSONObject()
                        .put("base64_encoded_data", encodedImage)
                        .put("type", "image/jpeg")
                        .put("name", picName))
            ).toString();
}


private String itemToJson(ItemType item) throws JSONException, IOException {
    return new JSONObject().put("saveOptions", "true").put("product",
            new JSONObject()
        .put("sku", item.getItemID())
        .put("name", item.getTitle())
        .put("attribute_set_id", 4)
        .put("price", item.getSellingStatus().getCurrentPrice().getValue())
        .put("status", 0)
        .put("visibility", 0)
        .put("type_id", "simple")
        .put("weight", item.getShippingDetails().getCalculatedShippingRate().getWeightMajor().getValue())
        .put("media_gallery_entries", imagesToJson(item)))
    .toString();
}


使用uploadItem(ItemType),将产品上载到目录。但是,商店中没有图像,响应中给了我"media_gallery_entries": [],没有进一步的调试帮助!

我认为我已正确实施了所有操作,因此除了SFTP并手动管理媒体文件夹外,我不确定该做什么。听起来很丑。

让我知道是否有人需要其他信息或省略的方法/字段。

最佳答案

我通过使用Gson而不是org.json解决了这个问题。我认为问题出在我错误地使用了服务器不希望的字符串文字(即布尔值)。

关于java - Java-带图像的Magento2 Rest API产品上传静默失败,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40393578/

10-09 03:20