使用 java 客户端的 Azure Web 作业上传
Azure Web Job Upload using java client
上下文历史记录:
我正在尝试 运行 来自 HTTP 客户端的 Web 作业。该文件是一个 ZIP 文件。并包含 java class 和 运行 的 bat 文件,即 java class。这 运行 当我从 POSTMAN 做的时候没问题。但是当我使用 HTTP 客户端时,我总是收到以下错误消息“'---i-NPsGbTVUpaP0CeJxMQVrHoDHvaxo3' 未被识别为内部或外部命令” - 请帮助 – Jagaran 昨天
@Jagaran 如果它仅发生在某些客户身上,则可能无关。请提出一个新问题 – David Ebbo 21 小时前
我在 java 中没有使用任何 HTTP 客户端,它是一样的。它适用于 CURL 或从 Web 控制台加载。下面是我的示例代码 – Jagaran 2 小时前
我在 java 中没有使用任何 HTTP 客户端,它是一样的。它适用于 CURL 或从 Web 控制台加载。
是否有任何基于示例 Java 的 HTTP 客户端,我可以在其中发布 Azure Web 作业?我已经尝试了所有 Java REST 客户端。
可能是我做错了什么。我在 Azure 控制台中收到的错误是“---i-NPsGbTVUpaP0CeJxMQVrHoDHvaxo3”未被识别为内部或外部命令,[08/25/2017 09:30:22 > e7f683: ERR ] 可操作程序或批处理 file.o
我觉得使用 java 时 Content type = applciation /zip 没有正确发生。请帮助我们。
示例代码:
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URL;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import org.apache.http.entity.ContentType;
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;
/**
* @author jagaran.das
*
*/
public class AIPHTTPClient {
/**
* @param args
* @throws IOException
*/
@SuppressWarnings({ "unused", "rawtypes" })
public static void main(String[] args) throws IOException {
try {
URI uri = new AIPHTTPClient().getURI();
HttpResponse<InputStream> jsonResponse = Unirest.put("https://<URL>/api/triggeredwebjobs/TestJOb")
.basicAuth("$AzureWebJobTestBRMS", "XXXXX")
.header("content-disposition","attachement; filename=acvbgth.bat")
.field("file", new FileInputStream(new File(uri))
,ContentType.create("content-type: application/zip"),"AzureWebJob.zip").asBinary();
System.out.println(jsonResponse.getStatusText());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public InputStream readZip() {
ZipFile zipFile = null;
ZipEntry zipEntry = zipFile.getEntry("run.bat");
InputStream stream = null;
/* try {
zipFile = new ZipFile("/Users/jagaran.das/Documents/work/AIP/AzureWebJob.zip");
java.util.Enumeration<? extends ZipEntry> entries = zipFile.entries();
while(entries.hasMoreElements()){
ZipEntry entry = entries.nextElement();
stream = zipFile.getInputStream(entry);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} */
try {
stream = zipFile.getInputStream(zipEntry);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return stream;
}
public URI getURI() throws MalformedURLException {
File file = new File("/Users/jagaran.das/Documents/work/AIP/azure-poc/AzureWebJob.zip");
URI fileUri = file.toURI();
System.out.println("URI:" + fileUri);
URL fileUrl = file.toURI().toURL();
System.out.println("URL:" + fileUrl);
URL fileUrlWithoutSpecialCharacterHandling = file.toURL();
System.out.println("URL (no special character handling):" + fileUrlWithoutSpecialCharacterHandling);
return fileUri;
}
}
在真正尝试之前,我的回答有点太苛刻了。道歉。我现在已经尝试了你的代码片段,看起来你遇到了 Unirest 的问题 - 可能 this one.
我的建议是搬到 Apache's HTTP library。
这是一个工作示例:
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.EntityBuilder;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;
import java.io.File;
public class App
{
public static void main( String[] args )
{
File sourceZipFile = new File("webjob.zip");
String kuduApiUrl = "https://yoursitename.scm.azurewebsites.net/api/zip/site/wwwroot/app_data/jobs/triggered/job988/";
HttpEntity httpEntity = EntityBuilder.create()
.setFile(sourceZipFile)
.build();
CredentialsProvider provider = new BasicCredentialsProvider();
UsernamePasswordCredentials credentials = new UsernamePasswordCredentials(
"$yoursitename", "SiteLevelPasSw0rD"
);
provider.setCredentials(AuthScope.ANY, credentials);
HttpClient client = HttpClientBuilder.create()
.setDefaultCredentialsProvider(provider)
.build();
HttpPut putRequest = new HttpPut(kuduApiUrl);
putRequest.setEntity(httpEntity);
// Kudu's Zip API expects application/zip
putRequest.setHeader("Content-type", "application/zip");
try {
HttpResponse response = client.execute(putRequest);
int statusCode = response.getStatusLine().getStatusCode();
HttpEntity entity = response.getEntity();
String resBody = EntityUtils.toString(entity, "UTF-8");
System.out.println(statusCode);
System.out.println(resBody);
}
catch (Exception e) {
e.printStackTrace();
}
}
}
这就是发送 Content-Type: application/zip
和正文中的原始 zip 内容(没有多部分马粪)。我可能过度设计了样本..但它就是这样。
上传成功并发布WebJob:
很高兴你已经解决了这个问题,我尝试提供一个解决方法供你参考。
部署WebJob到azure,除了使用REST API
,还可以使用FTP
的方式。当然,前提是你需要知道webjob上传的目录KUDU
.
我通过 FTP4J 库为您提供以下代码片段:
import java.io.File;
import it.sauronsoftware.ftp4j.FTPClient;
public class UploadFileByFTP {
private static String hostName = <your host name>;
private static String userName = <user name>;
private static String password = <password>;
public static void main(String[] args) {
try {
// create client
FTPClient client = new FTPClient();
// connect host
client.connect(hostName);
// log in
client.login(userName, password);
// print address
System.out.println(client);
// change directory
client.changeDirectory("/site/wwwroot/App_Data/jobs/continuous");
// current directory
String dir = client.currentDirectory();
System.out.println(dir);
File file = new File("D:/test.zip");
client.upload(file);
} catch (Exception e) {
e.printStackTrace();
}
}
}
您可以按照此tutorial配置您的参数。
上下文历史记录: 我正在尝试 运行 来自 HTTP 客户端的 Web 作业。该文件是一个 ZIP 文件。并包含 java class 和 运行 的 bat 文件,即 java class。这 运行 当我从 POSTMAN 做的时候没问题。但是当我使用 HTTP 客户端时,我总是收到以下错误消息“'---i-NPsGbTVUpaP0CeJxMQVrHoDHvaxo3' 未被识别为内部或外部命令” - 请帮助 – Jagaran 昨天
@Jagaran 如果它仅发生在某些客户身上,则可能无关。请提出一个新问题 – David Ebbo 21 小时前
我在 java 中没有使用任何 HTTP 客户端,它是一样的。它适用于 CURL 或从 Web 控制台加载。下面是我的示例代码 – Jagaran 2 小时前
我在 java 中没有使用任何 HTTP 客户端,它是一样的。它适用于 CURL 或从 Web 控制台加载。
是否有任何基于示例 Java 的 HTTP 客户端,我可以在其中发布 Azure Web 作业?我已经尝试了所有 Java REST 客户端。
可能是我做错了什么。我在 Azure 控制台中收到的错误是“---i-NPsGbTVUpaP0CeJxMQVrHoDHvaxo3”未被识别为内部或外部命令,[08/25/2017 09:30:22 > e7f683: ERR ] 可操作程序或批处理 file.o
我觉得使用 java 时 Content type = applciation /zip 没有正确发生。请帮助我们。 示例代码:
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URL;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import org.apache.http.entity.ContentType;
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;
/**
* @author jagaran.das
*
*/
public class AIPHTTPClient {
/**
* @param args
* @throws IOException
*/
@SuppressWarnings({ "unused", "rawtypes" })
public static void main(String[] args) throws IOException {
try {
URI uri = new AIPHTTPClient().getURI();
HttpResponse<InputStream> jsonResponse = Unirest.put("https://<URL>/api/triggeredwebjobs/TestJOb")
.basicAuth("$AzureWebJobTestBRMS", "XXXXX")
.header("content-disposition","attachement; filename=acvbgth.bat")
.field("file", new FileInputStream(new File(uri))
,ContentType.create("content-type: application/zip"),"AzureWebJob.zip").asBinary();
System.out.println(jsonResponse.getStatusText());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public InputStream readZip() {
ZipFile zipFile = null;
ZipEntry zipEntry = zipFile.getEntry("run.bat");
InputStream stream = null;
/* try {
zipFile = new ZipFile("/Users/jagaran.das/Documents/work/AIP/AzureWebJob.zip");
java.util.Enumeration<? extends ZipEntry> entries = zipFile.entries();
while(entries.hasMoreElements()){
ZipEntry entry = entries.nextElement();
stream = zipFile.getInputStream(entry);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} */
try {
stream = zipFile.getInputStream(zipEntry);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return stream;
}
public URI getURI() throws MalformedURLException {
File file = new File("/Users/jagaran.das/Documents/work/AIP/azure-poc/AzureWebJob.zip");
URI fileUri = file.toURI();
System.out.println("URI:" + fileUri);
URL fileUrl = file.toURI().toURL();
System.out.println("URL:" + fileUrl);
URL fileUrlWithoutSpecialCharacterHandling = file.toURL();
System.out.println("URL (no special character handling):" + fileUrlWithoutSpecialCharacterHandling);
return fileUri;
}
}
在真正尝试之前,我的回答有点太苛刻了。道歉。我现在已经尝试了你的代码片段,看起来你遇到了 Unirest 的问题 - 可能 this one.
我的建议是搬到 Apache's HTTP library。
这是一个工作示例:
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.EntityBuilder;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;
import java.io.File;
public class App
{
public static void main( String[] args )
{
File sourceZipFile = new File("webjob.zip");
String kuduApiUrl = "https://yoursitename.scm.azurewebsites.net/api/zip/site/wwwroot/app_data/jobs/triggered/job988/";
HttpEntity httpEntity = EntityBuilder.create()
.setFile(sourceZipFile)
.build();
CredentialsProvider provider = new BasicCredentialsProvider();
UsernamePasswordCredentials credentials = new UsernamePasswordCredentials(
"$yoursitename", "SiteLevelPasSw0rD"
);
provider.setCredentials(AuthScope.ANY, credentials);
HttpClient client = HttpClientBuilder.create()
.setDefaultCredentialsProvider(provider)
.build();
HttpPut putRequest = new HttpPut(kuduApiUrl);
putRequest.setEntity(httpEntity);
// Kudu's Zip API expects application/zip
putRequest.setHeader("Content-type", "application/zip");
try {
HttpResponse response = client.execute(putRequest);
int statusCode = response.getStatusLine().getStatusCode();
HttpEntity entity = response.getEntity();
String resBody = EntityUtils.toString(entity, "UTF-8");
System.out.println(statusCode);
System.out.println(resBody);
}
catch (Exception e) {
e.printStackTrace();
}
}
}
这就是发送 Content-Type: application/zip
和正文中的原始 zip 内容(没有多部分马粪)。我可能过度设计了样本..但它就是这样。
上传成功并发布WebJob:
很高兴你已经解决了这个问题,我尝试提供一个解决方法供你参考。
部署WebJob到azure,除了使用REST API
,还可以使用FTP
的方式。当然,前提是你需要知道webjob上传的目录KUDU
.
我通过 FTP4J 库为您提供以下代码片段:
import java.io.File;
import it.sauronsoftware.ftp4j.FTPClient;
public class UploadFileByFTP {
private static String hostName = <your host name>;
private static String userName = <user name>;
private static String password = <password>;
public static void main(String[] args) {
try {
// create client
FTPClient client = new FTPClient();
// connect host
client.connect(hostName);
// log in
client.login(userName, password);
// print address
System.out.println(client);
// change directory
client.changeDirectory("/site/wwwroot/App_Data/jobs/continuous");
// current directory
String dir = client.currentDirectory();
System.out.println(dir);
File file = new File("D:/test.zip");
client.upload(file);
} catch (Exception e) {
e.printStackTrace();
}
}
}
您可以按照此tutorial配置您的参数。