用Java解析curl响应

用Java解析curl响应,java,parsing,curl,pattern-matching,exec,Java,Parsing,Curl,Pattern Matching,Exec,在编写类似“为什么不使用Java HTTP客户端,如apache等”的文章之前,我需要您知道原因是SSL。我希望我能,他们很方便,但我不能 没有一个可用的HTTP客户端支持GOST密码套件,而且我一直都遇到握手异常。那些确实支持该套件,但不支持SNI(它们也是专有的)-我返回了一个错误的证书,并且一次又一次地出现握手异常 唯一的解决方案是配置openssl(使用gost引擎)和curl,最后使用Java执行命令 话虽如此,我编写了一个简单的代码片段,用于执行命令和获取输入流响应: public

在编写类似“为什么不使用Java HTTP客户端,如apache等”的文章之前,我需要您知道原因是SSL。我希望我能,他们很方便,但我不能

没有一个可用的HTTP客户端支持GOST密码套件,而且我一直都遇到握手异常。那些确实支持该套件,但不支持SNI(它们也是专有的)-我返回了一个错误的证书,并且一次又一次地出现握手异常

唯一的解决方案是配置openssl(使用gost引擎)和curl,最后使用Java执行命令

话虽如此,我编写了一个简单的代码片段,用于执行命令和获取输入流响应:

public static InputStream executeCurlCommand(String finalCurlCommand) throws IOException 
{
    return Runtime.getRuntime().exec(finalCurlCommand).getInputStream();
}
此外,我可以将返回的IS转换为如下字符串:

public static String convertResponseToString(InputStream isToConvertToString) throws IOException 
{
    StringWriter writer = new StringWriter();
    IOUtils.copy(isToConvertToString, writer, "UTF-8");
    return writer.toString();
}
然而,我看不到一个模式,根据它我可以得到一个好的响应或期望的响应头:

这就是我的意思

执行命令(使用
-i
标志)后,可能会有很多信息,如下面的屏幕所示:

起初,我认为我可以用
'\n'
将其拆分,但问题是,所需响应的头或响应本身可能不满足标准(美化JSON或长重定向URL违反规则)

另外,静态行
GOST引擎已经加载了
有点烦人(但我希望我能够摆脱它,这样的无关信息不会出现)

我相信有一种模式我可以使用

目前我只能这样做:

public static String getLocationRedirectHeaderValue(String curlResponse) 
{
    String locationHeaderValue = curlResponse.substring(curlResponse.indexOf("Location: "));
    locationHeaderValue = locationHeaderValue.substring(0, locationHeaderValue.indexOf("\n")).replace("Location: ", "");
    return locationHeaderValue;
}
这显然不好


提前感谢。

< P>而不是将整个结果作为一个字符串读取,你可能想考虑使用.< /P>逐行阅读它。 然后保留一些状态变量。主要任务是将标题和正文分开。在正文中,您可能有一个要区别对待的有效负载(例如,用于生成JSON对象)

好处是:页眉和正文用一条空行隔开。因此,您的代码应该是这样的:

boolean inHeader=true;
StringBuilder b=新的StringBuilder;
字符串lastLine=“”;
//从技术上讲,你需要多重地图
Map headers=newhashmap();
Scanner Scanner=新扫描仪(您的输入流);
while scanner.hasNextLine(){
字符串行=scanner.nextLine();
if(line.length()==0){
抑制器=假;
}否则{
if(抑制器){
//如果直线以空格开头,则为
//上一页眉的延续
处理头(行,最后一行);
}否则{
b、 追加(行);
b、 appen(System.lineSeparator());
}
}
}
字符串体=b.toString();
在“无HTTP客户端”获取存根=>您需要从外部加载加密。BouncyCastle确实支持GOST。你试过了吗?和