我使用所謂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