2017-11-17 5 views
0

Ich verwende HTTPClient mit Eclipse, um eine POST-Anfrage an unsere eigene Software zu generieren.Parameter in POST-Anfrage ändert sich automatisch auf der Empfängerseite

Hier ist mein POST-Request Code:

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(); 
     } 
    } 

    } 
} 

Aber wenn ich die Anfrage auf der Sendeseite der korrekte „Dateiname“ wird gesendet, jedoch senden, wenn der Antrag auf der anderen Seite empfangen wird, der „Dateiname“ wird :

filename = D% 3A% 5C% 5CColibri_workspace% 5Ccolibri_trunk% 5Czarr% 5Czarr-backend% 5Cservers% 5Cwildfly-8.2.0.Final% 5Cbin% 5Cpresentation% 5Csoap_automation% 5CBANKDIRECTORYPLUS_V3_DAILY_DELTA_20170930.txt

Wenn ich SOAPUI-Software zum Senden der Anfrage verwende, ist der Dateiname der gleiche wie der gesendete. Fehle ich hier etwas?

Bitte helfen.

+2

encode Dateiname using URLEncoder.encode (Dateiname, "UTF-8"); – Satya

+1

Das ist der Grund, warum der Dateiname sich ändert Ihre Zeichen konvertieren zu etwas anderem hier ist eine Website als Referenz https://www.obkb.com/dcljr/charstxt.html – Matt

+0

@Satya es funktioniert nicht. Können Sie bitte Ihre Lösung ausarbeiten (PS: Schreiben Sie es als Antwort). – ITguy

Antwort

0

Ja, Sie haben den Körper vermisst, den Sie senden, ist URL-codiert. Sie haben es ausdrücklich:

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

und ich wette, wegen UrlEncodedFormEntity tatsächlichen „Content-Type“ header application/x-www-form-urlencoded

ist, können Sie überprüfen, was Sie tatsächlich, indem sich jede Art an den Server senden von TCP-Monitor (als Beispiel Tcpmon). Vergleichen Sie dann, was Ihr Code sendet und was SOAPUI tut.

URL decodiert Wert Ihres Beispiel tatsächlich ist, was Sie senden:

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: Erste einfach versuchen, ein anderes machen als UrlEncodedFormEntity. Als Beispiel SringEntity. Wenn Sie nur einen Parameter haben nur Ihre Dateinamen-Parameter übergeben „as is“:

wie

"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" 

, wenn Sie weitere Parameter, die Sie brauchen, um sie durch & Charakter zu trennen, wie:

{ param1Name} = {param1Value} & {param2Name} = {param2Value} und so weiter.

Aber denken Sie daran, wenn Ihr Wert & in allem gebrochen sein wird.

Ich kann nur sagen, dass Ihre serverseitige Software nicht gut ist. Es benötigt Formular Art des Körpers (param = Wert) aber verletzt HTTP-Protokoll ...

+0

Sorry für ein Noob mit diesem, vor heute wusste ich nicht einmal, was POST-Anfrage war. Kannst du mir bitte genau sagen, was ich in meinem Code ändern muss? – ITguy

+0

erste einfache versuchen, eine andere als 'UrlEncodedFormEntity'.Als Beispiel – Vadim

+0

PLS siehe Update in der Antwort ... – Vadim

Verwandte Themen