2011-11-09 4 views
0

외부 API를 사용하려면 "="기호없이 값없이 매개 변수를 전달해야합니다. 당신이 첫 번째 매개 변수는 서버에서 호출 할 수있는 방법 (methodName로)의 이름을 볼 수 있으며, 모든 값이 아니다 "="를 가지고 있지 않기 때문에 URL은HttpClient 값이없는 매개 변수를 포함하는 양식 URL

http://example.com/Service/v1/service.ashx?methodName&name=val&blablabla 

입니다. 나는 아래처럼 형성 "오른쪽"방법하지만 순간에 매개 변수를 형성 할 : 연결이 (대신 PARAMS의 정기적 인 변환의) 사용되는 경우

List<NameValuePair> params = new LinkedList<NameValuePair>(); 
    params.add(new BasicNameValuePair("name", "val")); 
    params.add(new BasicNameValuePair("name1", "val1")); 

    String paramString = URLEncodedUtils.format(params, "utf-8"); 

    HttpClient client = new DefaultHttpClient(); 
    HttpGet httpGet = new HttpGet(getEndpointUrl() + "?methodName&" + paramString); 

문제는 마지막 줄에 있습니다. name으로 "methodName"을 params에 추가하고 null을 값으로 사용하면 결과 URL에 "methodName ="이 제공됩니다. 서버는 이러한 표기법을 이해하지 못합니다.

답변

5

수동으로 URL을 형성하는 것이 나을 것 같습니다. 우리는 HttpGet 메서드를 광범위하게 사용하며 URL 문자열을 구성 할 때 매개 변수의 정확성을 보장하기 위해 수동으로 지정합니다.

// Start with your base method name, if necessary/known 
String paramString = "methodName"; 
for (NameValuePair p : params) { 
    String n = p.getName(); 
    String v = p.getValue(); 
    if (v == null) { 
     paramString += "&" + n; 
    } else { 
     paramString += "&" + n + "=" + v; 
    } 
} 

String url = "http://example.com/Service/v1/service.ashx?" + URIUtil.encodeQuery(paramString); 
HttpGet get = new HttpGet(url); 
+0

나는 이렇게 할 필요가 있거나이 해결책을 이고르의 답과 결합해야 할 것 같습니다. – Artemm

+0

BasicNameValuePair를 사용할 때만 문제가 발생하면 좋은 해결책입니다. 어쨌든,이 코드를 일부 HttpServiceRequest에 캡슐화하고 다음과 같이 사용합니다. new HttpServiceRequest (serviceName, params); –

1

HttpClient 소스를 살펴 보는 것이 가장 좋습니다. 처음부터 HttpGet을 서브 클래스 화하고 getRequestLine 메소드를 대체하여 URL을 적절한 방식으로 형식화하는 RequestLine 인터페이스의 구현을 리턴해야하는 것처럼 보입니다.

0

당신은 가짜 값에 넣고 서버에 그것을 확인하지 못했습니다 : 우리는 다음 쿼리 문자열을 인코딩하는 HttpClient를 프로젝트에서 URIUtil를 사용합니다.

params.add(new BasicNameValuePair("methodName", "unused")); 
+0

API는 ** 외부 **이므로 당사자가 관리하지 않습니다. – Artemm

관련 문제