2017-05-08 56 views
0

我使用所謂cloudconvert文檔轉換器API。他們沒有官方的java庫,但是有第三方的java選項。我需要一些定製,所以我克隆了github項目並將其添加到我的項目中。我正在發送cloudconvert一個.epub文件並獲得.pdf文件作爲回報。如果我使用默認設置,它沒有問題,並正確地將我的.epub轉換爲.pdf。這是實現它的代碼。如何在java中使用澤西發送嵌套的json POST請求?

這裏是什麼觸發轉換:

// Create service object 
    CloudConvertService service = new CloudConvertService("api-key"); 

    // Create conversion process 
    ConvertProcess process = service.startProcess(convertFrom, convertTo); 

    // Perform conversion 
    //convertFromFile is a File object with a .epub extension 
    process.startConversion(convertFromFile); 

    // Wait for result 
    ProcessStatus status; 
    waitLoop: 
    while (true) { 
     status = process.getStatus(); 
     switch (status.step) { 
      case FINISHED: 
       break waitLoop; 
      case ERROR: 
       throw new RuntimeException(status.message); 
     } 
     // Be gentle 
     Thread.sleep(200); 
    } 
    //Download result 
    service.download(status.output.url, convertToFile); 

    //lean up 
    process.delete(); 

startConversion()電話:

public void startConversion(File file) throws ParseException, FileNotFoundException, IOException { 
    if (!file.exists()) { 
     throw new FileNotFoundException("File not found: " + file); 
    }  
    startConversion(new FileDataBodyPart("file", file));   
} 

調用該實際使用的球衣發送POST請求:

private void startConversion(BodyPart bodyPart) { 
    if (args == null) { 
     throw new IllegalStateException("No conversion arguments set."); 
    } 
    MultiPart multipart = new FormDataMultiPart() 
       .field("input", "upload") 
       .field("outputformat", args.outputformat) 
       .bodyPart(bodyPart); 
    //root is a class level WebTarget object 
    root.request(MediaType.APPLICATION_JSON).post(Entity.entity(multipart, multipart.getMediaType())); 
} 

截至本指出一切正在工作。我的問題是,轉換髮生的時候,返回的.pdf具有非常小的餘量。 cloudconvert提供了一種方法來改變這些利潤率。您可以發送可選的json參數converteroptions並手動設置邊距。我用郵遞員測試了這個,它工作正常,我能夠得到一個格式正確的保證金文件。所以知道這是可能的。下面是我用郵差信息:

@POST : https://host123d1qo.cloudconvert.com/process/WDK9Yq0z1xso6ETgvpVQ 
Headers: 'Content-Type' : 'application/json' 
Body: 
    { 
    "input": "base64", 
    "file": "0AwAAIhMAAAAA", //base64 file string that is much longer than this 
    "outputformat": "pdf", 
    "converteroptions": { 
     "margin_bottom": 75, 
     "margin_top": 75, 
     "margin_right": 50, 
     "margin_left": 50 
    } 
} 

這裏是我在獲得這個職位的要求格式正確的嘗試,我只是不很有經驗的球衣,我沒有找到計算器夫婦的答案沒有工作爲了我。

嘗試1,我嘗試添加JSON字符串作爲Multipart.field。它沒有給我任何錯誤,仍然返回了一個轉換後的.pdf文件,但邊距沒有改變,所以我不能將它發送回來。

private void startConversion(BodyPart bodyPart) { 
    String jsonString = "{\"margin_bottom\":75,\"margin_top\":75,\"margin_right\":50,\"margin_left\":50}"; 
    MultiPart multipart = new FormDataMultiPart() 
        .field("input", "upload") 
        .field("outputformat", args.outputformat) 
        .field("converteroptions", jsonString) 
        .bodyPart(bodyPart); 
    root.request(MediaType.APPLICATION_JSON).post(Entity.entity(multipart, multipart.getMediaType())); 
} 

嘗試2,當我在它郵差工作有人使用「輸入」類型「的base64」,所以我試圖將其更改爲這一點,但它這一次它不返回任何東西,沒有請求錯誤,僅在5分鐘處出現超時錯誤。

