![](/img/trans.png)
[英]How to send x-www-form-urlencoded in a body of POST request using android annotations and resttemplate
[英]How to send post request with x-www-form-urlencoded body
如何在 java 中發送帶有x-www-form-urlencoded header
的請求。 我不明白如何發送帶有鍵值的正文,如上面的屏幕截圖所示。
我試過這段代碼:
String urlParameters =
cafedra_name+ data_to_send;
URL url;
HttpURLConnection connection = null;
try {
//Create connection
url = new URL(targetURL);
connection = (HttpURLConnection)url.openConnection();
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Type",
"application/x-www-form-urlencoded");
connection.setRequestProperty("Content-Length", "" +
Integer.toString(urlParameters.getBytes().length));
connection.setRequestProperty("Content-Language", "en-US");
connection.setUseCaches (false);
connection.setDoInput(true);
connection.setDoOutput(true);
//Send request
DataOutputStream wr = new DataOutputStream (
connection.getOutputStream ());
wr.writeBytes (urlParameters);
wr.flush ();
wr.close ();
但是在響應中,我沒有收到正確的數據。
當您將application/x-www-form-urlencoded
為內容類型時,發送的數據必須是這種格式。
String urlParameters = "param1=data1¶m2=data2¶m3=data3";
現在發送部分非常簡單。
byte[] postData = urlParameters.getBytes( StandardCharsets.UTF_8 );
int postDataLength = postData.length;
String request = "<Url here>";
URL url = new URL( request );
HttpURLConnection conn= (HttpURLConnection) url.openConnection();
conn.setDoOutput(true);
conn.setInstanceFollowRedirects(false);
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
conn.setRequestProperty("charset", "utf-8");
conn.setRequestProperty("Content-Length", Integer.toString(postDataLength ));
conn.setUseCaches(false);
try(DataOutputStream wr = new DataOutputStream(conn.getOutputStream())) {
wr.write( postData );
}
或者您可以創建一個通用方法來構建application/x-www-form-urlencoded
所需的鍵值模式。
private String getDataString(HashMap<String, String> params) throws UnsupportedEncodingException{
StringBuilder result = new StringBuilder();
boolean first = true;
for(Map.Entry<String, String> entry : params.entrySet()){
if (first)
first = false;
else
result.append("&");
result.append(URLEncoder.encode(entry.getKey(), "UTF-8"));
result.append("=");
result.append(URLEncoder.encode(entry.getValue(), "UTF-8"));
}
return result.toString();
}
對於HttpEntity
,以下答案有效
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
MultiValueMap<String, String> map= new LinkedMultiValueMap<String, String>();
map.add("email", "first.last@example.com");
HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<MultiValueMap<String, String>>(map, headers);
ResponseEntity<String> response = restTemplate.postForEntity( url, request , String.class );
HTTP客戶端是在Java 11中新增的,可以用來通過.network請求HTTP資源。 它支持同步和異步編程模型 HTTP/1.1 和 HTTP/2,將請求和響應主體作為反應流處理,並遵循熟悉的構建器模式。
https://openjdk.java.net/groups.net/httpclient/intro.html
HttpClient client = HttpClient.newHttpClient();;
HttpRequest request = HttpRequest.newBuilder()
.uri(new URI(targetUrl))
.POST(urlParameters)
.headers("Content-Type", "application/x-www-form-urlencoded")
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
string urlParameters = "param1=value1¶m2=value2";
string _endPointName = "your url post api";
var httpWebRequest = (HttpWebRequest)WebRequest.Create(_endPointName);
httpWebRequest.ContentType = "application/x-www-form-urlencoded";
httpWebRequest.Method = "POST";
httpWebRequest.Headers["ContentType"] = "application/x-www-form-urlencoded";
System.Net.ServicePointManager.ServerCertificateValidationCallback +=
(se, cert, chain, sslerror) =>
{
return true;
};
using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
{
streamWriter.Write(urlParameters);
streamWriter.Flush();
streamWriter.Close();
}
var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
{
var result = streamReader.ReadToEnd();
}
基於Navoneel 的回答,我喜歡使用StreamEx 的EntryStream 。
這是重寫的 Naveoneel 方法。
private String getDataString(HashMap<String, String> params)
{
return EntryStream.
of(data).
mapKeys(key -> URLEncoder.encode(key, StandardCharsets.UTF_8)). // Encode the keys
mapValues(value -> URLEncoder.encode(value, StandardCharsets.UTF_8)). // Encode the values
join("="). // Create a key=value
joining("&"); // Assemble into key1=value1&key2=value2...
}
當我從 Postman 發送媒體類型application/x-www-form-urlencoded
的請求時,我遇到了類似的問題,我收到了正確的回復。
但是,在使用代碼發送請求時,我收到的行話有點像:
�-�YO�`:ur���g�
.n��l���u)�i�h3J%Gl�?����k
出於沮喪,連續幾天嘗試了所有可能的解決方案,從更改字符集到更改 header 值再到代碼更改等等。
復制代碼並將其粘貼到 IDE。
就是這樣。
HttpOk參考: https://www.vogella.com/tutorials/JavaLibrary-OkHttp/article.html
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.