2017-08-10 18 views
5

Tôi đang cố gắng tạo yêu cầu khách hàng còn lại trong Ruby cho yêu cầu API được kích hoạt trong page này. (source)Yêu cầu API khách hàng Ruby của Ruby cho Javascript Blob

Từ nhìn vào Javascript trong trang, tôi nhận thấy rằng có một Blob Javascript được tạo ra và nội dung JSON nối vào đó và sau đó đệ trình trong một hình thức nhiều phần dữ liệu với các kịch bản sau đây -

tôi cố gắng bắt chước điều này với các viên ngọc còn lại-client trong ruby ​​với đoạn mã sau -

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 

cơ thể phản ứng tôi luôn luôn nhận được -

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

Tôi đang làm gì sai?

+0

lẽ nếu chúng ta thấy cách máy chủ của bạn 'log' đang thực hiện điều này 'api' reque chúng tôi có thể tìm ra những gì bạn đang làm sai cảm ơn –

+0

Chắc chắn, tôi sẽ nhận được điều đó cho bạn ngày hôm nay. –

+0

đây là phản hồi tôi nhận được từ trang nguồn của bạn https://imatsandbox.materialise.net/api/demo/cart-item-creation-api.html Tôi nhận được 404. Để giúp bạn tôi cần xem câu trả lời này [! [nhập mô tả hình ảnh tại đây] (https://i.stack.imgur.com/t4nOx.png)] (https://i.stack.imgur.com/t4nOx.png) –

Trả lời

2

Bạn nhận được 401, nghĩa là yêu cầu của bạn không được ủy quyền. Tôi nghĩ rằng bạn cần phải vượt qua bằng chứng với yêu cầu của bạn. Kiểm tra các lưu ý ở cuối trang về qua địa chỉ email đăng ký của bạn vào api demo: https://imatsandbox.materialise.net/api/demo/

Hình như bạn cần phải làm điều này:

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

Tôi cũng nhận được 401 đôi khi tôi sử dụng RestClient.post , Tôi giải quyết bằng cách sử dụng Resource.new

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

res.post(json_data) 
2

Để gửi dữ liệu hỗn hợp của json và blob bạn cần sử dụng mulpipart.

RestClient đã có Multipart Implementation

Và giải pháp của bạn sẽ xem xét sau đây:

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 

Kết quả response.body là:

{ 
"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" 
    } 
    ] 
} 

Tôi hy vọng nó giúp bạn;)

+0

Tôi đã thử sao chép dán mã ở trên vào một công việc cào và tôi vẫn nhận được lỗi sau:/ '{" lỗi ": {" nội dung ":" Cơ thể yêu cầu sai. Kiểm tra xem tất cả các thông số đã được đặt chính xác "," mã ": 401}," cartItems ": [] } ' Bạn đã chạy mã trên mà nó hoạt động như thế nào cho bạn? –

+0

@MichaelVictor Tôi đã tạo tệp 'test.rb' với nội dung tôi đã dán và chạy nó 'ruby test.rb', nghĩa là. – itsnikolay

+0

@MichaelVictor bây giờ tôi nhận được một lỗi, hãy để tôi kiểm tra – itsnikolay

Các vấn đề liên quan