HTTP请求字符串解析

开发物流项目,编写接口的时候,遇到了这样的一个url需要解析,url如下:

http://***/get?$filter=(CreatedOn ge datetime'2016-07-21T00%3A00%3A00') and (SortFlag eq 'A') and(PhoneNo eq '13486391009') and (Execution eq '02' or Execution eq'03')&$top=1&$skip=0&$expand=NavCustomerPurchaseOrder

如果是使用$链接的字符串,可以直接使用spring的参数方式接收

@ResponseBody
@RequestMapping("/get")
public Map getDriverFreightOrder(@RequestParam(value="$filter",required=true) String filter,
@RequestParam(value="$top",required=false) Integer top,
@RequestParam(value="$skip",required=false) Integer skip,
@RequestParam(value="$TorId",required=false) String torId) {

通过这样解析之后,变量都可以获取对应的值,现在的问题就是对filter=(CreatedOn ge datetime'2016-07-21T00%3A00%3A00') and (SortFlag eq 'A') and(PhoneNo eq '13486391009') and (Execution eq '02' or Execution eq'03')这个字符串进行解析

1、当时太忙了,懒得思考,就用了最原始的方法(事实证明写程序懒不得,要有足够充分的思考,不然后面会浪费更多的时间,还会影响)

(按照位置使用indexOf取值)

		String filter = "(CreatedOn ge datetime'2016-07-21T00%3A00%3A00') and (SortFlag eq 'A-A') and (PhoneNo eq '15717177064') and (Execution eq '0-2' or Execution eq '0-3') and (ProcessStatus eq '20' or ProcessStatus eq '1-0' or ProcessStatus eq '3---0')";
		String PhoneNo = null;
		String Execution = null;
		String SortFlag = null;
		String startDateString = null;
		String endDateString = null;
		String tempProcessStatus = null;

		if (filter.contains("PhoneNo eq")) {
			int b = filter.indexOf("PhoneNo eq");
			String tempString = filter.substring(b);
			PhoneNo = tempString.substring(12, 23);
			System.out.println(PhoneNo);
		}



2、后来接口调用的时候出问题了,因为方法一是按照固定长度取值的,比如说PhoneNo eq '13486391009',一点长度发生变化,比如变成PhoneNo eq '134',长度不一致,接口妥妥滴会报错。后来改进了这个方法,示例如下:通过定位左右单引号来定位字符串,就不会出现长度取值错误的情况了。

filter=(CreatedOn ge datetime'2016-07-21T00%3A00%3A00') and (SortFlag eq 'A') and(PhoneNo eq '13486391009') and (Execution eq '02' or Execution eq'03')
String tempString = null;
if (filter.contains("PhoneNo eq")) {
//截取为PhoneNo eq '10000000000001') and (Execution eq '0-2' or Execution eq '0-3')
tempString = filter.substring(filter.indexOf("PhoneNo eq"));
//截取为10000000000001') and (Execution eq '0-2' or Execution eq '0-3')
//tempString = tempString.substring(tempString.indexOf("'")+1);
tempString = tempString.replaceFirst("PhoneNo eq '", "");
//截取为10000000000001
PhoneNo = tempString.substring(0,tempString.indexOf("'"));
System.out.println(PhoneNo);

}
if (filter.contains("Execution eq")) {
tempString = filter.substring(filter.indexOf("Execution eq"));
tempString = tempString.substring(tempString.indexOf("'")+1);
Execution = tempString.substring(0,tempString.indexOf("'"));
System.out.println(Execution);
}
if (filter.contains("SortFlag eq")) {
tempString = filter.substring(filter.indexOf("SortFlag eq"));
tempString = tempString.substring(tempString.indexOf("'")+1);
SortFlag = tempString.substring(0,tempString.indexOf("'"));
System.out.println(SortFlag);
}
if (filter.contains("CreatedOn ge")) {
tempString = filter.substring(filter.indexOf("CreatedOn ge"));
tempString = tempString.substring(tempString.indexOf("'")+1);
startDateString = tempString.substring(0,tempString.indexOf("'"));
System.out.println(startDateString);
startDateString = startDateString.replace("T", " ");
}
if (filter.contains("CreatedOn le")) {
tempString = filter.substring(filter.indexOf("CreatedOn le"));
tempString = tempString.substring(tempString.indexOf("'")+1);
endDateString = tempString.substring(0,tempString.indexOf("'"));
System.out.println(endDateString);
endDateString = endDateString.replace("T", " ");
}


// 对$ProcessStatus的解析
List<String> processStatusList = new ArrayList<String>();
while (filter.contains("ProcessStatus eq")) {
tempString = filter.substring(filter.indexOf("ProcessStatus eq"));
tempString = tempString.substring(tempString.indexOf("'")+1);
tempProcessStatus = tempString.substring(0,tempString.indexOf("'"));
processStatusList.add(tempProcessStatus);
filter = filter.replaceFirst("ProcessStatus eq", " ");
}


3、方法二算是能够满足解决方案,但是结果还是太麻烦了一点,后来同事告知一种方法,使用replace来解决,确实方便了很多。

filter=(CreatedOn ge datetime'2016-07-21T00%3A00%3A00') and (SortFlag eq 'A') and(PhoneNo eq '13486391009') and (Execution eq '02' or Execution eq'03')
String[] list = filter.split(" and ");
List<String> processStatusList = new ArrayList<String>();
for(String tempString:list ){
if (tempString.contains("PhoneNo eq")) {
PhoneNo = tempString.trim().replace("(PhoneNo eq '", "").replace("')", "");
}
if (tempString.contains("Execution eq")) {
Execution = tempString.trim().replace("(Execution eq '", "").replace("')", "").substring(0,2);
}
if (tempString.contains("SortFlag eq")) {
SortFlag = tempString.trim().replace("(SortFlag eq '", "").replace("')", "");
}
if (tempString.contains("CreatedOn ge")) {
System.out.println(tempString);
startDateString = tempString.trim().replace("(CreatedOn ge datetime'", "").replace("')", "");
startDateString = startDateString.replace("T", " ");
}
if (tempString.contains("CreatedOn le")) {
endDateString = tempString.trim().replace("(CreatedOn le datetime'", "").replace("')", "");
endDateString = endDateString.replace("T", " ");
}
while (tempString.contains("ProcessStatus eq")) {
System.out.println(tempString);
int b = tempString.indexOf("ProcessStatus eq");
tempProcessStatus = tempString.substring(b + 18, b + 20);
processStatusList.add(tempProcessStatus);
tempString = tempString.replaceFirst("ProcessStatus eq", " ");
}
}

以下是完整的代码,可以直接运行测试

package com.moty.test;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class Test {
	public static void main(String[] args) {
		String filter = "(CreatedOn ge datetime'2016-07-21T00%3A00%3A00') and (SortFlag eq 'A-A') and (PhoneNo eq '15717177064') and (Execution eq '0-2' or Execution eq '0-3') and (ProcessStatus eq '20' or ProcessStatus eq '1-0' or ProcessStatus eq '3---0')";
		String PhoneNo = null;
		String Execution = null;
		String SortFlag = null;
		String startDateString = null;
		String endDateString = null;
		String tempProcessStatus = null;

		if (filter.contains("PhoneNo eq")) {
			int b = filter.indexOf("PhoneNo eq");
			String tempString = filter.substring(b);
			PhoneNo = tempString.substring(12, 23);
			System.out.println(PhoneNo);
		}

		String[] list = filter.split(" and ");
		List<String> processStatusList = new ArrayList<String>();
		for (String a : list) {
			if (a.contains("PhoneNo eq")) {
				PhoneNo = a.trim().replace("(PhoneNo eq '", "")
						.replace("')", "");
				System.out.println(PhoneNo);
			}
			if (a.contains("Execution eq")) {
				Execution = a.trim().replace("(Execution eq '", "")
						.replace("')", "").substring(0, 3);
				System.out.println(Execution);
			}
			if (a.contains("SortFlag eq")) {
				SortFlag = a.trim().replace("(SortFlag eq '", "")
						.replace("')", "");
				System.out.println(SortFlag);
			}
			if (a.contains("CreatedOn ge")) {
				System.out.println(a);
				startDateString = a.trim()
						.replace("(CreatedOn ge datetime'", "")
						.replace("')", "");
				startDateString = startDateString.replace("T", " ");
				System.out.println(startDateString);
			}
			if (a.contains("CreatedOn le")) {
				endDateString = a.trim()
						.replace("(CreatedOn le  datetime'", "")
						.replace("')", "");
				endDateString = endDateString.replace("T", " ");
				System.out.println(endDateString);
			}
			while (a.contains("ProcessStatus eq")) {
				System.out.println(a);
				int b = a.indexOf("ProcessStatus eq");
				tempProcessStatus = a.substring(b + 18, b + 20);
				processStatusList.add(tempProcessStatus);
				a = a.replaceFirst("ProcessStatus eq", " ");
			}
		}
		// System.out.println(processStatusList.toString());

		// String[] list = filter.split(" and ");
		// List<String> processStatusList = new ArrayList<String>();
		/*
		 * for(String tempString:list ){ if (tempString.contains("PhoneNo eq"))
		 * { PhoneNo = tempString.trim().replace("(PhoneNo eq '",
		 * "").replace("')", ""); } if (tempString.contains("Execution eq")) {
		 * Execution = tempString.trim().replace("(Execution eq '",
		 * "").replace("')", "").substring(0,2); } if
		 * (tempString.contains("SortFlag eq")) { SortFlag =
		 * tempString.trim().replace("(SortFlag eq '", "").replace("')", ""); }
		 * if (tempString.contains("CreatedOn ge")) {
		 * System.out.println(tempString); startDateString =
		 * tempString.trim().replace("(CreatedOn ge datetime'",
		 * "").replace("')", ""); startDateString = startDateString.replace("T",
		 * " "); } if (tempString.contains("CreatedOn le")) { endDateString =
		 * tempString.trim().replace("(CreatedOn le datetime'",
		 * "").replace("')", ""); endDateString = endDateString.replace("T",
		 * " "); } while (tempString.contains("ProcessStatus eq")) {
		 * System.out.println(tempString); int b =
		 * tempString.indexOf("ProcessStatus eq"); tempProcessStatus =
		 * tempString.substring(b + 18, b + 20);
		 * processStatusList.add(tempProcessStatus); tempString =
		 * tempString.replaceFirst("ProcessStatus eq", " "); } }
		 */

		String tempString = null;
		if (filter.contains("PhoneNo eq")) {
			// 截取为PhoneNo eq '10000000000001') and (Execution eq '0-2' or
			// Execution eq '0-3')
			tempString = filter.substring(filter.indexOf("PhoneNo eq"));
			// 截取为10000000000001') and (Execution eq '0-2' or Execution eq
			// '0-3')
			// tempString = tempString.substring(tempString.indexOf("'")+1);
			tempString = tempString.replaceFirst("PhoneNo eq '", "");
			// 截取为10000000000001
			PhoneNo = tempString.substring(0, tempString.indexOf("'"));
			System.out.println(PhoneNo);

		}
		if (filter.contains("Execution eq")) {
			tempString = filter.substring(filter.indexOf("Execution eq"));
			tempString = tempString.substring(tempString.indexOf("'") + 1);
			Execution = tempString.substring(0, tempString.indexOf("'"));
			System.out.println(Execution);
		}
		if (filter.contains("SortFlag eq")) {
			tempString = filter.substring(filter.indexOf("SortFlag eq"));
			tempString = tempString.substring(tempString.indexOf("'") + 1);
			SortFlag = tempString.substring(0, tempString.indexOf("'"));
			System.out.println(SortFlag);
		}
		if (filter.contains("CreatedOn ge")) {
			tempString = filter.substring(filter.indexOf("CreatedOn ge"));
			tempString = tempString.substring(tempString.indexOf("'") + 1);
			startDateString = tempString.substring(0, tempString.indexOf("'"));
			System.out.println(startDateString);
			startDateString = startDateString.replace("T", " ");
		}
		if (filter.contains("CreatedOn le")) {
			tempString = filter.substring(filter.indexOf("CreatedOn le"));
			tempString = tempString.substring(tempString.indexOf("'") + 1);
			endDateString = tempString.substring(0, tempString.indexOf("'"));
			System.out.println(endDateString);
			endDateString = endDateString.replace("T", " ");
		}

		// 对$ProcessStatus的解析
		//List<String> processStatusList = new ArrayList<String>();
		while (filter.contains("ProcessStatus eq")) {
			tempString = filter.substring(filter.indexOf("ProcessStatus eq"));
			tempString = tempString.substring(tempString.indexOf("'") + 1);
			tempProcessStatus = tempString
					.substring(0, tempString.indexOf("'"));
			processStatusList.add(tempProcessStatus);
			filter = filter.replaceFirst("ProcessStatus eq", " ");
		}
		System.out.println(processStatusList.toString());
	}

}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 VB 中处理 HTTP 返回的字符串可以直接使用内置的 WinHttp.WinHttpRequest 类。该类允许发送 HTTP 请求并接收响应,包括响应头和响应正文。 首先需要创建一个 WinHttpRequest 对象: ``` Dim httpRequest As New WinHttp.WinHttpRequest ``` 然后可以使用该对象发送请求并接收响应: ``` httpRequest.Open "GET", "http://example.com", False httpRequest.Send ``` 接收到的响应可以通过以下方式访问: 响应状态: ``` httpRequest.Status ``` 响应头: ``` httpRequest.GetAllResponseHeaders ``` 响应正文: ``` httpRequest.ResponseText ``` 对于响应正文进行进一步处理时,可以使用 VB 中内置的字符串处理函数,如: - InStr:在字符串中查找子字符串。 - Mid:截取给定长度的子字符串。 - Replace:替换字符串中的指定字符或子字符串。 例如,可以使用 InStr 查找字符串中的某个关键词并根据其位置进行处理: ``` Dim keyword As String Dim position As Integer keyword = "example" position = InStr(httpRequest.ResponseText, keyword) If position > 0 Then ' 处理字符串中包含关键词的情况 Else ' 处理字符串中不包含关键词的情况 End If ``` 需要注意的是,在处理 HTTP 返回的字符串时,可能会遇到编码问题。例如,有些响应会使用 Unicode 编码而非 UTF-8 编码。此时可以使用 VB 提供的 Unicode 转换函数将字符串转换为适当的编码,例如: ``` Dim unicodeString As String Dim utf8String As String unicodeString = httpRequest.ResponseText utf8String = StrConv(unicodeString, vbUnicodeToUTF8) ``` ### 回答2: VB语言可以通过多种方法处理从HTTP请求返回的字符串。其中一种方法是使用Inet控件来发送HTTP请求并获取返回的字符串。 首先,需要使用Inet控件的OpenURL方法来发送HTTP请求并获取返回的字符串。此方法使用以下语法: Inet1.OpenURL URL,Method,Data 其中,URL是要请求的URL地址,Method是要使用的HTTP方法(如GET或POST),Data是要在请求中发送的数据(例如表单值)。 在OpenURL方法完成之后,可以使用Inet控件的GetChunk方法来获取返回的字符串。此方法使用以下语法: Inet1.GetChunk(ChunkLength,VarType) 其中,ChunkLength是要获取的数据块的大小,VarType是要返回的数据类型(如字符串或字节数组)。 为了更好地处理HTTP返回字符串,可以使用字符串处理函数和正则表达式。例如,可以使用Split函数将字符串拆分为子字符串,使用Trim函数删除空格,或使用正则表达式搜索匹配模式。VB提供了许多字符串处理和正则表达式函数和类。 在处理HTTP返回字符串时,应该注意处理可能存在的错误和异常情况。可以使用错误处理语句和侦听Inet控件的状态事件来处理错误和异常情况。 综上所述,VB语言可以使用Inet控件来发送HTTP请求并获取返回的字符串,并使用字符串处理函数和正则表达式来处理返回的字符串。在处理HTTP返回字符串时,应该注意处理可能存在的错误和异常情况。 ### 回答3: VB 是一种非常常用的编程语言,它可以方便地处理HTTP返回的字符串。处理HTTP返回的字符串通常需要进行以下三个步骤: 1.获取HTTP返回的字符串:我们可以使用VB自带的WebRequest类或HttpWebRequest类来获取HTTP返回的字符串。这些类提供了一些方法,如GetResponse()或GetResponseStream(),可以让我们获取HTTP返回的字符串。 2.解析HTTP返回的字符串:一旦我们获取了HTTP返回的字符串,我们需要对其进行解析,以便提取所需的数据。VB提供了一些字符串处理函数,如Split()和Substring(),可以用来解析HTTP返回的字符串。 3.处理HTTP返回的结果:一旦我们解析了HTTP返回的字符串,我们可以使用VB的数据结构,如数组和集合,将数据存储在内存中,以便后续的处理。我们还可以使用VB提供的各种库和组件,如ADO.NET,来将数据存储在数据库中,或从数据库中检索数据。 总之,VB处理HTTP返回的字符串是非常方便的。我们只需注意上述三个步骤,并灵活使用VB提供的函数、结构和库,就可以有效地处理HTTP返回的字符串,并从中提取出所需的数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值