//I pass in a File object rather than the bodypart object. 
private void startConversion(File file) { 
    byte[] encoded1 = Base64.getEncoder().encode(FileUtils.readFileToByteArray(file)); 
    String encoded64 = new String(encoded1, StandardCharsets.US_ASCII); 
    String jsonString = "{\"margin_bottom\":75,\"margin_top\":75,\"margin_right\":50,\"margin_left\":50}"; 

    MultiPart multipart = new FormDataMultiPart() 
       .field("input", "base64") 
       .field("outputformat", args.outputformat) 
       .field("file", encoded64) 
       .field("converteroptions", jsonString); 
    root.request(MediaType.APPLICATION_JSON).post(Entity.entity(multipart, multipart.getMediaType())); 
} 

嘗試3,一些googling之後如何正確發送澤西json發佈請求我改變了格式。這次它返回了一個400錯誤的請求錯誤。

private void startConversionPDF(File file) throws IOException { 
    byte[] encoded1 = Base64.getEncoder().encode(FileUtils.readFileToByteArray(file)); 
    String encoded64 = new String(encoded1, StandardCharsets.US_ASCII); 

    String jsonString = "{\"input\":\"base64\",\"file\":\"" + encoded64 + "\",\"outputformat\":\"pdf\",\"converteroptions\":{\"margin_bottom\":75,\"margin_top\":75,\"margin_right\":50,\"margin_left\":50}}"; 
    root.request(MediaType.APPLICATION_JSON).post(Entity.json(jsonString)); 
} 

嘗試4,有人說你不需要手動使用jsonString你應該使用序列化的Java bean。所以我創建了相應的類並提出瞭如下所示的請求。相同的400錯誤請求錯誤。

@XmlRootElement 
public class PDFConvert implements Serializable { 
    private String input; 
    private String file; 
    private String outputformat; 
    private ConverterOptions converteroptions; 
    //with the a default constructor and getters/setters for all 
} 
@XmlRootElement 
public class ConverterOptions implements Serializable { 
    private int margin_bottom; 
    private int margin_top; 
    private int margin_left; 
    private int margin_right; 
    //with the a default constructor and getters/setters for all 
} 

private void startConversionPDF(File file) throws IOException { 
    byte[] encoded1 = Base64.getEncoder().encode(FileUtils.readFileToByteArray(file)); 
    String encoded64 = new String(encoded1, StandardCharsets.US_ASCII); 
    PDFConvert data = new PDFConvert(); 
    data.setInput("base64"); 
    data.setFile(encoded64); 
    data.setOutputformat("pdf"); 
    ConverterOptions converteroptions = new ConverterOptions(); 
    converteroptions.setMargin_top(75); 
    converteroptions.setMargin_bottom(75); 
    converteroptions.setMargin_left(50); 
    converteroptions.setMargin_right(50); 
    data.setConverteroptions(converteroptions); 

    root.request(MediaType.APPLICATION_JSON).post(Entity.json(data)); 
} 

我知道這是文字的相當的牆,但我想顯示所有不同的東西我想,這樣我就不會浪費任何人的時間。感謝您提供幫助或想法,您可能需要完成此項工作。我真的想讓它與球衣一起工作,因爲我有幾個其他的轉換,我做得很完美,他們不需要任何轉換器選項。另外我知道它的可能性,因爲它通過POSTMAN手動運行該過程時起作用。

Cloudconvert api documentation for starting a conversion

Github repo with the recommended 3rd party java library I am using/modifying

回答

0

我終於想通了。試驗和錯誤的時間。這裏是代碼:

private void startConversionPDF(File file) throws IOException { 
    if (args == null) { 
     throw new IllegalStateException("No conversion arguments set."); 
    } 

    PDFConvert data = new PDFConvert(); 
    data.setInput("upload"); 
    data.setOutputformat("pdf"); 
    ConverterOptions converteroptions = new ConverterOptions(); 
    converteroptions.setMargin_top(60); 
    converteroptions.setMargin_bottom(60); 
    converteroptions.setMargin_left(30); 
    converteroptions.setMargin_right(30); 
    data.setConverteroptions(converteroptions); 

    MultiPart multipart = new FormDataMultiPart() 
       .bodyPart(new FormDataBodyPart("json", data, MediaType.APPLICATION_JSON_TYPE)) 
       .bodyPart(new FileDataBodyPart("file", file)); 
    root.request(MediaType.APPLICATION_JSON).post(Entity.entity(multipart, multipart.getMediaType())); 
}