2017-08-10 51 views
5

我正在嘗試在Ruby中爲在此page中觸發的API請求創建一個rest-client請求。 (sourceJavaScript的Blob rest-client API請求Blob

從頁面看JavaScript中,我注意到,有正在創建一個Javascript Blob和JSON的內容附加到,然後在多形式與下面的腳本提交 -

我試着用下面的代碼寶石,其餘的客戶端寶石仿效這一點 -

namespace :materialize do 
    task :connect => :environment do 
    base_uri = "https://imatsandbox.materialise.net/web-api/cartitems/register" 
    request = '{ 
    "cartItems":[ 
    { 
     "toolID":"d65e1eca-7adf-453d-a3bb-eb051fffb567", 
     "MyCartItemReference":"some reference", 
     "modelID":"62352bab-d490-410c-851d-bc62e056e82a", 
     "modelFileName":"", 
     "fileUnits":"mm", 
     "fileScaleFactor":"1", 
     "materialID":"035f4772-da8a-400b-8be4-2dd344b28ddb", 
     "finishID":"bba2bebb-8895-4049-aeb0-ab651cee2597", 
     "quantity":"1", 
     "xDimMm":"12", 
     "yDimMm":"159.94", 
     "zDimMm":"12", 
     "volumeCm3":"2.0", 
     "surfaceCm2":"100.0", 
     "iMatAPIPrice": "25.0", 
     "mySalesPrice": "26.0", 
    } 
    ], 
    "currency":"EUR" 
    }' 
File.open('request', 'wb') do |f| 
    f.write request 
end 


    response = RestClient.post base_uri, {:data => request, headers: {:multipart => true, accept: :json}} 
    puts response.request 
end 
end 

響應正文我總是 -

"{\"error\":{\"message\":\"Wrong request body. Check if all parameters set correctly\",\"code\":401},\"cartItems\":[]}" 

我做錯了什麼?

+0

也許如果我們看到你的服務器'log'是如何使這個'api'請求st我們可以弄清楚你在做什麼錯誤謝謝 –

+0

當然,今天我會爲你解決這個問題。 –

+0

這是我從你的源頁面得到的迴應https://imatsandbox.materialise.net/api/demo/cart-item-creation-api.html我得到了404。爲了幫助你,我需要看到這個迴應[! [https://i.stack.imgur.com/t4nOx.png]](https://i.stack.imgur.com/t4nOx.png) –

回答

2

你得到了401,這意味着你的請求沒有被授權。我認爲你需要通過你的請求憑證。檢查筆記在頁面底部大約經過您註冊的郵件地址來演示API: https://imatsandbox.materialise.net/api/demo/

看起來你需要這樣做:

https://i.materialise.com/web-api/materials?user=<your registered email address here> 
0

我也得到401有時當我使用RestClient.post ,我使用Resource解決。新

res = RestClient::Resource.new("http://www.sample.com/some.json",:headers => {'Content-Type' => "application/json"}) 

res.post(json_data) 
2

要提交json和blob的混合數據,您需要使用mulpipart。

RestClient已經Multipart Implementation

而且您的解決方案看起來如下:

require 'rest-client' 

url = 'https://imatsandbox.materialise.net/web-api/cartitems/register' 
json = '{ 
    "cartItems":[ 
    { 
     "toolID":"d65e1eca-7adf-453d-a3bb-eb051fffb567", 
     "MyCartItemReference":"some reference", 
     "modelID":"62352bab-d490-410c-851d-bc62e056e82a", 
     "modelFileName":"", 
     "fileUnits":"mm", 
     "fileScaleFactor":"1", 
     "materialID":"035f4772-da8a-400b-8be4-2dd344b28ddb", 
     "finishID":"bba2bebb-8895-4049-aeb0-ab651cee2597", 
     "quantity":"1", 
     "xDimMm":"12", 
     "yDimMm":"159.94", 
     "zDimMm":"12", 
     "volumeCm3":"2.0", 
     "surfaceCm2":"100.0", 
     "iMatAPIPrice": "25.0", 
     "mySalesPrice": "26.0", 
    } 
    ], 
    "currency":"EUR" 
}' 

def stringfile(string, filename="file_#{rand 100000}", type=MIME::Types.type_for("json").first.content_type) 
    file = StringIO.new(string) 

    file.instance_variable_set(:@path, filename) 
    def file.path 
    @path 
    end 
    file.instance_variable_set(:@type, type) 
    def file.content_type 
    @type 
    end 

    return file 
end 

response = RestClient.post url, 
    data: stringfile(json), 
    file: [ 
    File.new("./1.png", 'rb') 
    ] 


puts response.body 

response.body結果是:

{ 
"currency": "EUR", 
    "cartItems": [ 
    { 
     "myCartItemReference": "some reference", 
     "cartItemID": "97884fef-d2ae-45e4-a18c-b52b3dcdcb9d", 
     "toolID": "d65e1eca-7adf-453d-a3bb-eb051fffb567", 
     "modelID": "c65278da-8693-4f49-a5c0-8be55a3e63b2", 
     "modelFileName": "The_Club_7plus.obj", 
     "fileUnits": "mm", 
     "fileScaleFactor": 1.0, 
     "materialID": "035f4772-da8a-400b-8be4-2dd344b28ddb", 
     "materialName": "Polyamide", 
     "finishID": "bba2bebb-8895-4049-aeb0-ab651cee2597", 
     "finishName": "Natural-White-Polyamide", 
     "quantity": 1, 
     "xDimMm": 81.2660000000, 
     "yDimMm": 159.9350000000, 
     "zDimMm": 10.0960000000, 
     "volumeCm3": 15.5864000000, 
     "surfaceCm2": 260.2880000000, 
     "iMatAPIPrice": 25.0, 
     "mySalesPrice": 26.0, 
     "mySalesUnitPrice": 26.0, 
     "iMatPrice": 13.61, 
     "validUntil": "2017-09-04T00:00:00+02:00" 
    } 
    ] 
} 

我希望它幫你;)

+0

我試着將上面的代碼複製粘貼到一個rake任務,我仍然得到以下錯誤:/ '{「error」:{「message」:「錯誤的請求主體。檢查所有參數設置是否正確」,「code」:401},「cartItems」:[ }' 你是如何運行上面的代碼,它爲你工作? –

+0

@MichaelVictor我創建了'test.rb'文件,其中粘貼了內容並運行它'ruby test.rb',也就是說。 – itsnikolay

+0

@MichaelVictor現在我收到一個錯誤,讓我檢查 – itsnikolay