2017-11-17 4 views
0

Eclipse에서 HTTPClient를 사용하여 자체 소프트웨어에 POST 요청을 생성합니다. 여기 POST 요청의 매개 변수가 수신 측에서 자동으로 변경됩니다.

내 POST 요청 코드 :

import java.io.IOException; 
import java.io.InputStream; 
import java.util.ArrayList; 
import java.util.List; 

import org.apache.http.HttpEntity; 
import org.apache.http.HttpResponse; 
import org.apache.http.NameValuePair; 
import org.apache.http.auth.AuthenticationException; 
import org.apache.http.auth.UsernamePasswordCredentials; 
import org.apache.http.client.ClientProtocolException; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.entity.UrlEncodedFormEntity; 
import org.apache.http.client.methods.HttpPost; 
import org.apache.http.impl.auth.BasicScheme; 
import org.apache.http.impl.client.HttpClients; 
import org.apache.http.message.BasicNameValuePair; 

public class Posts { 


    public void sendPost() throws ClientProtocolException, IOException, AuthenticationException{ 


    HttpClient httpclient = HttpClients.createDefault(); 
    HttpPost httppost = new HttpPost("http://localhost:8080/zarr-web/command/import/BDP?deltaImport=true"); 

    // Request parameters and other properties. 
    List<NameValuePair> params = new ArrayList<NameValuePair>(2); 
    params.add(new BasicNameValuePair("fileName", "D:\\\\Colibri_workspace\\colibri_trunk\\zarr\\zarr-backend\\servers\\wildfly-8.2.0.Final\\bin\\presentation\\soap_automation\\BANKDIRECTORYPLUS_V3_DAILY_DELTA_20170930.txt")); 

    UsernamePasswordCredentials creds 
    = new UsernamePasswordCredentials("administrator", "administrator"); 

    httppost.setEntity(new UrlEncodedFormEntity(params, "UTF-8")); 
    httppost.addHeader("Content-Type", "text/plain"); 
    httppost.addHeader(new BasicScheme().authenticate(creds, httppost, null)); 

    //Execute and get the response. 
    HttpResponse response = httpclient.execute(httppost); 
    HttpEntity entity = response.getEntity(); 

    if (entity != null) { 
     InputStream instream = entity.getContent(); 
     try { 
      // do something useful 
     } finally { 
      instream.close(); 
     } 
    } 

    } 
} 

하지만 송신 측에 요청을 보낼 때 요청이 "파일 이름"가 반대편에 수신 될 때 올바른 "파일 이름"그러나 전송 :

fileName에 D = % 3A % 5C % 5CColibri_workspace % 5Ccolibri_trunk % 5Czarr % 5Czarr-백엔드 5Cservers % % % 5Cwildfly-8.2.0.Final 5Cbin % 5Cpresentation % 5Csoap_automation % 5CBANKDIRECTORYPLUS_V3_DAILY_DELTA_20170930.txt

012,351,

SOAPUI 소프트웨어를 사용하여 요청을 보내면 파일 이름이 보낸 것과 같습니다. 내가 여기서 뭔가를 놓치고 있니?

도와주세요.

+2

URLEncoder.encode (파일 이름, "UTF-8")를 사용하여 파일 이름을 인코딩합니다. – Satya

+1

여기 파일 이름이 바뀌고 있습니다. 문자가 다른 곳으로 변환되고 있습니다. 참조 용 사이트는 입니다. https://www.obkb.com/dcljr/charstxt.html – Matt

+0

@Satya 작동하지 않습니다. 당신은 당신의 해결책을 자세히 설명해 주시겠습니까 (추신 : 답으로 써주세요). – ITguy

답변

0

예, 보내신 본문이 URL 인코딩됨을 놓쳤습니다. 명시 적으로 그것을했다 :

httppost.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));

나는 UrlEncodedFormEntity 실제 "의 Content-Type은"헤더가 application/x-www-form-urlencoded

당신이 실제로 어떤 종류의 양육하여 서버에 전송을 확인할 수 있습니다 때문에 내기 TCP 모니터 (예 : Tcpmon). 그런 다음 코드가 전송하는 것과 SOAPUI가 수행하는 것을 비교하십시오.

fileName=D:\\Colibri_workspace\colibri_trunk\zarr\zarr-backend\servers\wildfly-8.2.0.Final\bin\presentation\soap_automation\BANKDIRECTORYPLUS_V3_DAILY_DELTA_20170930.txt 

UPD : 먼저 간단한 UrlEncodedFormEntity보다 다른을 시도

URL은 예 값이 보내는 것을 실제로 디코딩. 예 : SringEntity. 당신은 단지 하나 개의 매개 변수가있는 경우 "있는 그대로"당신의 파일 이름 매개 변수를 전달 :

"fileName=D:\\\\Colibri_workspace\\colibri_trunk\\zarr\\zarr-backend\\servers\\wildfly-8.2.0.Final\\bin\\presentation\\soap_automation\\BANKDIRECTORYPLUS_V3_DAILY_DELTA_20170930.txt" 

당신이있는 경우

같은 더 많은 매개 변수를 사용하면 같은 & 문자로 구분해야합니다

{ param1Name} = {param1Value} & {param2Name} = {param2Value} 등등.

값이 & 인 경우 모두 문제가 있음을 명심하십시오.

나는 서버 측 소프트웨어가 좋지 않다고 말할 수 있습니다. 폼의 종류가 필요하지만 (param = value) HTTP 프로토콜을 위반합니다 ...

+0

오늘 멍청한 놈이 되서 죄송합니다. 오늘까지는 POST 요청이 무엇인지 알지 못했습니다. 제 코드에서 바꿀 필요가있는 것을 정확하게 말해 주시겠습니까? – ITguy

+0

첫 번째 간단한 시도는'UrlEncodedFormEntity'가 아닌 것입니다.예 : – Vadim

+0

PLS 응답의 업데이트보기 ... – Vadim

관련 문제