2016-08-08 14 views
0

Ich versuche, 4 Dateien hochzuladen, die als Anforderungshauptteil in einem REST-API-Aufruf über Robot Framework verwendet werden sollen. Ich verwende die Bibliothek Requests, um dies zu erreichen.Hochladen von Dateien mit mehrteiligen/Formulardaten über die REST-API

Ich glaube, ich bin vor ein Problem mit der Einstellung der korrekten MIME-Typ/Grenze, da dies der Fehler, die ausgelöst wird, wenn ich die Datei mit pybot laufen:

{u'errorMessage': u"Couldn't find MIME boundary: ------Bound0901"} 
  1. Ist dies der richtige Weg die MIME-Grenze festlegen?
  2. Kann ich benutzerdefinierte MIME-Grenzen festlegen, wie im unten angegebenen Codebeispiel? Oder muss ich Grenzen setzen, die von der Web-App definiert werden?

Hier ist der Code, den ich dieses erhalten getan bin mit:

Library | RequestsLibrary 

*** TestCases *** 

1. Login 
    Create Session | host | http://10.10.20.20 
    &{headers}= | Create Dictionary | user=scott | password=tiger 
    ${response}= | RequestsLibrary.Get Request | host | /api/login | ${headers} 
    &{headers} Create Dictionary | contentType=multipart/form-data;boundary=----Bound0901 
    ${file1}= | Get Binary File | File1.au 
    ${file2}= | Get Binary File | File2.crs 
    ${file3}= | Get Binary File | File3.cst 
    ${file4}= | Get Binary File | File4.des 

    ${data} | Create Dictionary | ----Bound0901Detail={"Name":"APIContent1","isAICC": true,"version": "1.1","availableOffline": false}----Bound0901${file1}----Bound0901${file2}----Bound0901${file3}----Bound0901${file4}----Bound0901 

    ${response}= | RequestsLibrary.Post Request | host | /api/contentimport | data=${data} | headers=${headers} 

    Log ${response.status_code} 
    Log ${response.json()} 

Antwort

0

Eigentlich Sie versuchen, zwei Dinge,

  1. Hochladen mehrerer Dateien
  2. Senden von Daten/Json entlang mit Dateianhängen

Zum Hochladen von mul Tiple-Dateien

Erstellen Sie ein Wörterbuch mit einem Eintrag pro Datei, mit dem part name als Schlüssel und file content als Wert.

*** Settings *** 
Library RequestsLibrary 

*** TestCases *** 

1. Login 
    Create Session host http://10.10.20.20 
    &{headers}= Create Dictionary user=scott password=tiger 
    ${response}= RequestsLibrary.Get Request host /api/login ${headers} 

    ${fileData1}= Get Binary File File1.au 
    ${fileData2}= Get Binary File File2.crs 
    ${fileData3}= Get Binary File File3.cst 
    ${fileData4}= Get Binary File File4.des 

    &{fileParts}= Create Dictionary 
    Set To Dictionary ${fileParts} file1=${fileData1} 
    Set To Dictionary ${fileParts} file2=${fileData2} 
    Set To Dictionary ${fileParts} file3=${fileData3} 
    Set To Dictionary ${fileParts} file4=${fileData4} 

    ${response}= RequestsLibrary.Post Request host /api/contentimport files=${fileParts} headers=${headers} 

    Log ${response.status_code} 
    Log ${response.json()} 

Um Daten zu senden mehren

hatte ich durch die Python Requests Bibliothek zu graben, um herauszufinden, was für dies zu tun. Für das Senden der Daten in Multipart muss das content-type Attribut als application/json im jeweiligen Multipart gesetzt werden. Um dies zu tun, und um auch das Attribut filename des Multipart zu setzen, muss der Eingabewert eine Liste mit fileName, fileContent und contentType sein.

*** Settings *** 
Library Collections 
Library OperatingSystem 
Library RequestsLibrary 

*** TestCases *** 
Login And Import 
    Create Session host http://10.10.20.20 
    &{headers}= Create Dictionary user=scott password=tiger 
    ${response}= RequestsLibrary.Get Request host /api/login ${headers} 

    &{fileParts}= Create Dictionary 
    Create Multi Part ${fileParts} file1 File1.au 
    Create Multi Part ${fileParts} file2 File2.crs 
    Create Multi Part ${fileParts} file3 File3.cst 
    Create Multi Part ${fileParts} file4 File4.des 

    ${data}= Set Variable {"Name":"APIContent1", "isAICC": true, "version": "1.1", "availableOffline": false} 
    Create Multi Part ${fileParts} Detail data.json contentType=application/json content=${data} 

    ${response}= RequestsLibrary.Post Request host /api/contentimport files=${fileParts} headers=${headers} 

    Log ${response.status_code} 
    Log ${response.json()} 

*** Keywords *** 
Create Multi Part 
    [Arguments] ${addTo} ${partName} ${filePath} ${contentType}=${None} ${content}=${None} 
    ${fileData}= Run Keyword If '''${content}''' != '''${None}''' Set Variable ${content} 
    ...   ELSE Get Binary File ${filePath} 
    ${fileDir} ${fileName}= Split Path ${filePath} 
    ${partData}= Create List ${fileName} ${fileData} ${contentType} 
    Set To Dictionary ${addTo} ${partName}=${partData} 

Resultierende in so etwas wie folgt vor:

POST http://10.10.20.20/api/contentimport HTTP/1.1 
Host: 10.10.20.20 
Connection: keep-alive 
Accept-Encoding: gzip, deflate 
Accept: */* 
User-Agent: python-requests/2.13.0 
user: scott 
password: tiger 
Content-Length: 761 
Content-Type: multipart/form-data; boundary=363f55556da84a4083532ce822b09259 

--363f55556da84a4083532ce822b09259 
Content-Disposition: form-data; name="file1"; filename="File1.au" 

contents of File1 
--363f55556da84a4083532ce822b09259 
Content-Disposition: form-data; name="file2"; filename="File2.crs" 

contents of File2 
--363f55556da84a4083532ce822b09259 
Content-Disposition: form-data; name="file3"; filename="File3.cst" 

contents of File3 
--363f55556da84a4083532ce822b09259 
Content-Disposition: form-data; name="file4"; filename="File4.des" 

contents of File4 
--363f55556da84a4083532ce822b09259 
Content-Disposition: form-data; name="Detail"; filename="data.json" 
Content-Type: application/json 

{"Name":"APIContent1", "isAICC": true, "version": "1.1", "availableOffline": false} 
--363f55556da84a4083532ce822b09259--